请考虑以下MASM汇编代码段。它是jmp to skip2并且工作得很好。注释掉jmp skip2行,前半部分执行 - 实际上并没有。相反,在VS2015调试模式下,我收到访问冲突错误。我附上了我对堆栈激活记录的解释的excel图。在(1)下是esp和偏移 - 如果你jmp跳过2,这个工作正常。
在(2)下是ebp及其偏移量(我认为),可以说[ebp + 40]和[ebp + 44]应该有效。它没有,我的其他天真的想法(3)也许与pushad,这是从ebp开始的正确的地方。绿色显示pushad指令后的堆栈结果。黄色显示目标,即@I和@k,显然需要取消引用。
我哪里错了?
Exchange PROC
pushad
jmp skip2 ; comment this jmp instruction out and works fine.
push ebp
mov ebp, esp
mov eax, [ebp+44] ; eax gets @k
mov ecx, [eax] ; ecx gets k.
mov ebx, [ebp+40] ; ebx gets @i.
mov edx, [ebx] ; edx gets i.
mov [eax], edx ; k = i.
mov [ebx], ecx ; i = k.
pop ebp ; EDITED: THIS IS THE FIX
jmp ende
skip2:
mov eax, [esp+40] ; eax gets @k
mov ecx, [eax] ; ecx gets k.
mov ebx, [esp+36] ; ebx gets @i.
mov edx, [ebx] ; edx gets i.
mov [eax], edx ; k = i.
mov [ebx], ecx ; i = k.
ende:
popad
ret 8
Exchange ENDP
答案 0 :(得分:0)
正如评论中指出的那样错过了pop ebp ......