栈对齐字节
在线或者使用GDB的disassemble查看汇编代码中临时变量分配的空间,发现临时空间大小为16的倍数。这是由 GCC的栈对齐值, -mpreferred-stack-boundary 决定的。
// http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
-mpreferred-stack-boundary=num
Attempt to keep the stack boundary aligned to a 2 raised to byte boundary. If is not specified, the default is 4 (16 bytes or 128 bits). num-mpreferred-stack-boundary
希望栈按照2的n次的字节边界对齐,n的取值范围是2-12。默认情况下,n=4
code
-
ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。(64位机器变为RSP),以下代码中,其偏移量均为16的倍数。
-
EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。(64位机器变为RBP)
修改栈对齐字节
Union的对齐
#include <stdio.h>
#include <iostream>
void printBinary(int num) {
const int size = sizeof(int) * 8; // 获取int类型的位数
for (int i = size - 1; i >= 0; --i) {
int mask = 1 << i; // 创建位掩码,用于逐位检查
int bit = (num & mask) ? 1 : 0; // 获取第i位的值
std::cout << bit;
}
std::cout << std::endl;
}
union un{
int i;
char c[2];
};
int main() {
union un x;
x.c[0]= 10;
x.c[1]= 1;
printf("%d\n",x.i);// 266
printBinary(x.i);// 00000000000000000000000100001010
return 0;
}
CG
- x86汇编orb指令_linux 栈回溯(x86_64 )
- cfi_def_cfa_offset 规范框架偏移量