为什么这个带内存的 MOV 和 ADD 序列会产生 AX=90FFh?

Why does this sequence of MOV and ADD with memory produce AX=90FFh?

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

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

mov [110h], 80hadd [si], 7Fh这样的指令是不明确的,因为汇编程序不知道你希望它们有多大。您要处理 bytes(1 个字节)还是要处理 words(2 个字节)?

看来emu8086默认选择了字节大小!

地址 110h 处的字节用 80h 填充,后来由产生 FFh 的 7Fh 引发,但随后您开始读取地址 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,留出更多空间来试验指令集...