MIPS汇编程序设计——冒泡排序

实验内容

从键盘输入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     
  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
冒泡排序是一种简单的排序算法,可以用MIPS汇编语言来实现。下面是一个基于MIPS汇编语言的冒泡排序示例: ``` # $a0 - 存放数组的起始地址 # $a1 - 数组长度 .data array: .word 5, 2, 3, 8, 6 # 初始化一个数组 newline: .asciiz "\n" .text .globl main main: la $a0, array # 将数组地址存储在$a0中 lw $a1, array+4 # 将数组长度存储在$a1中 addi $a1, $a1, -1 # 数组长度-1 outerloop: li $t0, 1 # 将标志位$t0设置为1 li $t1, 0 # 将$i的初值设置为0 innerloop: add $t2, $a0, $t1 # 计算第$i个元素的地址 lw $t3, ($t2) # 将第$i个元素存储在$t3中 addi $t4, $t1, 4 # 计算下一个元素的地址 add $t5, $a0, $t4 # 计算下一个元素的地址 lw $t6, ($t5) # 将下一个元素存储在$t6中 ble $t3, $t6, skipswap # 如果$t3 <= $t6,则跳过交换 sw $t3, ($t5) # 否则,交换$t3和$t6 sw $t6, ($t2) li $t0, 0 # 设置标志位$t0为0,表示进行了交换 skipswap: addi $t1, $t1, 4 # 增加$i的值 blt $t1, $a1, innerloop # 如果$i < n - 1,则继续循环 beqz $t0, outerloop # 如果标志位$t0为0,则继续外部循环 # 打印排序后的数组 li $v0, 4 la $a0, newline syscall la $a0, array printloop: lw $a1, ($a0) li $v0, 1 syscall la $a0, newline li $v0, 4 syscall addi $a0, $a0, 4 blt $a0, array+20, printloop li $v0, 10 # 退出程序 syscall ``` 在上面的示例代码中,我们首先定义了一个包含一些随机数字的数组。然后,我们使用`lw`指令将数组的起始地址存储在寄存器`$a0`中,将数组长度存储在寄存器`$a1`中。接下来,我们使用两个循环来实现冒泡排序。外部循环用于控制每一轮比较和交换,内部循环用于比较和交换相邻的元素。最后,我们使用`syscall`指令将排序后的数组打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值