在 C 中的 CHAR 之后存储 INT 需要 7 个字节而不是 4 个字节
Storing INT after CHAR in C requires 7 bytes instead of 4
我正在查看以下 C 代码段:
char x = 'a';
int y = 5;
在 运行 gdb 之后我遇到了以下程序集:
mov BYTE PTR [ebp-1], 0x61
mov DWORD PTR [ebp-8], 0x5
为什么 ebp
减少了 7 而不是 4?如果我用 int x = 2
替换 char x = 'a'
,我看不到这种行为。
在您的 C 实现中,int
对象必须存储在四的倍数的地址,通常是由于硬件对齐要求或功能。 EBP 寄存器中的地址已知是 4 的倍数(可能是 16 的倍数,具体取决于您的 C 实现)。所以 [ebp-5]
不会是四个字节的倍数,[ebp-6]
或 [ebp-7]
也不会。编译器必须转到 [ebp-8]
才能得到下一个四的倍数。
([ebp-2]
、[ebp-3]
和 [ebp-4]
不被考虑,因为在任何这些地址处开始一个四字节 int
会与 [= 中的字节重叠19=] 用于 char
.)
我正在查看以下 C 代码段:
char x = 'a';
int y = 5;
在 运行 gdb 之后我遇到了以下程序集:
mov BYTE PTR [ebp-1], 0x61
mov DWORD PTR [ebp-8], 0x5
为什么 ebp
减少了 7 而不是 4?如果我用 int x = 2
替换 char x = 'a'
,我看不到这种行为。
在您的 C 实现中,int
对象必须存储在四的倍数的地址,通常是由于硬件对齐要求或功能。 EBP 寄存器中的地址已知是 4 的倍数(可能是 16 的倍数,具体取决于您的 C 实现)。所以 [ebp-5]
不会是四个字节的倍数,[ebp-6]
或 [ebp-7]
也不会。编译器必须转到 [ebp-8]
才能得到下一个四的倍数。
([ebp-2]
、[ebp-3]
和 [ebp-4]
不被考虑,因为在任何这些地址处开始一个四字节 int
会与 [= 中的字节重叠19=] 用于 char
.)