《计算机系统概述》-第7章-习题答案

  1. 假设一个汇编语言程序中包含了以下两条指令,汇编器将翻译后的LDI指令放在目标模块的x3025位置。问汇编过程结束后,x3025的内容是什么?
    7.1
    1010 011 11111 1110 = 0xA7FE

  2. 假设汇编语言程序中包含下面的指令
    ASCII的符号表项的内容是x4F08,问该指令执行之后,R1的内容是什么?
    7.2
    R1=0010 0011 1111 1111 = 0x23FF

  3. 如果采用字符串AND作为标识(label),会出现什么问题?(提示:第1遍扫描会是什么情况?第2遍扫描会是什么情况?)
    第1遍扫描会将AND扫描成OPCODE,解析为0101;
    第2遍扫描会出现编译错误

  4. 试为以下代码写出在汇编器处理下符号表的内容。
    7.4

  5. a. 试阅读以下程序,说明它的作用。
    7.5
    b. 程序结束后,RESULT的内容是什么?

  6. (假设)我们的汇编器崩溃了,需要你的帮助!请创建一个符号表,并将下面程序中标号为D、E、F的指令手工汇编出来。你可以假设在这个模块执行之前,已有另外一个模块将一个正数放入了E中。 7.6.1
    7.6.2
    请用不多于15个字的一句话,解释上面这个程序在做什么。

  7. 试写一个LC-3汇编程序,统计R0寄存器的数值中包含了多少个1,并将结果存入R1。例如,假设R0的内容是0001001101110000,则程序执行之后,R1的内容等于6(0000 0000 0000 0110)。

  8. 一个工程师正在调试她写的一个程序。当她看到下面代码时,决定在地址0xA404处放置一个断点(breakpoint)。在PC=0xA400时,她将所有寄存器清0,并运行程序直到遇到断点。
    7.8
    试写出遇到断点的时候,寄存器文件的内容(用十六进制表示)。

  9. 位操作.END的作用是什么?它和HALT指令之间的区别是什么?

  10. 下面代码片段中存在一个错误。请找出错误并修复它。
    7.10
    该错误是在被汇编的时候,还是在LC-3上运行的时候,将被发现?

  11. LC-3汇编器必须能够将ASCII表示的常数转换为相应的二进制数值。例如,x2A将被翻译为00101010,而#12被翻译为00001100。试写一个汇编语言程序,将从键盘读入的十进制或十六进制常数(前缀#代表十进制,前缀x代表十六进制)转换为二进制数表达方式,并打印出来(假设常数表示时,十进制或十六进制的数字不超过两个)。

  12. 阅读以下代码,试解释该程序的目的。
    7.12

  13. 以下程序的目的是将存放在内存A、B、C中的内容相加,并将结果存入内存。但是,代码中存在两个错误。试找出错误,并分别解释错误会在汇编时还是在运行时被检测出来?
    7.13.17.13.2

  14. a. 汇编以下程序(即写出该程序的机器代码):
    7.14
    b. 程序员试图将%符号显示在屏幕上,然后停机(halt)。但程序员混淆了操作码(即使用了错误的汇编指令)。请将程序中被错误使用的一个操作码替换为正确的操作码。

    c. 原先的程序(如a)的执行会产生奇怪的现象。产生错误现象的原因一部分是由程序员的失误造成的,另一部分归因于R0的内容在程序执行之初是x3000。试解释奇怪的现象是什么样的,以及为什么会是这样?

  15. 假设x4000开始的连续内存空间中存放了一个整数序列,且每个内存单元存放了一个整数。该序列的结尾数值是x0000。阅读下面的程序,请问该程序的目的是什么?
    7.15

  16. 假设x4000开始的连续内存空间中存放了一个非负整数序列,且每个内存单元存放一个整数。每个整数的数值范围是0~30000(十进制),结尾数值是-1。阅读下面的程序,请问该程序的目的是什么?
    7.16

  17. 假设你写了两个独立的汇编语言模块,并用链接器将两者结合在一起。其中,每个模块都使用了标识AGAIN,但没有一个模块中包含了伪操作.EXTERNAL AGAIN。请问在两个模块中,同时使用标识AGAIN是否有问题?为什么?

  18. 下面程序比较两个相同长度的字符串。第一个字符串的起始地址是x4000,第二个字符串的起始地址是x4100,两者都是.STRINGZ格式。如果两个字符串相同,则程序结束时R5=0。请在(a)、(b)、(c)中填充指令,完成该程序。

    假设x4000开始的连续内存空间中存放了一个整数序列,且每个内存单元存放一个整数。该序列的结尾数值是x0000。阅读下面的程序,请问它的目的是什么?
    7.18

  19. 请问下面的程序执行时,标识LOOP处的指令会被执行多少次?
    7.19

  20. 下面的模块(a)和(b)分别是两个程序员写的LC-3汇编程序,两者的目的都是将数值x0015填入地址x4000。请问两者的本质区别是什么?
    7.20

  21. 汇编以下LC-3汇编语言程序(写出机器码):
    7.21
    请问程序的目的是什么(用不多于20个字来描述)?

  22. LC-3汇编器必须能将指令的助记(mnemonic)操作码翻译成二进制操作码。例如助记操作码ADD对应的二进制码形成为0001。写一个LC-3汇编语言程序,提示用户输入一个助记操作码(如ADD),然后将其对应的二进制码打印到屏幕上。如果输入的是无效助记操作码,则显示错误信息。

  23. 试写一个LC-3汇编程序,判断一个字符是否是“回文”(palindrome)。所谓“回文”,就是正读或反读结果都是一样的。例如,字符串“racecar”就是一个回文。假设x4000存放了一个格式为.STRINGZ的字符串。判断该字符串是否是回文,如果是则R5返回内容1;如果不是,则R5返回0。填充(a)~(e)处的指令,完成整个程序。
    7.23

  24. 我们的本意是让以下程序将R3内容左移4个bit,但程序中存在错误,请找出错误并修正。
    7.24

  25. 伪操作.FILL xFF004有什么问题吗?为什么?

参考:https://github.com/QSCTech/zju-icicles/blob/master/计算机系统概论/作业答案/ch07_complete.pdf

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值