CSAPP.3e
文章平均质量分 93
大部头之一
anlian523
人若无名,专心练剑!
展开
-
《深入理解计算机系统》 练习题4.4-4.5
4.4用Y86-64来实现一个递归求和函数:如下long rsum(long *start, long count) { if (count <= 0) return 0; return *start + rsum(start+1,count-1);}没想出来答案,但能看明白答案==下面为x86-64的代码:1.表面上看起来,每次进入递归函数都会movl $0,...原创 2019-01-05 19:06:45 · 980 阅读 · 1 评论 -
《深入理解计算机系统》第三版 第三章家庭作业答案
3.58long decode2(long x,long y,long z){ y = y - z; x = x * y; y <<= 63; y &a原创 2018-12-14 21:38:19 · 20171 阅读 · 8 评论 -
《深入理解计算机系统》 练习题3.49详解
3.49解释5-7行第5行汇编得到8n+22。第6行8n+22与立即数-16进行与运算。按照最高位为符号位来说,-16的二进制为1 0000,因为符号拓展值不变,所以-16的8字节表示为.... 1111 0000,省略号全为1。所以第6行是要将8n+22与.... 1111 0000进行与运算,这会导致8n+22的低4位如果谁有1都会被舍弃掉,原文描述为:“把它向下舍入到最接近的16的...原创 2018-11-30 22:45:42 · 3794 阅读 · 14 评论 -
《深入理解计算机系统》 练习题3.27-3.28 被调用者保存寄存器 栈指针
3.27要求你将书中的阶乘函数,利用guarded-do的翻译策略,转换成c的goto版本,答案如上图。注意第一次测试为if(n <= 1),这是因为,第一次测试是2 <= n,它的反面是2 > n即n < 2即n &a原创 2018-11-25 19:23:13 · 5594 阅读 · 6 评论 -
《深入理解计算机系统》练习题3.13-3.16 set指令 跳转指令编码
set指令访问条件码SET指令根据条件码或者条件码的组合来将一个字节设置为0或1(所以如果set指令后面跟的是寄存器,那么必须是单字节的寄存器)。在经过了比较指令a<b,即有t=a-b后,就会根据运算的过程和结果设置条件码。注意不管是无符号数还是补码数,t一定是发生溢出后的截断结果(如果有发生溢出)。分析有符号数的4种指令。1)分析setl。因为这个看起来原创 2018-11-23 00:22:40 · 5496 阅读 · 0 评论 -
《深入理解计算机系统》 练习题3.9-3.11 移位操作
移位操作移位操作是二元操作。第一个操作数是移位量,第二个操作数是被移位的数。移位量只能是立即数,或者放在单字节寄存器%cl中。被移位的数可以是一个寄存器,或者一个内存位置。如果移位操作对w位长的数据,那么移位量就是%cl中的低m位的无符号数值(它们的关系是2m=w2^m=w2m=w)。以%cl的十六进制值为0xFF为例:命令等式有效位移位量salb23=82^...原创 2018-11-22 11:49:36 · 3403 阅读 · 3 评论 -
《深入理解计算机系统》 练习题3.2-3.5 汇编相关
汇编命令总结1)%eax,%dx就是寄存器的名字2)(%rax)。只要是有括号的了,那就是内存引用。注意x86-64中的内存引用总是用四字长寄存器给出的,即寄存器名字开头都是r开头的。(%rax)意思是取寄存器%rax中的存的地址中的存的值,相当于解引用两次,先解引用寄存器,再解引用这地址(我用“解引用”这个词只是为了方便理解)。3)mov命令中,两个操作数只允许有一个内存引用,即只能有一个...原创 2018-11-12 20:11:39 · 11407 阅读 · 32 评论 -
《深入理解计算机系统》 练习题2.48 2.49 IEEE浮点表示
IEEE浮点表示关于IEEE浮点表示的具体讲解,本文就不班门弄斧了,请自行阅读书籍。本文将进行必要总结再加上自己的理解。IEEE浮点标准用V=(−1)s×M×2EV=(-1)^s \times M \times 2^EV=(−1)s×M×2E的形式来表示一个数:1)符号(sign):s决定这个数是正数还是负数,注意会有正0和负0的区分。2)尾数(significand):M是一个二进制小数...原创 2018-11-10 15:34:18 · 2551 阅读 · 3 评论 -
《深入理解计算机系统》 练习题2.42-2.44 补码除以2的幂
补码除以2的幂具体讲解在书里。这里直接给几个结论:1)有符号数即补码数执行的是,算术右移。2)有变量x和2k2^k2k(0<=k<w),那么x>&amp原创 2018-11-09 14:09:33 · 3332 阅读 · 1 评论 -
《深入理解计算机系统》 练习题2.37答案
XDR库中的安全漏洞1)size_t是unsigned int型的。2)malloc的函数原型是void *malloc(unsigned int size)。如果第9行代码里,ele_cnt * ele_size的乘积结果超过了unsigned int的范围([0, 232−12^{32}-1232−1]),就会发生正溢出,乘积结果就会被截断,结果为 乘积 mod 2322^{32}23...原创 2018-11-09 09:50:06 · 1355 阅读 · 0 评论 -
《深入理解计算机系统》 练习题2.36答案
强制类型转换与其他运算的先后int main(void){ int x = -pow(2, sizeof(int) * 8 - 1); /* Tmin */ int y = -1; auto z1 = (int64_t)x * y; auto z2 = x * (int64_t)y; auto z3 = (int64_t)x * (int64_t)y; auto z4 = (in...原创 2018-11-08 21:24:51 · 981 阅读 · 2 评论 -
补码、补码非快速计算
补码高有效位大部分是1以补码为1101为例:−23-2^3−23222^222212^121202^0201101所以补码1101的十进制数值为-8+4+1 = -3。拓展补码的位表示:如果要将补码拓展转换为更大的数据类型,那么就在新增的高有效位中填充,原始最高有效位的值。推导如下:先拓展1位:−24-2^4−24232^323222^2...原创 2018-11-08 15:31:14 · 2938 阅读 · 0 评论 -
《深入理解计算机系统》 练习题2.32答案
a原创 2018-11-07 15:53:35 · 4192 阅读 · 8 评论 -
《深入理解计算机系统》 练习题2.31答案
你的同事对你补码加法溢出条件的分析有些不耐烦了,他给出了一个函数tadd_ok的实现,如下://determin whether arguments can be added without overflow//WARNING: THIS code is buggyint tadd_ok(int x, int y) { int sum = x+y; return (sum-x...原创 2018-11-06 17:37:00 · 2065 阅读 · 2 评论