Assembly 为什么MOV和ADD与内存的顺序会产生AX=90FFh?
实际上,我对MOV AX有一个问题,[SI]。我不明白为什么最终结果是Assembly 为什么MOV和ADD与内存的顺序会产生AX=90FFh?,assembly,x86-16,emu8086,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] 像mov[110h]、80h和add[si]、7Fh这样的指令是不明确的,因为汇编程序不知道您希望它们的大小。您想处理字节(1字节)还是处理单词(2字节) 显然,emu8086默认选择字节大小 地址110h处的字节用80h填充,随后由7Fh引发,产生FFh,但随后您开始在地
AH=90h AL=FFh
ORG 100h
MOV [110h],80h
MOV SI,110h
ADD [SI], 7Fh
MOV AX, [SI]
像
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,留出更多的空间来试验指令集…像
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,留出更多空间来试验指令集…请务必提及您使用的汇编程序。只有学会避免不好的东西,我们才能取得成功。一定要提到你使用的汇编程序。只有当我们学会避免坏的事情时,我们才能取得成功。