解惑一:关于mov指令后面的数据是十进制还是十六进制?AL当中的进位是否影响AH?

发布时间 2023-11-14 22:27:52作者: 七号小行星
  • 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。