@ysner
2021-11-14T15:38:30.000000Z
字数 2225
阅读 1708
CSAPP
先翻译一个:
long decode2(long x,long y,long z){y-=z;x*=y;long t=y;t=t<<63>>63;return ans^x;}
再简化一下QAQ:
long decode2(long x,long y,long z){long t=y-z;return (t<<63>>63)^(x*t);}
x in %rdi
n in %esi
result in %rax
mask in %rdx
result=0mask=1
mask!=0
mask=mask<<n
result|=(x&mask);
long loop(long x,int n){long result=0;long mask;for(mask=1;mask!=0;mask=mask<<n){result|=(x&mask);}return result;}
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:result=*p1+*p2;*p1=result;break;case MODE_C:*p1=59;result=*p2;break;case MODE_D:*p1=*p2;case MODE_E:result=27;break;default:result=12;break;}return result;}
long switch_prob(long x,long n){long result=x;switch(n){case 60://equal to 62case 62:result=8*x;break;case 63:result>>=3;break;case 64:x*=15;case 65:x=x*x;default:result=x+0x4b;break;}return result;}
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
对D[R][S][T],有
R=7
S=5
T=13
从第一句movq可看出,t对应%rcx,a[i][j]对应%rdx;
又显然第二三句就是A[i][j]=A[j][i],故a[j][i]对应%rax。
%rdx
%rax
M=15
从汇编代码第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
| 栈存储内容 | 地址编号(取%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 |
%rsp+64
以%rsp为基准地址,分别偏移8,16,24个字节来访问结构体strA s中的元素。
以传入参数%rdi(即%rsp+64)为基准地址,分别偏移0,8,16个字节来写入结构体strB r中的元素。
| 栈存储内容 | 地址编号(取%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 |
发起调用的函数给被调用的函数传递地址和需要的空间大小;被调用的函数存储数据后,返回传入的地址值。
(1)若为奇数:
则
不妨令,当时取得最小值,当时取得最大值。
(2)若为偶数:
则
不妨令,当时取得最小值,当时取得最大值。
综上可得,当为偶数且时,取得最小值;当为奇数且时,取得最大值。
是数组留出了足够的空间,且是最小的16的倍数。
由小问得,是的倍数。
