文章目录

  • 第三章
    • 3.58
    • 3.59
    • 3.60
    • 3.61
    • 3.62
    • 3.63
    • 3.64
    • 3.65
    • 3.66
    • 3.67
    • 3.68
    • 3.69
    • 3.70
    • 3.71
    • 3.72
    • 3.73
    • 3.74
    • 3.75

第三章

3.58

#include <stdio.h>
long decode2(long x,long y,long z){long ans=y-z;return (ans*x)^(ans<<63>>63);
}int main(){printf("%d\n",decode2(100,2,2));
}

3.59

原理:

可以看出2128位溢出,因此只需计算后两项即可
即:

store_prod:movq %rdx, %rax             //将y保存在%rax中cqto                        //对y进行符号位扩展,rdx=(-1)y_63movq %rsi, %rcx             //将x保存在%rcx中   sarq $63, %rcx           //将x算数右移63位,得到x符号位,%rcx=(-1)x_63imulq %rax, %rcx             //用y乘x的符号位,得x63yimulq %rsi, %rdx             //用x乘y的符号位,得y63x addq %rdx, %rcx             //将x63y+y63x保存在%rcx中   mulq %rsi                   //无符号数乘法uxuy,此时%rdx保存结果的高64位,%rax保存结果的低64位addq %rcx, %rdx             //将x63y+y63x加到uxuy的高64位上movq %rax, (%rdi)          //保存结果的低64位movq %rdx, 8(%rdi)           //保存结果的高64位ret

3.60

A.x:%rdi,    n:%esi,   result:%rax,   mask:%rdx
B.result=0;    mask=1;
C.mask!=0;
D.mask=mask<<n;
E.result|=(x&mask);
F.//补全代码
#include <stdio.h>
long loop(long x,int n){long result=0;long mask;for(mask=1;mask!=0;mask=mask<<n;){result|=(x&mask);}return result;
}

3.61

#include <stdio.h>
long cread_alt(long *xp) {return (!xp ? 0 : *xp);
}

3.62

typedef enum {MODE_A, MODE_B, MODE_C, MODE_D, MODE_E} mode_t;long switch3(long *p1, long *p2, mode_t action){long result=0;switch (action){case MODE_A:result=*p2;*p2=*p1;break;case MODE_B:*p1=*p1+*p2;result=*p1;break;case MODE_C:*p1=59;result=*p2;break;case MODE_D:*p1=*p2;result=27;break;case MODE_E:result=27;break;default:result=12;break;}return result;
}

3.63

long switch_prob(long x, long n){long result=x;switch (n){case 60:case 62:result=8*x;break;case 63:result=x>>3;break;case 64:result=(x<<4)-x;case 65:result=x*x;default:result=x+0x4B;}return result;
}

3.64

store_ele:leaq (%rsi, %rsi, 2), %rax    // t1 = j*3leaq (%rsi, %rax, 4), %rax    // t1 = j*13movq %rdi, %rsi               // t2 = isalq $6, %rsi                 // t2 = i*64addq %rsi, %rdi               // t3 = i*65addq %rax, %rdi               // t3 = i*65 + j*13addq %rdi, %rdx               // t4 = i*65 + j*13 + kmovq A(,%rdx,8), %rax         // t1 = *(A + 8*t4)movq %rax, (%rcx)             // *dest = t1movl $3640, %eax              // return 3640ret

A. &A[i][j][k] = A+ L (S* T * i + T * j + k)
B. 由题目中可知
S * T = 65 ;
T = 13 ;
8 * S * T * R = 3640
解得R = 7 ; S = 5 ; T = 13

3.65

