[英]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
}
}
如果我逐步调试代码,则不会处理“调用L1”行,程序会直接跳到最后。 怎么了? 我正在使用带有Intel 32位寄存器的VisualStudio2015。
问题
你偶然发现了step over
F10和step into
F11之间的区别。
当您使用(默认) step over
, call
似乎被忽略。
您需要step into
代码,然后调试器将按照您的预期运行。
过来
这种step over
工作方式是调试器在下一条指令上设置一个断点,在那里停止并再次将断点移动到下一条指令。
Step over
了解(条件)跳转和帐户,但忽略(步骤)调用语句; 它将一个call
解释为跳转到另一个子例程,并“假定”您希望保持在当前上下文中。
这些自动断点是短暂的,与手动断点不同,手动断点在您取消它们之前一直存在。
踏入
Step into
也是如此,但也在每个呼叫目的地设置一个断点; 实际上,你将深入到每个子程序的树林中。
走出去
如果你已经深入'进入'一个子程序, Visual Studio允许你使用Shift F11 步进 ; 这将带您回到始发呼叫后的下一条指令。
其他一些调试器将此功能命名为“run until return”。
调试高级代码
当调试器处理更高级的语言源代码(例如C)时,它会为每行源代码保留一个目标地址列表。 它将计划每行源代码的断点。
除了每行高级代码转换为零行或多行汇编之外,它的工作原理与逐步执行原始汇编代码相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.