CSAPP 第三版 3.69课后习题答案

这道题超级经典 搞懂每个细节才真正明白汇编到底如何实现 C 结构体内存对齐和指针访问的

一、题目描述CSAPP 第三版 3.69课后习题答案_第1张图片CSAPP 第三版 3.69课后习题答案_第2张图片

二、分析求解

  1. 每段C代码与汇编对应
	// rdi = i  rsi = bp
	int 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大小为40
	mov		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 = 7
	
	ap->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*元素大小

参考链接

你可能感兴趣的:(csapp,csapp)