深入理解计算机系统[习题]_第一部分_第三章_程序的机器级表示
深入,并且广泛
-沉默犀牛
之前整理了第二张的习题,没想到访问量挺高的,看来还是有人需要习题和答案的,以后每看完一章书,就会对应的整理出那一章的习题。
如果看完答案觉得不同,请看我的“深入理解计算机系统_第一部分_第三章_程序的机器级表示” 其中对这一章都进行了详细的介绍
1.熟悉操作数的类型
2.这个练习题要看上面的各个寄存器的字节数
[看答案介绍内存引用总是用四字长寄存器给出,选择数据传送指令的时候就看另一个操作数好了。]
3.熟悉数据传送指令 movq![深入理解计算机系统[习题]_第一部分_第三章_程序的机器级表示 深入理解计算机系统[习题]_第一部分_第三章_程序的机器级表示](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM2MS9mNzY4Zjg2YWNkYzczODNkYmZhZGU1ZWQ4OWZhODNkOS5wbmc=)
4.熟悉数据传送指令,注意 * 符号是取出地址里的数
我把每种数据类型的占用的字节数再贴一下:
5. 再次熟悉指针和movq指令![深入理解计算机系统[习题]_第一部分_第三章_程序的机器级表示 深入理解计算机系统[习题]_第一部分_第三章_程序的机器级表示](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM3OS9hN2ViMWEwMjA5YzEyYTczMjMwYzdlOWU5OTgzYjVkYi5wbmc=)
6.熟悉 leaq 进行的简单算术运算
7.熟悉 leaq 进行的简单算术运算
8.熟悉二操作数指令
9.熟悉移位操作
10.熟悉 xorq 指令
11.熟悉 divq 指令
12.熟悉条件码跳转指令 set
13. 熟悉测试指令 test
14.注意这里的D答案,0xffffff73 + 0x004005ed = 0x100400560 截断后为 0x00400560
15.下三题都是熟悉 if 语句条件控制汇编实现
16.
17.
【小提示:可能你没能一次记住跳转指令的条件,本题目中的 jge 是 “大于等于”则跳转】
18.下两题是熟悉 if 语句条件传送的汇编实现,注意与上面的条件控制区别开,上面是判断后再计算,这里是先把两个结果都计算出来,然后判断输出哪个。因为现在处理机流水线的设计原因,这个方法在适用的时候会更高效。
【小提示:cmovns 的传送条件为 非负数(通过判断 SF 的值),之前的 testq 会影响 SF 的值】
【我不知道为啥 “负数要加偏移量” 】