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

Assembly - Why this CALL function doesn't work?

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

#include<stdio.h>

void main() {

    __asm {

        jmp L1

        L2:
        mov eax, 8
        ret

        L1:
        call L2
    }
}

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

问题
您偶然发现了 step over F10 and step into F11.

之间的区别

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

越过
step over 的工作方式是调试器在下一条指令上设置一个断点,在那里暂停并将断点再次移动到下一条指令。
Step over 知道(有条件的)跳转并对此进行说明,但忽略(跳过)调用语句;它将 call 解释为跳转到另一个子例程,并且 'assumes' 你想留在当前上下文中。
这些自动断点是短暂的,与手动断点不同,手动断点会一直存在直到您取消它们。

步入
Step into 做同样的事情,但还在每个调用目标处设置一个断点;实际上会带你深入树林,遍历每一个子程序。

走出去
如果你使用 ShiftF11; 'into' 子程序 Visual Studio allows you to step out 太深了这将带你回到发起呼叫后的下一条指令。
其他一些调试器将此功能命名为 "run until return"。

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