A. %rdx(由第六行可知,每次j加一个字节,因此%rdx为A[i][j]
B. %rax
C.M=120/8=15

3.66

sum_col:leaq 1(,%rdi,4), %r8        // t1 = n*4 + 1leaq (%rdi,%rdi,2), %rax    // t2 = n*3movq %rax, %rdi             // t3 = n*3testq %rax, %rax            // test n*3jle .L4                     // n*3 <= 0, jump .L4salq $3, %r8                // t1 = t1*8 = 8*(n*4 + 1)leaq (%rsi,%rdx,8), %rcx    // t4 = j*8 + Amovl $0, %eax               // t2 = 0movl $0, %edx               // t5 = 0
.L3:addq (%rcx), %rax           // t2 = *(t4) = *(A + j*8)addq $1, %rdx               // t5 = t5+1addq %r8, %rcx              // t4 = t1+t4 = A + j*8 + 8*(n*4 + 1)cmpq %rdi, %rdx             // cmp t5 & t3jne .L3                     // if t5 != n*3, looprepret
.L4:movl $0, %eax               // return 0ret

NR(n) == n3; NC(n) == n4 + 1

由第十六行jne跳转指令可知,
只有当%rdx等于3时才跳出循坏,因此,NR(n) == n*3;

由第十四行addq指令可知,%r8每次加8*(4n+1),所以每行由4n+1个数,因此,NC(n) == n*4 + 1。

3.67

A.

相对于%rsp的偏移量 储存再栈上的值
%rsp+64 返回地址
%rsp+24 z
%rsp+16 s.p=&z
%rsp+8 y
%rsp x

B.传递的一个新的地址值%rsp+64给process。
C.通过%rsp+偏移量访问。
D.process从%rsp+64开始存储地址,最终回到这个地址,通过&rdi+偏移量来寻址各个元素。
E.调用函数后,%rsp会减8存储返回地址,即此处%rsp+24=调用前%rsp+16

相对于%rsp的偏移量 储存再栈上的值
%rsp+80 z
%rsp+72 x
%rsp+64 y
%rsp+24 z
%rsp+16 s.p=&z
%rsp+8 y
%rsp x

F.像结构体这种无法用一个寄存器存储的参数都是用内存传参,传入时,通过%rsp+偏移量将元素存储在栈上,返回时,通过%rdi+偏移量寻址,将元素返回。

3.68

依据汇编代码及数据对齐规则:

q->t = 8(%rsi),即str2的t从第8位开始,按照8位对齐sizeof(array[B])小于等于8,且下边的t是int类型占4个字节,所以sizeof(array[B])大于4,可以得到4<B<=8。

q->u = 32(%rsi),即str2的u从第32位开始,则s占20个字节,得sizeof(s[A])<=20,且下边的u是long类型占8个字节,所以sizeof(s[A])大于20-8=12,可以得到6<A<=10。

p->y = 184(%rdi),即str1的y从第184位开始,所以184-8<AB4<=184,可以得到44<A*B<=46。

由以上三个约束条件,解得A = 9 B = 5

3.69

A.
由代码第一二行可知,first+a一共占了0x120个字节;0X120的十进制表示为288
由第三四五行可知,&bp->a[i]的地址计算公式为40i+&bp+8;
故int对齐之后占8个字节(而不是int类型4字节),a[i]大小为40;
即CNT=(288-8)/40=7;
B.

typedef struct{long idx;long x[4];
}

由代码第七八行可知ap->x[ap->idx]的地址计算公式为&bp+16+idx*8;
+16说明first和idx共占16个字节,idx是a[i]第一个元素,占8个字节;
movslq将int转成long,说明x是long类型;
则数组x的个数为(40-8)/8=4

3.70

A.
e1.p: 0
e1.y: 8
e2.x: 0
e2.next: 8

B. 16

C. up->e2.x = *(up->e2.next->e1.p) - up->e2.next->e1.y

 mov 8(%rdi), %rax    // rax = up->e2.nextmov (%rax), %rdx    // rdx = up->e2.next->e1.pmov (%rdx), %rdx       // rdx = *(up->e2.next->e1.p)subq 8(%rax), %rdx  // rdx -= up->e2.next->e1.ymov %rdx, (%rdi) // up->e2.x = *(up->e2.next->e1.p) - up->e2.next->e1.y

代码第二行,偏置为8,且数据为指针,所以只能是up->e2.next
第三行偏置为0,且也为指针,所以为up->e2.next->e1.p
第四行,没有偏置,仍然为指针,为 (up->e2.next->e1.p)
于是,减数为
(up->e2.next->e1.p)

第五行,%rax中保存up->e2.next,故8(%rax)为up->e2.next->e1.y
于是,被减数为up->e2.next->e1.y

第六行,结果赋值给e2.x
得等式左侧为up->e2.x

3.71

fgets函数用来从文件中读入字符串。
fgets函数的调用形式如下:fgets(str,n,fp);
此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。

#include <stdio.h>void good_echo(void){const int SIZE = 100;char buf[SIZE];while(1){char* p=fgets(buf,SIZE,stdin);if(p==NULL){break;}printf("%s",p);}return;
}
int main(){good_echo();return 0;
}

