汇编 - 为什么这个CALL功能不起作用?

时间:2016-09-06 14:10:46

标签: debugging assembly call

我不明白为什么此代码中的CALL功能无效:

#include<stdio.h>

void main() {

    __asm {

        jmp L1

        L2:
        mov eax, 8
        ret

        L1:
        call L2
    }
}

如果我一步一步地调试代码,那么就行调用L1&#39;未处理,程序直接跳到最后。怎么了?我正在使用Intel 32位寄存器处理VisualStudio2015。

1 个答案:

答案 0 :(得分:4)

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

之间的区别

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

跳过
这与step over一起使用的方式是调试器在下一条指令上设置一个断点,在那里停止并再次将断点移动到下一条指令。
Step over知道(条件)跳转和帐户,但忽略(跳过)调用语句;它将call解释为跳转到另一个子例程,并假设&#39;你想留在当前的环境中 这些自动断点是短暂的,与手动断点不同,手动断点在您取消它们之前一直存在。

进入
Step into也会这样做,但也会在每个呼叫目的地设置一个断点;实际上,你将深入到每个子程序的树林中。

退出
如果你走得太深,进入&#39;子程序Visual Studio allows you to step out使用 Shift F11 ;这会将您带回原始呼叫后的下一条指令 其他一些调试器命名此功能&#34;运行直到返回&#34;。

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