【发布时间】:2016-09-06 14:10:46
【问题描述】:
我不明白为什么这段代码中的 CALL 函数不起作用:
#include<stdio.h>
void main() {
__asm {
jmp L1
L2:
mov eax, 8
ret
L1:
call L2
}
}
如果我一步步调试代码,'call L1'这一行没有被处理,程序直接跳到最后。怎么了?我正在使用 Intel 32 位寄存器开发 VisualStudio2015。
【问题讨论】:
-
调试器经常不能完全理解内联汇编。是否有可能代码正在正确执行但调试器无法正确跟踪它?您可以通过在
jmp L1之前将EAX 设置为8 以外的值,然后在call L2之后检查它的值来找出答案。在您的代码中执行此操作,而不是从调试器中执行此操作。 -
另外,如果您要编写这样的代码,请考虑使用独立的
.asm文件,而不是插入到 C 函数中的“内联汇编”。这不太可能与编译器发生冲突。 (具体来说,如果您使用call,或者在程序集插入中移动堆栈指针,编译器通常会非常非常困惑。) -
还可以查看编译器创建的最终二进制文件的反汇编。分支是去你期望的地方,还是编译器编译错了?
-
您是否有可能只是错误地使用了调试器并使用 F10 来跳过而不是 F11 来进入调用?我想发生了对 L2 的调用,但是您没有进入 L2 函数以逐条执行它。
-
@CodyGray :如果您假设他们使用跨步而不是步入,则可以重现。从 OP 的角度来看,呼叫似乎没有发生(即使发生了)。我认为这正是问题所在。