[关闭]
@ysner 2021-11-14T15:38:30.000000Z 字数 2225 阅读 813

CSAPP第三章作业

CSAPP


3.58

先翻译一个:

  1. long decode2(long x,long y,long z)
  2. {
  3. y-=z;
  4. x*=y;
  5. long t=y;
  6. t=t<<63>>63;
  7. return ans^x;
  8. }

再简化一下QAQ:

  1. long decode2(long x,long y,long z)
  2. {
  3. long t=y-z;
  4. return (t<<63>>63)^(x*t);
  5. }

3.60

A.

x in %rdi
n in %esi
result in %rax
mask in %rdx

B.

  1. result=0
  2. mask=1

C.

  1. mask!=0

D.

  1. mask=mask<<n

E.

  1. result|=(x&mask);

F.

  1. long loop(long x,int n)
  2. {
  3. long result=0;
  4. long mask;
  5. for(mask=1;mask!=0;mask=mask<<n){
  6. result|=(x&mask);
  7. }
  8. return result;
  9. }

3.62

  1. typedef enum {MODE_A,MODE_B,MODE_C,MODE_D,MODE_E} mode_t;
  2. long switch3(long *p1,long *p2,mode_t action)
  3. {
  4. long result=0;
  5. switch(action){
  6. case MODE_A:
  7. result=*p2;
  8. *p2=*p1;
  9. break;
  10. case MODE_B:
  11. result=*p1+*p2;
  12. *p1=result;
  13. break;
  14. case MODE_C:
  15. *p1=59;
  16. result=*p2;
  17. break;
  18. case MODE_D:
  19. *p1=*p2;
  20. case MODE_E:
  21. result=27;
  22. break;
  23. default:
  24. result=12;
  25. break;
  26. }
  27. return result;
  28. }

3.63

  1. long switch_prob(long x,long n){
  2. long result=x;
  3. switch(n){
  4. case 60:
  5. //equal to 62
  6. case 62:
  7. result=8*x;
  8. break;
  9. case 63:
  10. result>>=3;
  11. break;
  12. case 64:
  13. x*=15;
  14. case 65:
  15. x=x*x;
  16. default:
  17. result=x+0x4b;
  18. break;
  19. }
  20. return result;
  21. }

3.64

分析

A问题依葫芦画瓢就好了。
对B问题,
从汇编代码第23行得%rax=13j
从第4567行得%rsi=64i,%rdi=65i+13j
从第8行得%rdx=65i+13j+k
从第9行得%rax=A+8*(65i+13j+k),即S*T=65,T=13
又由第11行得8*R*S*T=3640
联立上三式可得,T=13,S=5,R=7

A.

对D[R][S][T],有

B.

R=7
S=5
T=13

3.65

分析:

从第一句movq可看出,t对应%rcx,a[i][j]对应%rdx;
又显然第二三句就是A[i][j]=A[j][i],故a[j][i]对应%rax。

A.

%rdx

B.

%rax

C.

M=15

3.66

分析

从汇编代码第13行可看出i对应%rdx,继而从15行推出NR(n)对应%rdi。
从第2、3行可得%rdi=%rax=3n,即NR(n)=3n
从第1、7行可得%r8=8*(4n+1),又从第14行可推出%r8应该对应每次循环后对指针增加的值,即一列所占的字节数,故NC(n)=4n+1

解答

NR(n)=3n
NC(n)=4n+1

3.67

A.

栈存储内容 地址编号(取%rsp为编号0)
104-111
96-103
88-95
80-87
72-79
64-71
56-63
48-55
40-47
32-39
z 24-31
&z 16-23
y 8-15
x 0-7

B.

%rsp+64

C.

以%rsp为基准地址,分别偏移8,16,24个字节来访问结构体strA s中的元素。

D.

以传入参数%rdi(即%rsp+64)为基准地址,分别偏移0,8,16个字节来写入结构体strB r中的元素。

E.

栈存储内容 地址编号(取%rsp为编号0)
104-111
96-103
88-95
z 80-87
x 72-79
y 64-71
56-63
48-55
40-47
32-39
z 24-31
&z 16-23
y 8-15
x 0-7

F

发起调用的函数给被调用的函数传递地址和需要的空间大小;被调用的函数存储数据后,返回传入的地址值。

3.72

A.


等价于

为奇数,;若为偶数,

B.


等价于

C.


(1)若为奇数:

不妨令,当取得最小值,当取得最大值。
(2)若为偶数:

不妨令,当取得最小值,当取得最大值。
综上可得,当为偶数且时,取得最小值;当为奇数且时,取得最大值

D.

是数组留出了足够的空间,且是最小的16的倍数。
小问得,的倍数。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注