程序的机器级表达
开工日期:2018年5月10号 完成日期:2018年5月18日 耗时:8日
配置:centOS 7 64位+gcc4.8.5
推荐大家一个网站compiler explore。很方便
3.58
long decode2(long x,long y,long z)
{
//x in %rdi,y in %rsi,z in %rdx
y = y-z;
x = x*y;
long a = y;
a<<=63;
a>>=63;
a = a^x;
return a;
}
dest in rdi,x in rsi,y in rdx
store_prod:
movq %rdx,%rax
cqto //把y的符号位放在rdx
movq %rsi,%rcx
sarq $63,%rcx //把x的符号位放在rcx
imulq %rax,%rcx
imulq %rsi,%rdx
addq %rdx,%rcx
mulq %rsi
addq %rcx,%rdx
movq %rax,(%rdi)
movq %rdx,8(%rdi)
ret
第一个乘法: x符号*y
第二个乘法 : y符号*x
第三个乘法 : x和y的无符号相乘。
由上图可知,x和y的无符号相乘,x和y的有符号相乘相差的是 : 2^64*(x符号*y + y符号*x)
所以第10行把这个加到了rdx。
3.60
A:
值 | 寄存器 |
---|---|
x | %rdi |
n | %esi |
result | rax |
mask | rdx |
B
result | 0 |
---|---|
mask | 1 |
C
mask!=0
D
mask = mask<
F:
long loop(long x,int n)
{
long result = 0;
long mask;
for(mask=1;mask!=0;mask=mask<<n){
result|=(x&mask);
}
return result;
}
3.61
从cread()的矛盾里,要使用条件传送指令,就必须算出2种可能性,但是*xp可能是空指针,会产生间接使用空指针的错误。这里,我加一层指针. (大家可以看看linux之父的这个演讲。他在这个演讲里讲了二重指针。很有意思)linux
long cread_alt(long *xp){
int