汇编 - 为什么这个 CALL 函数不起作用?

glc*_*c78 3 debugging assembly call

我不明白为什么这段代码中的 CALL 函数不起作用:

#include<stdio.h>

void main() {

    __asm {

        jmp L1

        L2:
        mov eax, 8
        ret

        L1:
        call L2
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我一步一步调试代码,'call L1'行没有被处理,程序直接跳到最后。怎么了?我正在使用 Intel 32 位寄存器开发 VisualStudio2015。

Joh*_*ica 5

问题
您偶然发现了之间的区别step over F10step into F11

当您使用 (默认) 时step overcall似乎被忽略。
您需要step into编写代码,然后调试器将按照您的预期运行。

单步执行
此操作的方式step over是调试器在下一条指令上设置断点,在那里暂停并再次将断点移动到下一条指令。
Step over知道(有条件的)跳转并对此进行说明,但忽略(跳过)调用语句;它将 a 解释call为跳转到另一个子程序并“假设”您希望留在当前上下文中。
这些自动断点是短暂的,不像手动断点会一直存在,直到您取消它们。

Step into
Step into做同样的事情,但也在每个调用目的地设置一个断点;实际上会带领你深入穿越每个子程序的树林。

跳出
如果您已经“深入”了一个子例程,Visual Studio 允许您使用ShiftF11; 这将带您回到发起呼叫后的下一条指令。
其他一些调试器将此功能命名为“运行直到返回”。

调试高级代码
当调试器处理高级语言源代码(例如 C)时,它为每一行源代码保留一个目标地址列表。它将计划每行源代码的断点。
除了每一行高级代码都转换为零或更多行汇编之外,它的工作方式与单步执行原始汇编代码相同。