第四周:《深入理解计算机系统》第二章
1.P63:
通过类似的推理,我们可以得出,对于一个位模式为[x(w-1),x(w-2),……,0,……,0]的补码数x,以及在0<=k<=w范围内的任一k,位模式为[x(w-k-1),x(w-k-2),……,0,……,0]就是x*2^k的补码表示
为什么截断前面的k位、后面补上0之后,就是一个乘式结果的补码表示?
P66练习题2.42
写一个函数div16,对任何整数参数,返回x/16的值。不能使用四则运算和任何条件运算符、比较运算符。(假设你的机器是32位,使用补码表示,右移都是算术右移)
int div16(int x)
{
int bias = (x>>31)&0xf;//如果是负数,bias就会变成f
return (x+bias)>>4;
}
不太理解如何证明负数运算时,加上bias(即f)之后就可以直接右移四位?
P67练习题2.44
E.x>0||-x>0
假。设x=-2147483648(Tmin32),则x和-x都为负数
如何判断x的相反数是多少?
第五周:《深入理解计算机系统》第三章
1.既然leal是mov的变形,那么所有可以用leal的场合都可以用mov吗?
2.(已经在后续学习中解决,可以下方3.做参考,跳转到目标值之后可能接着执行某段代码)P127中,
jmp *<操作数指示符【注意:如果形如%eax,即以%eax中的值作为跳转目标;而形如(%eax)则是以其中的值作为地址,读出跳转目标】 那么,如果程序中有这种语句,跳到目标值之后会怎么样呢?
3.P146中,图3-19的代码块第6行有:
jmp *.L7(,%eax,4)
然而,该段代码中并没有标识.L7的位置。那么jmp指令如何寻址?
4.P148练习题3.29
根据图3-20的汇编代码,填写补充C源代码.答案如下:
int switcher(int a,int b,int c) { int answer; switch(a) { case 5 : c = b ^ 15; case 0 : answer = c+112; case 2 : case 7 : answer = c+6; break; case 4 : answer = a; break; default : answer = b; } return answer; }
其中,关于
case 4 :
answer = a;
break;
答案中解释为:
GCC对程序进行了优化,将answer = 4优化为answer = a。
为什么?
5.
call next next: popl %eax
C.这段代码完成了什么功能? 【这是IA32中将程序计数器中的值放到整数计数器中的唯一办法】
这句解释是什么意思呢?