在C中的CHAR之后存储INT需要7个字节而不是4个字节

我正在研究以下 C 代码片段:

char x = 'a';
int y = 5;

运行 gdb 后,我遇到以下程序集:

mov BYTE PTR [ebp-1], 0x61
mov DWORD PTR [ebp-8], 0x5

为什么ebp减少了 7 而不是 4?如果我更换char x = 'a'int x = 2,我没有看到这种行为。

回答

在您的 C 实现中,int对象必须存储在四的倍数的地址,通常是由于硬件对齐要求或功能。已知 EBP 寄存器中的地址是 4 的倍数(可能是 16 的倍数,具体取决于您的 C 实现)。所以[ebp-5]不会是多个四个字节,也不会[ebp-6][ebp-7]。编译器必须转到[ebp-8]下一个四的倍数。

( [ebp-2], [ebp-3], 和[ebp-4]不被考虑,因为int在这些地址中的任何一个开始一个四字节会重叠[ebp-1]用于char.)

  • @thakee nathees:`dword [ebp-4]` 与用于 `char` 的 `byte [ebp-1]` 重叠。

以上是在C中的CHAR之后存储INT需要7个字节而不是4个字节的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>