3.72

A.s2=s1−[(n∗8+30)&0xFFFFFF0],舍入到最近的16的倍数
若为奇数,则s2=s1−(n∗8+24)
若为偶数,则s2=s1−(n∗8+16)

B.p=(s2+15)&0XFFFFFFF0
确保了p数组的起始地址为16的整数倍
C.

最大 最小
e1=1(此时e2最大等于15) e1=24(此时e2最小等于0)
n为偶数 n为奇数
n%16=1 n%16=0

D.
s2保证了能容纳下8*n字节的最小的16的倍数
p保证了自身对齐16

3.73

#include <stdio.h>
#include <assert.h>typedef enum {NEG, ZERO, POS, OTHER} range_t;range_t find_range(float x) {__asm__("vxorps %xmm1, %xmm1, %xmm1\n\t""vucomiss %xmm1, %xmm0\n\t""jp .P\n\t""ja .A\n\t""jb .B\n\t""je .E\n\t"".A:\n\t""movl $2, %eax\n\t""jmp .Done\n\t"".B:\n\t""movl $0, %eax\n\t""jmp .Done\n\t"".E:\n\t""movl $1, %eax\n\t""jmp .Done\n\t"".P:\n\t""movl $3, %eax\n\t"".Done:\n\t");
}int main(int argc, char* argv[]) {range_t n = NEG, z = ZERO, p = POS, o = OTHER;assert(o == find_range(0.0/0.0));assert(n == find_range(-2.3));assert(z == find_range(0.0));assert(p == find_range(3.33));return 0;
}

3.74

#include <stdio.h>
#include <assert.h>typedef enum {NEG, ZERO, POS, OTHER} range_t;range_t find_range(float x) {__asm__("vxorps %xmm1, %xmm1, %xmm1\n\t""movq $1, %rax\n\t""movq $2, %r8\n\t""movq $0, %r9\n\t""movq $3, %r10\n\t""vucomiss %xmm1, %xmm0\n\t""cmovaq %r8, %rax\n\t""cmovbq %r9, %rax\n\t""cmovpq %r10, %rax\n\t");
}int main(int argc, char* argv[]) {range_t n = NEG, z = ZERO, p = POS, o = OTHER;assert(o == find_range(0.0/0.0));assert(n == find_range(-2.3));assert(z == find_range(0.0));assert(p == find_range(3.33));return 0;
}

3.75

A

n 实部 虚部
1 %xmm0 %xmm1
2 %xmm2 %xmm3
3 %xmm4 %xmm5
n

B
%xmm0是实部,%xmm1是虚部

