打印
[STC单片机]

请问下汇编这样执行后得到是什么值?

[复制链接]
1015|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiangzb520|  楼主 | 2019-5-2 15:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
trimvalue16bit   EQU   030H

MOV  trimvalue16bit ,#00H

MOV     A,#0F1H   
ADD     A,trimvalue16bit+01H
MOV     trimvalue16bit+01H,A
MOV     A,#0FFH
ADDC    A,trimvalue16bit
MOV     trimvalue16bit,A
这里的trimvalue16bit+01H 这样写是什么意思?为什么可以这样写不报错?这几句麻烦帮忙注释下,谢谢各位了
而C语言是这样,利用反汇编得到的汇编trimvalue16bit = trimvalue16bit - 15;,请问下如果理解?

使用特权

评论回复

相关帖子

沙发
资深技术| | 2019-5-2 19:02 | 只看该作者
不报错因为已经定义了 trimvalue16bit = 030H

使用特权

评论回复
板凳
uboot| | 2019-5-3 09:22 | 只看该作者
trimvalue16bit+01H 表示31H地址

使用特权

评论回复
地板
wh6ic| | 2019-5-3 10:49 | 只看该作者
汇编中这个变量的地址定义改为

dseg                 at      0x30
trimvalue16bit   dw    1

也许就好理解了,
这里还有个51汇编的特殊地方,word字变量的低字节它放在后一个字节里。 而一般的编译器中,低字节通常是放在前一个字节的

至于 - 15 是因为加 0xFFF1 溢出,不考虑进位借位,就是 减 15 嘛

使用特权

评论回复
5
linqing171| | 2019-5-4 22:00 | 只看该作者
trimvalue16bit   EQU   030H     ;trimvalue16bit代替0x30地址; 注意这里EQU是宏定义,不是用DB和DW定义的变量

MOV  trimvalue16bit ,#00H      ;把0x30地址写入0x00,注意0x31地址没有填数,可能楼主这里摘录有漏的。如果是keil生成的指令的话,应该是CLR A 然后把A的内容移动到这两个地址。

MOV     A,#0F1H                         ;0xF1放入A
ADD     A,trimvalue16bit+01H       ;A=A+@0x31;     
MOV     trimvalue16bit+01H,A      ;@0x31=A;    加上A的内容后,保存回来。由于keil C51默认大端存储,所以0x31是低位。

MOV     A,#0FFH            
ADDC    A,trimvalue16bit              ; A=A+@0x30+CY   ;其中CY是低位加的进位,ADDC指令和ADD的指令区别就是多了个CY。
MOV     trimvalue16bit,A

x+0-15=x+65536-15=x+65531
加完后如果有进位则丢弃了,如果有进位的话,进位值为0x10000=65536;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

190

帖子

3

粉丝