这一章读了蛮久,。, 中间又抽了点时间出去玩。
实验的部分,等读完整本书书之后再进行。本章课后习题,网上找不答案也是B了狗了。有几道题目,想了蛮久的。
3.59
x=xh264+xl
y=yh264+xl
xy=264(xhyl+xlyh)+xlyl
所以,
ph=xhyl+xlyh+xlyl/264
pl=xlylMOD264
注意:xh和yh为有符号数,xl和yl则是无符号数
对ph进行化简:
yl=y−y63264,xl=x−x63264
代入后化简为ph=xhy+xyh+xlyl/264
现在解释部分汇编指令的含义:
cqto 对%rax进行符号扩展,符号位存在%rdx之中
指令 4、5获得x的符号位并存在于%rcx之中
指令6 、7和8实现xhyl+xlyh
mulq 单操作数实现了64位整数相乘,其高位存在于%rdx,低位存在于%rax
3.60
此题做出来的结果比较奇怪,不明白后面的代码时如何运行的:
第10行汇编中 salq %cl,%rdx
显然%rdx存了mask,%cl就是%rcx,而%rcx存了n,显然,只取%cl表示对n取模 即mask=mask<<(n%256),但是实际上根据之前的描述只会取(n%64)。部分存疑
3.61
此题很简单,只要稍微回顾下之前的知识即可。
代码如下:
movq $0 %rax
testq %rsi %rsi
je L1
movq (%rsi) %rax
.L1:
req retz
3.62和3.63都是死脑筋,分清楚就好
3.64水题
add(A[i][j][k])=add(A)+sizeof(element)*(i*S*T+j*T+k);
S=5,T=13,R=7
R的计算则根据return sizeof(A)
3.67
懒得画图,
注意在eval过程之中使用了call prcess指令,这意味着压栈命令,%rsp+=8;
唯一的感受就是:谁使用谁分配内存,至于赋值的部分则交给了子程序。
3.68
这里涉及到对齐的问题,
第二条指令,不见得B=8,其实只需要B>4由于对齐的问题,就会空出相应的空间。显然,根据short s[A],A占据了剩余的20Byte
而第4条指令,则暗指int x[A][B]的空间大小为184Byte。 但是这部绝对,因为如果x占了180Byte, 则会空出4Byte来对齐 long y;
8>=B>4
10>=A>8
46>=AB>=45
显然B=5,A=9;
3.69
没做出来,懒得再分析了 有空回来二刷习题的时候慢慢研究(。,。)
3.70
这题感觉是非常简单的。
算一算,显然只需要16Byte即可。
第二条指令 movq 8(%rsi) %rax 访问指针 %rax=M(up+8)=up->next
第三条指令 %rdx=*(up->next)=up->next->p;
第四条指令 %rdx=*p;
所以
up->x=*(up->next->p)-up->next->y
本文主要讨论了CSAPP第三章的课后习题,包括3.59到3.70题目的解答和理解。涉及符号扩展、整数乘法、内存对齐、指针运算等概念。在部分题目中,作者提到了汇编指令的应用和分析,以及对代码运行的疑惑和思考。
661

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



