soma 发表于 2024-9-10 09:23:49

现在用汇编语言的不多了吧

liuzonggong 发表于 2024-9-10 09:27:12

newlined 发表于 2024-9-10 09:22
单片机毕竟是本来就是跑机器语言的,如果能彻底搞懂,也不错。

当时为了计算十进制6位数的四则运算,用单片机模拟的方式写的计算程序。一个字节存两个数字,计算的时候一个一个的按照十进制法则写。老费劲了,写了一周。

newlined 发表于 2024-9-10 10:50:46

liuzonggong 发表于 2024-9-10 09:27
当时为了计算十进制6位数的四则运算,用单片机模拟的方式写的计算程序。一个字节存两个数字,计算的时候 ...

6位数的加减乘除,要考虑多少进位啊

zxcv1973 发表于 2024-9-10 11:48:52

21cnsound 发表于 2024-9-9 18:08
8位8051用汇编有的玩,32位8051感觉真心没必要用汇编了:一是32位8051比8位的寄存器和指令复杂太多,二是32 ...

其实32位8051汇编编程比8位8051汇编容易多了,251指令虽多但规律性很强,并且用32位指令再也不用考虑多字节运算了,比如比较32位有符号数是否大于,用251一条指令就行了,你可以用51汇编试试麻烦不麻烦

newlined 发表于 2024-9-10 13:36:45

zxcv1973 发表于 2024-9-10 11:48
其实32位8051汇编编程比8位8051汇编容易多了,251指令虽多但规律性很强,并且用32位指令再也不用考虑多字 ...

看来您对251的指令比较熟悉,您看看访问edata区域100H~0FFFH的方法还有哪几种?谢谢。

zxcv1973 发表于 2024-9-10 14:38:42

newlined 发表于 2024-9-10 13:36
看来您对251的指令比较熟悉,您看看访问edata区域100H~0FFFH的方法还有哪几种?谢谢。 ...

1、直接寻址(可按8位、16位、32位访问),比如MOV R0,EDATA 100H
2、16位寄存器的间接寻址和偏移寻址(可按8位、16位访问),比如MOV R0,@WR4和MOV R0,@WR4+10
3、32位寄存器的间接寻址和偏移寻址(可按8位、16位访问),比如MOV R0,@DR4和MOV R0,@DR4+10
4、堆栈寻址

newlined 发表于 2024-9-10 16:02:09

本帖最后由 newlined 于 2024-9-10 16:05 编辑

zxcv1973 发表于 2024-9-10 14:38
1、直接寻址(可按8位、16位、32位访问),比如MOV R0,EDATA 100H
2、16位寄存器的间接寻址和偏移寻址( ...
zxcv1973老师谢谢您的回复,关于第一条,       想不到可以直接访问100H~0FFFH 的地址,按照这个方法,80H-FFH是不是也可以这样直接访问,比如MOV R0,EDATA 80H?
                                        关于第二、三条,“可按8位、16位访问”是什么意思?按8位访问,语句是什么样的,按16位访问,语句是什么样的?我虽然用汇编,也是照着一 些例程写,并没有彻底领会其中的含义,所以我也想借着这次机会,再进一步学习下。
                                       关于第四条         是不是我想把堆栈定义到100H~0FFFH,是不是可以这样   STACK   EQU    100H   MOV    WR0, #WORD0 STACK   MOV    SPX,WR0       需要使用堆栈时 就可以 PUSH    SPX   或者POP   SPX


zxcv1973 发表于 2024-9-10 16:23:56

newlined 发表于 2024-9-10 16:02
zxcv1973老师谢谢您的回复,关于第一条,       想不到可以直接访问100H~0FFFH 的地址,按照这个方法,80H ...

1、80H-FFH可以这样直接访问,比如MOV R0,EDATA 80H
2、8位指目标操作数为字节寄存器,比如MOV R0,@WR4。16位指目标操作数为字寄存器,比如MOV WR0,@WR4
3、不用再用寄存器倒一下,直接MOV SPX,#STACK即可,并且MOV SPX,WR0也不正确,SPX为双字寄存器,WR0为字寄存器,两者不能直接MOV

newlined 发表于 2024-9-10 16:42:37

zxcv1973 发表于 2024-9-10 16:23
1、80H-FFH可以这样直接访问,比如MOV R0,EDATA 80H
2、8位指目标操作数为字节寄存器,比如MOV R0,@WR4。 ...

好的,谢谢您的回复,我再领会下。

newlined 发表于 2024-9-11 09:24:36

本帖最后由 newlined 于 2024-9-11 14:03 编辑

今天看STC32G手册,在10.2.5中看到:在汇编语言中,内部扩展 RAM(XDATA) 通过 MOVX 指令访问,MOVX A , @DPTR;MOVX @DPTR , A; MOVX A , @Ri;MOVX @Ri , A
有个疑问,DPTR是16位的数据指针,XDATA的地址是01:0000H-7F:FFFFH,即使通过MOVX访问,默认从01:0000H开始访问,那到了后面的高的地址怎么办?难道不是应该用DPX代替DPTR吗?
刚才我写了一个简单的 C程序:unsigned int xdata i; void main() { i=5; }发现在 C251汇编后是这样的 :MOVWR6,#0005; MOVDPTR,#0X0000; MOV@DR56,WR6
请问跟手册上的可以完成相同功能吗?
@众位高手
@zxcv1973




页: 1 [2] 3
查看完整版本: 学习32G的地址分配记录贴