x64汇编学习(7)-- struct alignment

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 --