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)
您已标记您的问题x86和irvine32,这表明您正在使用 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 位的只有在极少数、经过深思熟虑的情况下才会使用。