当我在 gdb 中使用 disas
命令时,代码如下:
int main(){
char*a;
size_t r;
return 1;
}
我有这个结果:
0x080483db <+0>: push %ebp
0x080483dc <+1>: mov %esp,%ebp
0x080483de <+3>: mov $0x1,%eax
0x080483e3 <+8>: pop %ebp
0x080483e4 <+9>: ret
我不明白为什么没有关于 char*a
和 size*t
的说明。
如何获取a
值和r
值的地址?它们真的存在吗?
最佳答案
声明 char*a;
和 size_t r;
本身不执行任何操作;它们宁愿告诉编译器您希望能够使用标识符 a
和 r
来存储值,其生命周期仅限于 main
的持续时间code> 的执行。另一方面,大多数汇编指令(除了 nop 等)做一些事情。
如果您在这些变量中存储和访问值,或者获取它们的地址并使用这些地址,其方式并不等同于对它们无所作为,那么您会看到编译器发出代码来腾出空间(通常是通过调整堆栈指针,或将某些寄存器压入堆栈以保存其值,以便有额外的空闲寄存器用于数据)并存储/加载值。
关于c - 用gdb反汇编时指针在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54847692/