编写一个简单的终端输出“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检验该程序的语法,如图所示,语法无误。
运行程序,其中terminal窗口如图所示,说明我们的程序成功打印出来Hello World。
课本上的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检验所写的程序语法正确性,无语法错误
运行程序,证明程序成功对数组排序
全部代码如下
.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