MIPS汇编语言实现hello world和冒泡排序

WinMIPS64的IO方法输出hello world

编写一个简单的终端输出“Hello World!!”的小程序,首先写好一些数据包括CONTROL和DATA的地址以及字符串Hello World,然后将CONTROL和DATA的地址存储在寄存器中以之作为基址,将字符串首地址写入DATA,将4写入CONTROL

	.data
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
mes:	.asciiz "Hello World!\n"
	
	.text
	daddi r1,r0,mes
	lw r2,DATA(r0)
	sd r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sd r1,0(r2)
	halt

 用asm.exe检验该程序的语法,如图所示,语法无误。

MIPS汇编语言实现hello world和冒泡排序_第1张图片

 运行程序,其中terminal窗口如图所示,说明我们的程序成功打印出来Hello World。

MIPS汇编语言实现hello world和冒泡排序_第2张图片

冒泡排序

课本上的swap函数和sort函数对于排序这64位的整数是不适合的,而且也有些许的bug,因此我选择自己重写这两个函数。

首先先初始化一些数据,包括需要排序的数据和数据的长度以及需要输出的字符串和CONTROL和DATA的地址

	.data
array: 	.word 8,6,3,7,1,0,9,4,5,2
size:	.word 10
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
before:	.asciiz "before sort the array is:\n"
after: 	.asciiz "after sort the array is:\n"

先写一个swap函数,大体上与课本上的相同,不过我加上了所对使用寄存器的栈保存

swap:	daddi r29,r29,-16
	sw r8,12(r29)
	sw r9,8(r29)
	sw r10,4(r29)
	sw r31,0(r29)

	dsll r9,r5,3
	dadd r9,r4,r9
	lw r8,0(r9)
	lw r10,8(r9)
	sw r10,0(r9)
	sw r8,8(r9)

	lw r31,0(r29)
	lw r10,4(r29)
	lw r9,8(r29)
	lw r8,12(r29)
	daddi r29,r29,16
	jr r31

然后写sort函数,同样是要注意使用栈来保存所使用到的寄存器的值,特别是寄存器r31,即$ra的值,其中保存着函数调用的返回地址,然后便是两层循环加一个判断跳转swap函数

sort:	daddi r29,r29,-28
	sw r31,24(r29)
	sw r1,20(r29)
	sw r2,16(r29)
	sw r3,12(r29)
	sw r8,8(r29)
	sw r9,4(r29)
	sw r10,0(r29)
	
	lw r10,size(r0)
	daddi r10,r10,-1
	daddi r1,r0,0
loop2:	daddi r2,r0,0
loop3:	dsll r3,r2,3
	lw r8,array(r3)
	daddi r3,r3,8
	lw r9,array(r3)
	slt r3,r8,r9
	bnez r3,fine
	dadd r5,r2,r0
	daddi r4,r0,array
	jal swap
fine:	daddi r2,r2,1
	bne r2,r10,loop3
	daddi r1,r1,1
	bne r1,r10,loop2
	
	lw r10,0(r29)
	lw r9,4(r29)
	lw r8,8(r29)
	lw r3,12(r29)
	lw r2,16(r29)
	lw r1,20(r29)
	lw r31,24(r29)
	daddi r29,r29,28
	jr r31

然后再写一个输出数据的函数,因为要输出两次数据,所以写成一个函数比较方便

show:	daddi r29,r29,-16
	sw r1,12(r29)
	sw r2,8(r29)
	sw r3,4(r29)
	sw r4,0(r29)

	lw r4,size(r0)
	daddi r1,r0,0
loop1:	dsll r3,r1,3
	lw r2,array(r3)
	lw r3,DATA(r0)
	sw r2,0(r3)
	daddi r2,r0,2
	lw r3,CONTROL(r0)
	sw r2,0(r3)
	daddi r1,r1,1
	bne r1,r4,loop1

	lw r4,0(r29)
	lw r3,4(r29)
	lw r2,8(r29)
	lw r1,12(r29)
	daddi r29,r29,16
	jr r31	

最后是主函数的编写,先初始化栈指针寄存器的值为内存最高地址,然后在开始和结束都输出一次字符串和调用一次输出函数,中间调用一次排序函数

main:	daddi r29,r0,0x03f8
	daddi r1,r0,before
	lw r2,DATA(r0)
	sw r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sw r1,0(r2)

	jal show

	jal sort

	daddi r1,r0,after
	lw r2,DATA(r0)
	sw r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sw r1,0(r2)

	jal show

	halt

使用asm.exe检验所写的程序语法正确性,无语法错误

MIPS汇编语言实现hello world和冒泡排序_第3张图片

 运行程序,证明程序成功对数组排序

MIPS汇编语言实现hello world和冒泡排序_第4张图片

全部代码如下 

	.data
array: 	.word 8,6,3,7,1,0,9,4,5,2
size:	.word 10
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
before:	.asciiz "before sort the array is:\n"
after: 	.asciiz "after sort the array is:\n"

	.text

main:	daddi r29,r0,0x03f8
	daddi r1,r0,before
	lw r2,DATA(r0)
	sw r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sw r1,0(r2)

	jal show

	jal sort

	daddi r1,r0,after
	lw r2,DATA(r0)
	sw r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sw r1,0(r2)

	jal show

	halt

show:	daddi r29,r29,-16
	sw r1,12(r29)
	sw r2,8(r29)
	sw r3,4(r29)
	sw r4,0(r29)

	lw r4,size(r0)
	daddi r1,r0,0
loop1:	dsll r3,r1,3
	lw r2,array(r3)
	lw r3,DATA(r0)
	sw r2,0(r3)
	daddi r2,r0,2
	lw r3,CONTROL(r0)
	sw r2,0(r3)
	daddi r1,r1,1
	bne r1,r4,loop1

	lw r4,0(r29)
	lw r3,4(r29)
	lw r2,8(r29)
	lw r1,12(r29)
	daddi r29,r29,16
	jr r31	

swap:	daddi r29,r29,-16
	sw r8,12(r29)
	sw r9,8(r29)
	sw r10,4(r29)
	sw r31,0(r29)

	dsll r9,r5,3
	dadd r9,r4,r9
	lw r8,0(r9)
	lw r10,8(r9)
	sw r10,0(r9)
	sw r8,8(r9)

	lw r31,0(r29)
	lw r10,4(r29)
	lw r9,8(r29)
	lw r8,12(r29)
	daddi r29,r29,16
	jr r31
	
sort:	daddi r29,r29,-28
	sw r31,24(r29)
	sw r1,20(r29)
	sw r2,16(r29)
	sw r3,12(r29)
	sw r8,8(r29)
	sw r9,4(r29)
	sw r10,0(r29)
	
	lw r10,size(r0)
	daddi r10,r10,-1
	daddi r1,r0,0
loop2:	daddi r2,r0,0
loop3:	dsll r3,r2,3
	lw r8,array(r3)
	daddi r3,r3,8
	lw r9,array(r3)
	slt r3,r8,r9
	bnez r3,fine
	dadd r5,r2,r0
	daddi r4,r0,array
	jal swap
fine:	daddi r2,r2,1
	bne r2,r10,loop3
	daddi r1,r1,1
	bne r1,r10,loop2
	
	lw r10,0(r29)
	lw r9,4(r29)
	lw r8,8(r29)
	lw r3,12(r29)
	lw r2,16(r29)
	lw r1,20(r29)
	lw r31,24(r29)
	daddi r29,r29,28
	jr r31

你可能感兴趣的:(计算机系统3,汇编,系统架构)