在 Irvine32 中使用像 foo[si] 这样的 16 位地址(在 32 位模式下)?

Jos*_*abi 2 x86 assembly masm memory-address irvine32

由于某种原因,当我调试时它停在mov al,data1[si]并给了我一个异常

第 5 周 0x00D53668 处抛出异常。exe:0xC0000005:读取位置 0x01AA6000 时发生访问冲突。

我可以知道是什么原因吗?

INCLUDE Irvine32.inc

.data

data1 byte "MILK",0
data2 byte 4 dup('*'),0


.code
main proc

mov CX,4
mov si,0


l1: 
mov al,data1[si]  <<EXCEPTION THROWN AT THIS LINE>>

mov data2[si],al
    
inc si  ; before go in the loop l1, cx will auto deduct by 1, then cx==0?
    
loop l1
    
mov EDX, offset data2
call WriteString
    
exit
main endp
end main
Run Code Online (Sandbox Code Playgroud)

zx4*_*485 5

您已标记您的问题,这表明您正在使用 32 位指令,但正在尝试使用 16 位索引寄存器(= SI

mov al,data1[si]
Run Code Online (Sandbox Code Playgroud)

这(几乎)肯定会失败。使用(并之前设置)32 位寄存器,例如ESI

mov al, byte ptr data1[esi]
Run Code Online (Sandbox Code Playgroud)

如果您正在编写 32 位代码,则通常应该使用 32 位寄存器来执行正常的程序流程。16 位的只有在极少数、经过深思熟虑的情况下才会使用。