Last Updated: 2023-10-02 14:19:01 Monday
-- TOC --
本文学习struct结构体在汇编层面是如何表达字节对齐的。测试用C代码如下:
#include <stdio.h>
typedef struct you{
char a;
short int b;
int c;
long d;
} you;
int main(){
you x = {1,2,3,4};
you *y = &x;
int a = y->c;
return 0;
}
struct you默认8bytes对齐,汇编如下:
main:
push rbp
mov rbp, rsp
# char a
# you x
# 它两地址一样
mov BYTE PTR [rbp-32], 1
# short int b
mov WORD PTR [rbp-30], 2
# int c
mov DWORD PTR [rbp-28], 3
# long d, rbp-24 to rbp-16
mov QWORD PTR [rbp-24], 4
# 取you x地址到rax
lea rax, [rbp-32]
# you *y = &x
mov QWORD PTR [rbp-8], rax
mov rax, QWORD PTR [rbp-8]
# y->c 存入 eax
mov eax, DWORD PTR [rax+4]
# int a = eax
mov DWORD PTR [rbp-12], eax
mov eax, 0
pop rbp
ret
主要看看struct内成员的地址分布,以及汇编是如何操作struct的。
下面试试1byte对齐,C代码:
#include <stdio.h>
#pragma pack(1)
typedef struct you{
char a;
short int b;
int c;
long d;
} you;
#pragma pack()
int main(){
you x = {1,2,3,4};
you *y = &x;
int a = y->c;
return 0;
}
汇编:
main:
push rbp
mov rbp, rsp
mov BYTE PTR [rbp-27], 1
mov WORD PTR [rbp-26], 2
mov DWORD PTR [rbp-24], 3
mov QWORD PTR [rbp-20], 4
lea rax, [rbp-27]
mov QWORD PTR [rbp-8], rax
mov rax, QWORD PTR [rbp-8]
mov eax, DWORD PTR [rax+3]
mov DWORD PTR [rbp-12], eax
mov eax, 0
pop rbp
ret
也就节省了点stack空间。
字节对齐可以提高程序执行效率,一般情况下,都默认开启!无需程序员做任何操作。唯一可以注意的一个细节是:在struct内,成员的定义按照从小到大排列,这样既可以保持对齐,还节省了内存。
本文链接:https://cs.pynote.net/hd/asm/202302112/
-- EOF --
-- MORE --