@ysner
2021-11-14T23:38:30.000000Z
字数 2225
阅读 1075
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=0
mask=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 62
case 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的倍数。
由小问得,是的倍数。