这一章读了蛮久,。, 中间又抽了点时间出去玩。 实验的部分,等读完整本书书之后再进行。本章课后习题,网上找不答案也是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%6),但是实际上根据之前的描述只会取(nd)。部分存疑
3.61 此题很简单,只要稍微回顾下之前的知识即可。 代码如下:
movq $0 %rax testq %rsi %rsi je L1 movq (%rsi) %rax .L1: req retz3.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