实验内容
从键盘输入10个无符号字数并从大到小进行排序,排序结果在屏幕上显示出来。
实验步骤
设计遵循以下步骤:
①C语言设计
②单元代码转写及变量映射
③单元伪汇编设计
④单元测试及debug
⑤回到步骤①,直到程序完成
代码设计
整个程序可以分为三个单元:读入读入单元,排序单元,输出单元。由于各单元的设计方法,下面以读入单元为例展开叙述。
1.首先我们进行C语言设计
//read in
int arr[10];
for (int i =0; i <10; i++) {
scanf("%d", &arr[i]);
}
可以看到,读入单元十分简单,一个for循环,然后读入数据到arr[i]就好了。
2.变量映射及代码转写
变量映射,就是把涉及到的变量对应为寄存器。代码转写,就是把其中的循环,及分支判断用goto转写成顺序结构语句,虽然实际运行的时候是有循环的。
各个涉及变量映射到对应寄存器,如表1所示。
而对于上一个步骤的C代码,我们可以如下转写:
申请空间,基准地址为arr,长度为10 int,即4 word
int i = 0;
Loop:
偏移量bias = i * 4;
实际地址 addr = arr + bias;
读入数据到 tmp;
arr[addr] = tmp;
i = i + 1;
if (i < 10) goto Loop;
3.单元伪代码设计
3.单元伪汇编设计
根据上一步骤的伪代码转写和变量映射,我们查询相关的MIPS指令集和系统调用后,可以写出以下MIPS指令。
li $v0, 9 #9号syscall,请求内存空间
li $a0, 40 #申请40byte,4word的空间大小
syscall #系统调用
add $s1, $v0, $zero #加载基准内存地址
add $s0, $zero, $zero