实验一 : MIPS汇编语言程序设计实验
一.实验目的
1.认识和掌握MIPS汇编语言程序设计的基本方法;
2.熟悉PCSpim模拟器的使用。
二.实验内容
从键盘输入10个无符号字数并从大到小进行排序,排序结果在屏幕上显示出来。
三.实验器材
电脑一台,PCSpim仿真器软件一套。
四.实验过程与结果
程序构思:首先读取十个数字,再通过冒泡排序排序好十个数字,最后输出十个数字
实验过程:
1.排序采用了冒泡排序的思想,先写出冒泡排序的c++代码
using namespace std;
int main(void) {
int arr[10];
cout << “Please enter 10 integers to be sorted:\n”;
for (int i = 0; i < 10; i++) {
cin >> arr[i];
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j+1 < 10-i; j++) {
if (arr[j] < arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
cout << “The sorted numbers are:\n”;
for (int i = 0; i < 10; i++) {
cout << arr[i] << ” “;
}
cout << “\n”;
return 0;
}
2.根据c++代码写出对应的mips汇编代码
(1)首先是读取10个数字并保存,这一点通过input循环十次调用 v0=5的readint读取10个数字并储存在了以 v 0 = 5 的 r e a d i n t 读 取 10 个 数 字 并 储 存 在 了 以 t6为首地址的数组中;
(2)再是构建两个循环loop1和loop2,loop1是i从0到9,loop2是j从0到9-i,每次跳转到loop1就将j重置为0,在loop2中若是a[j] > a[j+1],则跳转到skip代码块,否则交换a[j] 和 a[j+1]所存的数字,在skip代码块中j每次自加1,若j小于9-i则进入loop2代码块,若i小于9则进入loop1代码块,这样就实现了冒泡排序,将输入的数字按照从大到小的顺序排列了;
(3)最后是输出排序后的数组,类比于input循环构建一个print循环十次调用 v0=1的printint输出排好序后的储存在以 v 0 = 1 的 p r i n t i n t 输 出 排 好 序 后 的 储 存 在 以 t6为首地址的数组中的十个数字。
实验过程分析:常规的冒泡循环是直接将两个loop嵌套,但由于每次判断完a[j] 和 a[j+1]的大小后是有两种情况的,所以单独列一个skip代码块来处理j的自增和跳转入loop1还是loop2的判定,loop2中只需要在a[j] < a[j+1]时交换二者的值。
实验结果:(结果如图)
实验结果分析:不知道为何输入10个数字时必须用回车隔开而不能用空格隔开,所以输入的每个数字只能单独成行,但输出的最终结果的确是理想结果
.text
.globl main
main:
la $t6,array # $t6是数组的首地址
move $t7,$zero # $t7是循环变量i
addi $t8,$zero,10 # $t8是数组长度10
move $t9,$zero # $t9是循环变量j
la $a0,msg_1; # 提示用户输入十个无字符数字
li $v0,4
syscall
input: # 完成数组元素的输入
li $v0,5
syscall
move $t0,$t7
sll $t0,$t0,2 # 左移两位使t0扩大四倍
addu $t1,$t0,$t6 # t1指向此时输入元素的位置
sw $v0,0($t1)
addi $t7,$t7,1
blt $t7,$t8,input
move $t7,$zero # 将循环变量i重置为0
loop1: # 外层循环
move $t9,$zero # 将循环变量j重置为0
loop2: # 内层循环
move $t0,$t9
sll $t0,$t0,2
addu $t1,$t0,$t6
lw $t2,0($t1) # $t2为a[j]
addi $t0,$t9,1
sll $t0,$t0,2
addu $t4,$t0,$t6
lw $t3,0($t4) # $t3为a[j+1]
bge $t2,$t3,skip # 如果a[j] >= a[j+1],跳转到skip代码块
sw $t3,0($t1) # 否则交换两者的值
sw $t2,0($t4)
skip: #判断进入哪个循环
addi $t9,$t9,1
addi $t0,$t9,1
sub $t1,$t8,$t7
blt $t0,$t1,loop2 #如果j+1小于10-i则进入内层循环
addi $t7,$t7,1
sub $t2,$t8,1
blt $t7,$t2,loop1 #如果i小于9则进入外层循环
output:
la $a0,msg_2 # 提示即将输出结果
li $v0,4
syscall
move $t7,$zero # 将循环变量i置为0
print: # 输出排序好的数字
move $t0,$t7
sll $t0,$t0,2
addu $t1,$t0,$t6
lw $a0,0($t1)
li $v0,1
syscall
la $a0,seperate
li $v0,4
syscall
addi $t7,$t7,1
blt $t7,$t8,print # 如果满足循环条件,跳转到print继续执行循环
la $a0,finish
li $v0,4
syscall
.data
array:.space 40
msg_1:.asciiz "Please enter 10 integers to be sorted:\n"
msg_2:.asciiz "The sorted numbers are:\n"
seperate:.asciiz " "
finish:.asciiz "\n"