为什么带有存储器的MOV和ADD序列产生AX = 90FFh?

时间:2019-05-29 20:52:47

标签: assembly x86-16 emu8086

我实际上对MOV AX,[SI]有疑问。我不明白为什么最终的结果是AH=90h AL=FFh

ORG 100h
MOV [110h],80h
MOV SI,110h
ADD [SI], 7Fh
MOV AX, [SI]

1 个答案:

答案 0 :(得分:3)

mov [110h], 80hadd [si], 7Fh之类的指令含糊不清,因为汇编器不知道您希望它们具有什么大小。您要处理字节(1个字节)还是要处理(2个字节)?

显然,emu8086默认选择字节大小!

地址110h的字节填充为80h,随后由7Fh升高,产生FFh,但是随后您开始读取地址110h的整个字。您在AL中收到了正确的总和,并且 AH在地址111h处获得了内存中的所有垃圾

最好始终指定所需的尺寸:

  • 单词

    ORG     100h
    mov     word ptr [0110h], 0080h
    mov     si, 0110h
    add     word ptr [si], 007Fh
    mov     ax, [si]        >>>> AX=01FFh  AH=01h AL=FFh
    
  • 字节

    ORG     100h
    mov     byte ptr [0110h], 80h
    mov     si, 0110h
    add     byte ptr [si], 7Fh
    mov     ax, [si]        >>>> AX=??FFh  AH=??h AL=FFh
    

    在这种情况下,也许使用mov al, [si]更合适。


请注意程序长度。

取决于版本,此小程序有13或14个字节。这意味着它不会在地址110h处运行到内存中。如果是这样,说明将破坏程序,并可能使计算机崩溃。
您可以将数字存储在其他地方以确保安全,例如地址1000h,留出更多空间来尝试使用指令集...