繁体   English   中英

装配 - 为什么这个CALL功能不起作用?

[英]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 F10step into F11之间的区别

当您使用(默认) step overcall似乎被忽略。
您需要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM