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。
问题
您偶然发现了和之间的区别。step over
F10step into
F11
当您使用 (默认) 时step over
,call
似乎被忽略。
您需要step into
编写代码,然后调试器将按照您的预期运行。
单步执行
此操作的方式step over
是调试器在下一条指令上设置断点,在那里暂停并再次将断点移动到下一条指令。
Step over
知道(有条件的)跳转并对此进行说明,但忽略(跳过)调用语句;它将 a 解释call
为跳转到另一个子程序并“假设”您希望留在当前上下文中。
这些自动断点是短暂的,不像手动断点会一直存在,直到您取消它们。
Step into
Step into
做同样的事情,但也在每个调用目的地设置一个断点;实际上会带领你深入穿越每个子程序的树林。
跳出
如果您已经“深入”了一个子例程,Visual Studio 允许您使用ShiftF11; 这将带您回到发起呼叫后的下一条指令。
其他一些调试器将此功能命名为“运行直到返回”。
调试高级代码
当调试器处理高级语言源代码(例如 C)时,它为每一行源代码保留一个目标地址列表。它将计划每行源代码的断点。
除了每一行高级代码都转换为零或更多行汇编之外,它的工作方式与单步执行原始汇编代码相同。
归档时间: |
|
查看次数: |
1629 次 |
最近记录: |