我们知道mips的灵活性高,但是可读性差,所以要改变可读性差的问题,我们可以使用宏定义,像写c一样写汇编()。
mips常用宏定义
- 下面是一些常用的宏定义,当然你可以视情况而定,将代码段中重用次数高的,或者是用汇编写意义不太明确的代码写成宏。这样调试的时候,别人和自己看代码的时候,都会舒服许多。
end the program
1 2 3 4 5
| .macro end li $v0, 10 syscall .end_macro
|
write&read类
- 我们知道这些都是靠syscall实现的,所以可以这么来写
- 另外这种带参数的宏使得宏定义具有类似于C函数的特性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| .macro printInt(%src) move $a0, %src li $v0, 1 syscall .end_macro
.macro getInt(%des) li $v0, 5 syscall move %des, $v0 .end_macro 栗子: getInt($s0) printInt($s0)
.macro printStr(%str) .data tmpLabel: .asciiz %str .text li $v0, 4 la $a0, tmpLabel syscall .end_macro 栗子: printStr("Hello CO!")
.macro printStrOf(%src) li $v0, 4 la $a0, %src syscall .end_macro 栗子: .data myStr: .asciiz "Hello CO!" .text printStrOf(myStr)
|
push&pop
- 我们在写函数的时候时常要用到push和pop操作,所以做好写一个宏。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| .macro push(%src) sw %src, 0($sp) subi $sp, $sp, 4 .end_macro
.macro pop(%des) addi $sp, $sp, 4 lw %des, 0($sp) .end_macro 栗子: fun: push($ra) push($s0) push($t0) ... pop($t0) pop($s0) pop($ra) jr $ra
|
getIndex类
- 常见的有get二维数组(矩阵)的系数,还有数组的系数
1 2 3 4 5 6 7 8 9 10 11 12
| .macro get_vector_index(%index, %x) sll %index, %x, 2 .end_macro
.macro get_matrix_Index(%ans, %i, %j) li %ans, your_number_of_columns multu %i, %ans mflo %ans add %ans, %ans, %j sll %ans, %ans, 2 .end_macro
|
待补充