16 .举例说明哪几种寻址方式除去取指令以外不访问存储器? 哪几种寻址方式除去取指令外只需访问一次存储器? 完成什么样的指令,包括取指令在内共访问4 次存储器?
解:除去取指令以外不访问存储器:立即寻址,寄存器寻址。 除去取指令外只需访问一次存储器:直接寻址,寄存器间接寻址,变址寻址,基址寻址,相对寻址,页面寻址。 二级间接寻址包括取指令在内共访问4 次存储器。
17 .设相对寻址的转移指令占两个字节,第一个字节是操作码,第二个字节是相对位移量,用补码表示。假设当前转移指令第一字节所在的地址为2000H ,且CPU 每取一个字节便自动完成(PC) + 1 → PC 的操作。试问当执行JMP *+ 8 和JMP *- 9 指令( 倡为相对寻址特征)时,转移指令第二字节的内容各为多少? 转移的目的地址各是什么?
解:转移指令第二字节的内容分别为:00001000(+8),11110111(-9)
转移的目的地址分别为:200AH ,1FF9H 。
20.什么叫主程序和子程序? 调用子程序时还可采用哪几种方法保存返回地址? 画图说明调用子程序的过程。
解:主程序就是指通常的程序,而子程序是一组可以公用的指令序列,只要知道子程序的入口地址就能调用它。 保存返回地址的方法有多种:
(1) 用子程序的第一个字单元存放返回地址。转子指令把返回地
址存放在子程序的第一个字单元中,子程序从第二个字单元开始执行。返回时将第一个字单元地址作为间接地址,采用间址方式返回主程序。
(2) 用寄存器存放返回地址。转子指令先把返回地址放到某一个寄存器中,再由子程序将寄存器中的内容转移到另一个安全的地方。 (3) 用堆栈保存返回地址。
调用子程序的过程如图3唱8 所示,此时返回地址保存在堆栈中。
21 .在某些计算机中,调用子程序的方法是这样实现的:转子指令将返回地址存入子程序的第一个字单元,然后从第二个字单元开始执行子程序,请回答下列问题:
(1) 为这种方法设计一条从子程序转到主程序的返回指令。 (2) 在这种情况下,怎么在主、子程序间进行参数的传递? (3) 上述方法是否可用于子程序的嵌套?
(4) 上述方法是否可用于子程序的递归(即某个子程序自己调用自己) ?
(5) 如果改用堆栈方法,是否可实现(4) 所提出的问题?
解:(1) 返回指令通常为零地址指令。返回地址保存在堆栈中,执行返回指令时自动从堆栈中弹出。而目前返回地址是保存在子程序的第一个单元中,故此时返回指令不能再是零地址指令了,而应
当是一地址指令。如:
间接寻址可找到返回地址,然后无条件转移到返回的位置。 (2) 在这种情况下,可利用寄存器或主存单元进行主、子程序间的参数传递。
(3) 可以用于子程序的嵌套(多重转子) 。因为每个返回地址都放在调用的子程序的第一个单元中。
(4) 不可以用于子程序的递归,因为当某个子程序自己调用自己时,子程序第一个单元的内容将被破坏。
(5) 如果改用堆栈方法,可以实现子程序的递归,因堆栈具有后进先出的功能。