这道题超级经典 搞懂每个细节才真正明白汇编到底如何实现 C 结构体内存对齐和指针访问的
一、题目描述
二、分析求解
- 每段C代码与汇编对应
// rdi = i rsi = bpint n = bp->first + bp->last;mov 0x120(%rsi),%ecx // M[rsi+288]代表bp->last add (%rsi),%ecx // first + a[CNT]共占288字节a_struct *ap = &bp->a[i]; // 取a[i]地址 lea (%rdi,%rdi,4),%rax // rax = 5*i lea (%rsi,%rax,8),%rax // rax = 8*5*i + bp a大小为40mov 0x8(%rax),%rdx // rdx = ap->idx = M[8 + rax] = M[8 + 40i + bp] // 说明idx为a第一个成员 8为first偏移 first + a[CNT] = 8 + 40*CNT = 288 CNT = 7ap->x[ap->idx] = n; movslq %ecx,%rcx // 将int n扩展成long n 说明x元素类型为long mov %rcx,0x10(%rax,%rdx,8) // ap->x[ap->idx] = ap + x偏移 + 元素大小*ap->idx = 16 + rax + 8*rdx // 8说明x元素类型为long ap + x偏移 = 16 + rax // 上面分析知道 ap = &ap->idx = rax + 8 x偏移 = 8 = idx x 数组长度 = (40-8)/8 = 4// 答案typedef struct {
long idx;long x[4];} a_struct;// 结论1. b_struct first last 都对齐为8 2. p->a[i] = p + a偏移 + i*元素大小
参考链接