assembly - 如果汇编程序中的CALLed代码块中没有return语句怎么办

标签 assembly x86

如果我说“叫”而不是跳怎么办?由于未编写任何return语句,控制权仅传递到下面的下一行,还是在调用后仍返回到该行?

start:
     mov $0, %eax
     jmp two
one:
     mov $1, %eax
two:
     cmp %eax, $1
     call one
     mov $10, %eax

最佳答案

您的直觉是正确的:函数返回后,控件仅传递到下面的下一行。

在您的情况下,在call one之后,您的函数将跳至mov $1, %eax,然后继续下降至cmp %eax, $1,并最终陷入无限循环,就像您再次call one一样。

除了无限循环之外,由于call命令将当前rip(指令指针)写入堆栈,因此函数最终将超出其内存限制。最终,您将溢出堆栈。

关于assembly - 如果汇编程序中的CALLed代码块中没有return语句怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56310131/

相关文章:

c - 为什么 fork 会减慢我的应用程序

assembly - "add esp, 0FFFFFFF8h"序言

assembly - 关于多核CPU的x86 LOCK问题

c++ - 如何读取x86处理器中的中断标志

c - 深入 assembly

assembly - 如何在不使用其他寄存器的情况下镜像一个字节?

c - x86-如何使用内联汇编中的for循环将值插入数组

c - 堆栈分配、填充和对齐

c++ - 哪些C/C++编译器可以使用推式弹出指令创建局部变量,而不仅仅是增加esp一次?

assembly - ARM - 域访问控制寄存器