我正在研究以下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
都会与[ebp-1]
中用于char
的字节重叠。(