gpt4 book ai didi

debugging - 汇编 - 为什么这个 CALL 函数不起作用?

转载 作者:行者123 更新时间:2023-12-01 12:26:10 25 4
gpt4 key购买 nike

我不明白为什么这段代码中的 CALL 函数不起作用:

#include<stdio.h>

void main() {

__asm {

jmp L1

L2:
mov eax, 8
ret

L1:
call L2
}
}

如果我一步一步调试代码,'call L1'这一行没有被处理,程序直接跳到最后。怎么了?我正在使用 Intel 32 位寄存器开发 VisualStudio2015。

最佳答案

问题
您偶然发现了 step over F10 and step into F11. 之间的区别

当您使用(默认)step over 时,call 似乎被忽略了。
您需要单步执行 代码,然后调试器就会按照您的预期运行。

越过
step over 的工作方式是调试器在下一条指令上设置一个断点,在那里暂停并将断点再次移动到下一条指令。
Step over 知道(有条件的)跳转并对此负责,但忽略(steps over)调用语句;它将 call 解释为跳转到另一个子例程,并“假设”您希望留在当前上下文中。
这些自动断点是短暂的,与手动断点不同,手动断点会一直存在,直到您取消它们。

走进
Step into 做同样的事情,但还在每个调用目标处设置一个断点;实际上会带你深入树林,遍历每一个子程序。

走出去
如果您“进入”子程序太深 Visual Studio allows you to step out使用 ShiftF11;这将带你回到发起调用后的下一条指令。
其他一些调试器将此功能命名为“运行直到返回”。

调试高级代码
当调试器处理高级语言源代码(例如 C)时,它会为每一行源代码保留一个目标地址列表。它将计划每行源代码的断点。
除了每一行高级代码都转换为零行或多行汇编之外,它的工作方式与单步执行原始汇编代码相同。

关于debugging - 汇编 - 为什么这个 CALL 函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39351145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com