MIPS 常用宏定义

这里总结笔者在写 MIPS 时用到的宏定义。

约定

不在代码中使用 $v0$a0 寄存器。

从寄存器输出

有符号整数

1
2
3
4
5
.macro printSintR (%reg)
li $v0, 1
move $a0, %reg
syscall
.end_macro

无符号整数

1
2
3
4
5
.macro printUintR (%reg)
li $v0, 36
move $a0, %reg
syscall
.end_macro

字符

1
2
3
4
5
.macro printCharR(%reg)
li $v0, 11
move $a0, %reg
syscall
.end_macro

字符串

1
2
3
4
5
6
7
8
9
10
11
.macro printStringR(%reg)
li $v0, 4
move $a0, %reg
syscall
.end_macro

.macro printStringA(%string)
li $v0, 4
la $a0, %string
syscall
.end_macro

小数

1
2
3
4
5
6
7
8
9
10
11
.macro printDoubleR(%reg)
li $v0, 3
mov.d $f12, %reg
syscall
.end_macro

.macro printFloatR(%reg)
li $v0, 2
mov.s $f12, %reg
syscall
.end_macro

直接给定输出

有符号整数

1
2
3
4
5
.macro printSint (%int)
li $v0, 1
li $a0, %int
syscall
.end_macro

字符

1
2
3
4
5
.macro printChar(%char)
li $v0, 11
li $a0, %char
syscall
.end_macro

读入

字符

1
2
3
4
5
.macro readChar(%reg)
li $v0, 12
syscall
move %reg, $v0
.end_macro

整数

1
2
3
4
5
.macro readInt(%reg)
li $v0, 5
syscall
move %reg, $v0
.end_macro

字符串

1
2
3
4
5
6
.macro readString(%reg, %maxLen)
li $v0, 8
li $a1, %maxLen
syscall
move %reg, $a0
.end_macro

小数

1
2
3
4
5
6
7
8
9
10
11
.macro readDouble(%reg)
li $v0, 7
syscall
mov.d %reg, $f0
.end_macro

.macro readFloat(%reg)
li $v0, 6
syscall
mov.s %reg, $f0
.end_macro

其他

交换两个整数

1
2
3
4
5
.macro swap(%reg1, %reg2)
xor %reg1, %reg1, %reg2
xor %reg2, %reg2, %reg1
xor %reg1, %reg1, %reg2
.end_macro

结束程序

1
2
3
4
.macro shutdown()
li $v0, 10
syscall
.end_macro