c - 用gdb反汇编时指针在哪里

标签 c debugging assembly gdb

当我在 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*asize*t 的说明。 如何获取a值和r值的地址?它们真的存在吗?

最佳答案

声明 char*a;size_t r; 本身不执行任何操作;它们宁愿告诉编译器您希望能够使用标识符 ar 来存储值,其生命周期仅限于 main 的持续时间code> 的执行。另一方面,大多数汇编指令(除了 nop 等)做一些事情

如果您在这些变量中存储和访问值,或者获取它们的地址并使用这些地址,其方式并不等同于对它们无所作为,那么您会看到编译器发出代码来腾出空间(通常是通过调整堆栈指针,或将某些寄存器压入堆栈以保存其值,以便有额外的空闲寄存器用于数据)并存储/加载值。

关于c - 用gdb反汇编时指针在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54847692/

相关文章:

python - ctypes - 查看返回结构的 c_char_p 字段

c - 尝试读取我知道存在且正常但无法打开的文件

无法弄清楚C编程

Android Debug Tracing问题

caching - 软件预取是否分配行填充缓冲区(LFB)?

c - 从程序集调用的 C 函数调用 printf 时出现段错误

assembly - 在两个内存地址之间移动

c - 存储大小未知

c++ - 如何在 Linux 上监视多线程 (pthread) C++ 程序的每个线程行为?

java - 使用多个窗口使用 Eclipse 进行调试