当前位置: 代码迷 >> 综合 >> CSAPP 第三版 3.69课后习题答案
  详细解决方案

CSAPP 第三版 3.69课后习题答案

热度:17   发布时间:2023-11-13 18:14:28.0

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

一、题目描述在这里插入图片描述在这里插入图片描述

二、分析求解

  1. 每段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*元素大小

参考链接