我实际上对MOV AX,[SI]
有疑问。我不明白为什么最终的结果是AH=90h AL=FFh
。
ORG 100h
MOV [110h],80h
MOV SI,110h
ADD [SI], 7Fh
MOV AX, [SI]
答案 0 :(得分:3)
mov [110h], 80h
和add [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,留出更多空间来尝试使用指令集...