第二章 习题解答(2)

2019-03-27 19:25

[00400050] 2084ffff addi $4, $4, -1; 12: addi $a0,$a0,-1 [00400054] 0c10000c jal 0x00400030 [FIB]; 13: jal FIB [00400058] 00408820 add $17, $2, $0; 14: add $s1,$v0,$0 [0040005c] 2084ffff addi $4, $4, -1; 15: addi $a0,$a0,-1 [00400060] 0c10000c jal 0x00400030 [FIB]; 16: jal FIB [00400064] 00511020 add $2, $2, $17; 17: add $v0,$v0,$s1 [00400068] 8fbf0000 lw $31, 0($29); 18: lw $ra,0($sp) [0040006c] 8fb10004 lw $17, 4($29); 19: lw $s1,4($sp) [00400070] 8fa40008 lw $4, 8($29); 20: lw $a0,8($sp) [00400074] 23bd000c addi $29, $29, 12; 21: addi $sp,$sp,12 [00400078] 03e00008 jr $31; 22: jr $ra

$sp $sp

Fib 函数嵌套调用栈变化过程 7ffff9c8 00000004($a0) 7ffff9c4 7ffff9c0 00000000($s1) 0040002c(&j 0x0040007c [exit]) 首次调用fib(4) $a0=4 7ffff9c8 00000004($a0) 7ffff9c4 7ffff9c0 7ffff9bc 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000003($a0) 7ffff9b8 00000000($s1) 7ffff9b4 00400058(&add $17, $2, $0) 嵌套调用fib(3) $a0=3 $sp 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000003($a0) 7ffff9b8 00000000($s1) 7ffff9b4 00400058(&add $17, $2, $0) 7ffff9b0 00000002($a0) 7ffff9ac 00000000($s1) 7ffff9a8 00400058(&add $17, $2, $0) 嵌套调用fib(2) $a0=2

7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000003($a0) 7ffff9b8 00000000($s1) 7ffff9b4 00400058(&add $17, $2, $0) 7ffff9b0 00000002($a0)

$sp 7ffff9ac 00000000($s1) 7ffff9a8 00400058(&add $17, $2, $0) 7ffff9a4 00000001($a0) 7ffff9a0 00000000($s1) 7ffff99c 00400058(&add $17, $2, $0) 嵌套调用fib(1) $a0=1 $sp

7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000003($a0) 7ffff9b8 00000000($s1) 7ffff9b4 00400058(&add $17, $2, $0) 7ffff9b0 00000002($a0) 7ffff9ac 00000000($s1) 7ffff9a8 00400058(&add $17, $2, $0) fib(1)返回执行add $s1,$v0,$0前 $sp 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000003($a0) 7ffff9b8 00000000($s1) 7ffff9b4 00400058(&add $17, $2, $0) 7ffff9b0 00000002($a0) 7ffff9ac 00000000($s1) 7ffff9a8 00400058(&add $17, $2, $0) 7ffff9b0 00000000($a0) 7ffff9ac 00000001($s1) 7ffff9a8 00400064(&add $2, $2, $17) 嵌套调用fib(0) $sp 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000003($a0) 7ffff9b8 00000000($s1) 7ffff9b4 00400058(&add $17, $2, $0) 7ffff9b0 00000002($a0) 7ffff9ac fib(0)返回

00000000($s1) 7ffff9a8 00400058(&add $17, $2, $0)

$sp 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000003($a0) 7ffff9b8 00000000($s1) 7ffff9b4 00400058(&add $17, $2, $0) fib(2)返回,执行add $s1,$v0,$0前 $sp 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000003($a0) 7ffff9b8 00000000($s1) 7ffff9b4 00400058(&add $17, $2, $0) 7ffff9b0 00000001($a0) 7ffff9ac 00000001($s1) 7ffff9a8 00400064(&add $17, $2, $0) fib(2)返回,再次执行jal FIB后,此时$a0=1 $s1=1 $sp 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000003($a0) 7ffff9b8 00000000($s1) 7ffff9b4 00400058(&add $17, $2, $0) fib(2)返回 $pc=00400064 $sp 7ffff9c8 7ffff9c4 7ffff9c0 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) fib(3)返回,执行add $s1,$v0,$0前 $sp 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000002($a0) 7ffff9b8 00000002($s1) 7ffff9b4 00400064(&add $17, $2, $0) fib(3)返回,再次执行jal FIB(2) 后,此时$a0=2 $s1=2

