计算堆栈上的帧数

标签 c assembly callstack

首先,我需要编写一个汇编 (Intel IA-32) 函数来返回调用者的帧指针的内容。我认为我做的不对,但我想到的是

pushl %ebp
movl %esp, %ebp
movl %eax, 4(ebp)
leave
ret

但是,我应该在 c 函数中使用它来计算堆栈上的帧数,但我真的完全不确定它应该如何工作。我是否应该跳转到旧 ebp 中的值,然后再次调用该函数?任何指导将不胜感激。

最佳答案

不,您不需要跳到任何地方,但是一旦您将帧指针复制到局部变量,您就可以将其视为链表。

 int mymagicfunction(int a, int b){

     int *c = asm_copy_ebp();
     int *d = c;
     while ( it_makes_sense ) {
           c=*c;
           dump_memory_between(c,d);
           d=c;
     }

也许只有当c和d之间的距离很小的时候才有意义。

关于计算堆栈上的帧数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13256461/

相关文章:

assembly - 为什么 pop 在汇编中需要一个参数?

c - #if defined 函数定义的用法

assembly - 使用 LIB-USB 传输随机字节数时如何修复 "Error -5"?

assembly - x64 - 为什么仍然使用 'call' ?

Node.js - 超出最大调用堆栈大小

java - 获取 Java 堆栈跟踪中涉及的对象

c - 如果输入为高电平,则使用 arduino GPRS SIM900 发送短信 1 次

c - Unix 套接字 : Client stops receiving messages correctly after first message

python - Arduino 和 pySerial 的问题

assembly - ARM编程中有翻译表XLAT指令吗?