感觉。。实现一下还是有点意义的。。
用的是MIPS指令集,不造是不是过时了。。
然后参考资料:https://blog.csdn.net/ben_chong/article/details/51794392
实现上不敢用保留寄存器,因为用完貌似需要恢复原寄存器的值,所以全部都用临时寄存器的值
然后遇到了几个问题:
一、变量的定义
主要是在数据段里干,数据段用.data标识
然后定义方式是"变量名: .变量类型 初始值"
eg.a:.word 4
二、输入输出
设置好$v0和$a0的值,然后用syscall就可以了
如何设置参数见参考资料
三、新语法
li即load immediate,加载常数
la即load address,加载地址,主要是.data段里面的地址
四、调式
基本只能靠静态差错
不过可以通过看寄存器的值来判断错误出现的地方,比如在中间将一个无关的寄存器设成一个特定的值,程序错的时候直接看那个寄存器的值判断程序有没有运行到当前位置
其他的就没什么了吧?
主要贴下代码。。
.data
size:.word 100#Max size
array:.space 404
space:.asciiz " "
.text
.globl main
main:
#input
li $v0,5
syscall
sw $v0,size
sll $t6,$v0,2
sub $t7,$t6,4
li $t1,0
input:
li $v0,5
syscall
sw $v0,array($t1)
addi $t1,4
li $t0,0
slt $t0,$t1,$t6
beq $t0,1,input
#sort
li $t1,0
FOR1:
li $t2,0
FOR2:
add $t3,$t2,4
lw $t4,array($t2)
lw $t5,array($t3)
#if array[i]>array[i+1]
li $t0,0
slt $t0,$t5,$t4
bne $t0,1,ENDIF
#swap
sw $t5,array($t2)
sw $t4,array($t3)
ENDIF:
addi $t2,4
li $t0,0
slt $t0,$t2,$t7
beq $t0,1,FOR2
addi $t1,4
li $t0,0
slt $t0,$t1,$t6
beq $t0,1,FOR1
#output
li $t1,0
output:
li $v0,1
lw $a0,array($t1)
syscall
li $v0,4
la $a0,space
syscall
addi $t1,4
li $t0,0
slt $t0,$t1,$t6
beq $t0,1,output
jr $ra