Assembly 为什么堆栈上的地址要长8字节?

Assembly 为什么堆栈上的地址要长8字节?,assembly,x86-64,disassembly,callstack,stack-frame,Assembly,X86 64,Disassembly,Callstack,Stack Frame,这里有一个mov指令: 0040064e 89 7d dc MOV dword ptr [RBP + local_2c],EDI EDI从主功能存储argc。我想通过查看rbp-0x2c来检查它的值: (gdb) x/x $rbp-0x2C 0x7ffffffee1c4: 0x00000000 正如你所看到的,那里什么都没有。问题是-argc值比实际值多8个字节: (gdb) x/x $rbp-0x2C+0x8 0x7ffffffee1cc: 0x

这里有一个mov指令:

        0040064e 89 7d dc        MOV        dword ptr [RBP + local_2c],EDI
EDI从主功能存储argc。我想通过查看rbp-0x2c来检查它的值:

(gdb) x/x $rbp-0x2C
0x7ffffffee1c4: 0x00000000
正如你所看到的,那里什么都没有。问题是-argc值比实际值多8个字节:

(gdb) x/x $rbp-0x2C+0x8
0x7ffffffee1cc: 0x00000002

我的问题是-为什么会发生这种情况?

嗯,您发布的机器代码与
MOV dword ptr[RBP-0x2c],EDI
不对应。它对应于
MOV dword ptr[RBP-0x24],EDI
。您可以通过查看
disp8
字节看到这一点,该字节的值为
0xDC
,即-0x24。读取我认为它位于堆栈帧顶部(返回地址)下方的0x2c,它位于RBP+8。@SzabolcsDombi:调用约定文档没有说明函数应该在其自身堆栈框架内的何处溢出其寄存器参数。这甚至不是正确的调用约定:对于EDI中的第一个arg,这是x86-64 System V调用约定,用于除Windows以外的所有设备。无论如何,问题是OP的反汇编程序使用的命名方案,而不是调用约定。您要问的是,当反汇编程序在指令中使用的偏移量是
-0x24
时,为什么反汇编程序打印
+local_2c
?嗯,您发布的机器代码与
MOV dword ptr[RBP-0x2c],EDI
不对应。它对应于
MOV dword ptr[RBP-0x24],EDI
。您可以通过查看
disp8
字节看到这一点,该字节的值为
0xDC
,即-0x24。读取我认为它位于堆栈帧顶部(返回地址)下方的0x2c,它位于RBP+8。@SzabolcsDombi:调用约定文档没有说明函数应该在其自身堆栈框架内的何处溢出其寄存器参数。这甚至不是正确的调用约定:对于EDI中的第一个arg,这是x86-64 System V调用约定,用于除Windows以外的所有设备。无论如何,问题是OP的反汇编程序使用的命名方案,而不是调用约定。您要问的是,当反汇编程序在指令中使用的偏移量为
-0x24
时,为什么反汇编程序打印
+local_2c