深入理解计算机系统 csapp 家庭作业(第三章完整版)相关推荐

  1. 《深入理解计算机系统》(原书第三版)家庭作业第三章(3.63)解答

    原题目: **3.63 伪代码分析: x rdi ;n rsi n=n-0x3c(60); if(n>5){-->4005c3 } else{ goto:*(8n+0x4006f8) n= ...

  2. HIT计算机系统CSAPP大作业

    HIT计算机系统CSAPP大作业 摘 要 一.第1章 概述 1.1 Hello简介 ·P2P过程 ·020过程 1.2 环境与工具 1.2.1 硬件环境 1.2.2 软件环境 1.2.3 开发工具 1 ...

  3. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...

    计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...

  4. 《工程伦理》网课1-13章作业单元考核答案完整版

    <工程伦理>网课1-13章作业单元考核答案完整版: 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 第十章 第十一章 第十二章 第十三章

  5. 雷士照明股权连环局(第一 二 三季完整版)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转自:h ...

  6. 雷士照明股权连环局(第一、二、三季完整版)

    转自:http://blog.sina.com.cn/s/blog_4ee9953301014f1o.html [博按]可以毫不夸张地说,本文是目前为止关于雷士变局最为完整.最具深度.最经得起专业拷问 ...

  7. 一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(五) --补遗 (已补充第三部分完整版)...

    一个完整的Installshield安装程序实例-艾泽拉斯之海洋女神出品(五) --补遗 (已补充第三部分完整版) 原文:一个完整的Installshield安装程序实例-艾泽拉斯之海洋女神出品(五) ...

  8. 《深入理解计算机系统(原书第三版)》pdf

    下载地址:网盘下载 内容简介  · · · · · · 和第2版相比,本版内容上*大的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础.主要更新如下: 基于x86-64,大量地重 ...

  9. 深入理解计算机系统(CSAPP) 第二章

    家庭作业 2.57 借助 C++ 模板可以很方便的实现. // g++ -o main main.cc -std=c++11 #include <string> #include < ...

  10. 哈工大计算机系统CSAPP大作业

    计算机系统 大作业 题     目 程序人生-Hello's P2P 专       业 计算机系 学    号 1190202102 班    级 03002 学       生 何洋 指 导 教 ...

最新文章

  1. SpringBoot 【IDEA热部署+浏览器禁用缓存】迅速提升效率
  2. 手把手教你学Vue-3(路由)
  3. php excel文件导出之二 图像导出
  4. Delphi中PCAHR的妙用
  5. 标杆徐2018 Linux自动化运维实战,标杆徐2018 Linux自动化运维系列⑦: SaltStack自动化配置管理实战...
  6. 九问国产操作系统,九大掌门人万字回应!
  7. Language Understanding for TextGames using Deep Reinforcement
  8. 百度地图API画多边型,测面积
  9. 趋势软件卸载去除密码提示
  10. 使用Editplus查看空格
  11. MapGuide open source开发系列教程四: 体系结构(转贴)
  12. Unity3D 《拥挤城市》3D房子建筑透视效果实
  13. 浅析携程智能客服机器人实现
  14. js制作走马灯和选项卡
  15. 微信小程序-001-抽签功能-006-我的抽签-主界面
  16. Java项目:宠物医院预约管理系统设计和实现(java+springboot+mysql+ssm)
  17. java.lang.IllegalStateException: Ambiguous handler methods
  18. nacos启动报错 Unable to start embedded Tomcat 以及项目链接nacos报错 server is DOWN now, please try again later!
  19. 主流mes厂商_国内主流MES厂商排名报告
  20. Faas无服务器架构杂谈

热门文章

  1. 软考中级考试信息系统管理工程师怎么样??
  2. 李一男旗下自游家汽车无法交付车辆 旅程还没开始就将结束
  3. 算法(字符串)——重复的子字符串
  4. 还不重视!脸上有螨虫的几种表现?
  5. ITIL事件管理流程关键知识
  6. netbeans使用教程_IDE:5个最喜欢的NetBeans功能
  7. 腾讯云默认操作系统被安装的软件
  8. 计算机也无法解的函数,XP提示“无法访问函数不正确”怎么办|XP提示“函数不正确”的四种解决方案...
  9. Apache Geronimo 监控
  10. 无人出租车江湖:百度出击,安途并进