7ffff9c8 7ffff9c4 7ffff9c0 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit])

$sp 7ffff9bc 00000002($a0) 7ffff9b8 00000002($s1) 7ffff9b4 00400064(&add $17, $2, $0) 00000001($a0) 00000002($s1) 00400058(&add $17, $2, $0) fib(3)返回,再次执行jal FIB (1)后,此时$a0=1 $s1=2 $sp 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000002($a0) 7ffff9b8 00000002($s1) 7ffff9b4 00400064(&add $17, $2, $0) fib(3)返回执行add $s1,$v0,$0前 $sp 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000002($a0) 7ffff9b8 00000002($s1) 7ffff9b4 00400064(&add $17, $2, $0) 00000000($a0) 00000001($s1) 00400064(&add $17, $2, $0) fib(3)返回,再次执行jal FIB (0)后,此时$a0=0 $s1=3 7ffff9c8 7ffff9c4 7ffff9c0 7ffff9bc 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) 00000002($a0) 7ffff9b8 00000002($s1) 7ffff9b4 00400064(&add $17, $2, $0) fib(3)返回中的jal FIB (0)返回, 7ffff9c8 7ffff9c4 7ffff9c0 00000004($a0) 00000000($s1) 0040002c(&j 0x0040007c [exit]) fib(3)返回中的jal FIB (1)返回 fib(4)返回,栈恢复

12.若PC=0x00000000, 请分析是否可以仅采用条件跳转指令或无条件跳转指令跳转到下表所示地址?若能,分别需要采用多少条跳转指令? 跳转地址 条件跳转次数 无条件跳转次数

a. 0x00001000 b. 0xFFFC0000 1(正向跳转) 3(负向跳转) 1 否 解答:条件跳转指令中的立即数是16位符号数,其取值范围为-215~215-1, 新的PC的值=PC的原始值+16位立即数*4

因此当跳转指令的PC=0时,实际上PC的原始值已经变为4,一次正向跳转可跳转到的地址范围为:0x00000004~0x00020000 ,一次负向跳转可跳转到的地址范围为0xFFFE0004~0x0, 当跳转到0xFFFE0004,再次最远距离的跳转将跳转到0xFFFC0008,此地址仍然大于0xFFFC0000,因此还需要再进行一次跳转,共需跳转3次。

无条件跳转由于无法改变PC的最高4位,因此a)可以实现,b)无法实现。

13.利用MIPS汇编语言编程实现以下算式功能,并将结果输出到屏幕中。

1)通过键盘输入两个字类型的10进制数据,并且将它们的和、差以10进制形式输出到屏幕上

2)通过键盘输入两个字类型的16进制数据,并且将它们的和、差以16进制形式输出到屏幕上

3)分别对两个半字类型的符号数数组进行从大到小的排序,要求采用子程序实现单一数组数据的排序,主程序调用子程序分别对两个数组排序,并且分别将结果输出到屏幕上。

解答:1)2)主要考察系统功能调用的熟悉程度,由于QTspim可以直接支持10进制整数的输入输出,因此1)可以直接进行输入输出,但是2)需要进行转换,字符串到16进制以及16进制到字符串的转换。

1)程序源码: .data prompt: .asciiz \

sumresult: .asciiz \定义提示信息 difresult: .asciiz \.text main: li $v0,4

la $a0,prompt syscall #输出提示信息 li $v0,5 syscall #输入十进制数 add $s0,$v0,$0 #暂存输入结果 li $v0,4

la $a0,prompt syscall #输出提示信息 li $v0,5 syscall #输入十进制数 add $s2,$s0,$v0 #暂存和的结果 sub $s1,$s0,$v0 li $v0,4

la $a0,sumresult

syscall

#输出提示信息


第二章 习题解答(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:高效课堂22条军规

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: