C代码
#include <stdio.h>
typedef struct S {
short a;
int b;
long c;
long d;
long e;
long f;
long g;
long h;
short i;
} S;
void foo(S s) {
printf("%hd, %d, %ld, %ld, %ld, %ld, %ld, %ld, %hd\n",
s.a, s.b, s.c, s.d, s.e, s.f, s.g, s.h, s.i);
}
int main() {
S s = {1, 2, 3, 4, 5, 6, 7, 8, 9};
foo(s);
printf("%ld\n", sizeof(short));
}
gcc -S -g test.c 生成的汇编代码
.file "test_align.c"
.text
.Ltext0:
.section .rodata
.align 8
.LC0:
.string "%hd, %d, %ld, %ld, %ld, %ld, %ld, %ld, %hd\n"
.text
.globl foo
.type foo, @function
foo:
.LFB0:
.file 1 "test_align.c"
.loc 1 14 0
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
.loc 1 17 0
movzwl 72(%rbp), %eax
.loc 1 16 0
movswl %ax, %r9d
movq 64(%rbp), %r8
movq 56(%rbp), %rdi
movq 48(%rbp), %rsi
movq 40(%rbp),

本文深入探讨了C语言中数据对齐和参数传递的原理,通过分析生成的汇编代码,揭示了底层的内存布局和调用约定,帮助读者理解这些关键概念。
最低0.47元/天 解锁文章
1262

被折叠的 条评论
为什么被折叠?



