交换通过引用传递的两个变量将不合作

时间:2016-05-19 17:39:39

标签: assembly x86 masm

请考虑以下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

enter image description here

1 个答案:

答案 0 :(得分:0)

正如评论中指出的那样错过了pop ebp ......