为什么这个带内存的 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], 80h
和add [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,留出更多空间来试验指令集...
我实际上对 MOV AX,[SI]
有疑问。不明白为什么最后的结果是AH=90h AL=FFh
。
ORG 100h
MOV [110h],80h
MOV SI,110h
ADD [SI], 7Fh
MOV AX, [SI]
像mov [110h], 80h
和add [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,留出更多空间来试验指令集...