-
Part 1
在看《汇编语言》的时候,书上写了差不多这样意思的一段话(我用自己的话概述一下):
当指令使用了寄存器AL或者AH,这条指令会认为AL和AH是两个不相关的寄存器,此时AL是作为一个独立的八位寄存器。不要错误地认为,诸如add al,85H add al,93H的指令产生的进位会存储在AH中。
然后我就去debug里面试了一下,以为debug会自动检测到数据溢出而报错(如下图,a命令下的add al,100)
我一直以为,我输入的add al,100当中的100是十进制,于是我试验了一下,如下图,发现在debug当中,立即数默认为十六进制,而且不能加H\h,否则会报错,所以上面100被识别为100h,超出了八位可以表示的数,指令要求操作数的位数要一致才正确。
在MASM编译器中尝试了一下立即数加h和不加h表示是什么进制的数,如下图所示,在MASM编译器中,加了h会识别为十六进制数,不加h会识别为十进制数。
-
Part 2
于是,我在MASM中尝试AL进位会不会影响AH的试验,如下图,al=12h+64h(100)+C8(200)=(1)3EH,进位被舍弃,且并未影响AH的值。
同理Debug,al=10h+99h+99h=(1)42h,al的进位溢出丢弃,不影响ah。
总结一下:
- 在Debug程序中,立即数默认为十六进制数,不能加后缀。
- 在MASM编译器中,立即数不加后缀,认为是十进制数,加了后缀则根据后缀表示的进制来参与指令,例如后缀h为十六进制,后缀b为二进制(刚才试了一下,就不放图了)。
- al在指令中作为一个独立的八位寄存器,进位不影响其他寄存器,如AH。
标签:十六进制,AH,AL,al,mov,指令,进位 From: https://www.cnblogs.com/7-lris/p/17832750.html