我不明白为什么此代码中的CALL功能无效:
#include<stdio.h>
void main() {
__asm {
jmp L1
L2:
mov eax, 8
ret
L1:
call L2
}
}
如果我一步一步地调试代码,那么就行调用L1&#39;未处理,程序直接跳到最后。怎么了?我正在使用Intel 32位寄存器处理VisualStudio2015。
答案 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)时,它为每行源代码保留一个目标地址列表。它将计划每行源代码的断点
除了每行高级代码转换为零行或多行汇编之外,它的工作原理与逐步执行原始汇编代码相同。