Assembly 为什么MOV和ADD与内存的顺序会产生AX=90FFh?

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,但随后您开始在地

实际上,我对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,但随后您开始在地址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,留出更多空间来试验指令集…

请务必提及您使用的汇编程序。只有学会避免不好的东西,我们才能取得成功。一定要提到你使用的汇编程序。只有当我们学会避免坏的事情时,我们才能取得成功。