2016年1月28日星期四

小窥MIPS汇编编程

今天接触了一些MIPS编程,算是入了个门,记录一下。分为三个部分,加减乘除,布尔运算与条件语句,和栈指针的操作。


  • 加减乘除运算


1.1 加法运算4 + 6 和 乘法运算 21 * 2

.text
main:
li $t1, 4
li $t2, 6
add $a0, $t1, $t2
li $v0, 1
syscall

li $t3, 21
li $t4, 2
mul $a0, $t3, $t4
li $v0, 1
syscall

.data

mul和add的结果写进 $a0 中,然后 li $v0, 1 syscall 结束

1.2 加法与乘法混合运算 4 + 7/2

.text
li $a0, 4
li $a1, 7
li $a2, 2
div $a1, $a1, $a2
add $a0, $a1, $a1
li $v0, 1
syscall


.data


  • 布尔运算与条件语句
2.1 true && false


.text

li $t1, 1
li $t2, 0
and $a0, $t1, $t2
li $v0, 1
syscall
.data

2.2 if 3 != 4 then 10 * 2 else 14

.text
li $t1, 3
li $t2, 4
li $t3, 10
li $t4, 2
bne $t1, $t2, goto
li $a0, 14
li $v0, 1
syscall
goto:
mul $a0, $t3, $t4
li $v0, 1
syscall
.data

bne $t1, $t2, goto 若前半句bne判断为真,则执行goto语句(可以视作一个function),否则顺序执行 li $a0, 14

2.3 2 = 3 || 4 <= 2 * 3

.text
li $t1, 2
li $t2, 3
li $t3, 4
li $t4, 2
li $t5, 3
beq $t1, $t2, goto2
mul $t4, $t4, $t5
sub $t3, $t3, $t4
blez $t3, goto2
li $a0, 0
jal print_int
li $v0, 10
syscall
goto2:
li $a0, 1
jal print_int
li $v0, 10
syscall
print_int:
li $v0, 1
syscall
jr $ra

|| 为与或运算,这里我们首先判断左边。若左为真,则直接输出真;若左不为真,则判断右边。

具体的,判断 2 = 3, 我们使用 beq 指令。右边的,MIPS没有直接判断两个数字 <= 的指令,我们使用blez,blez是判断一个数是否小于等于0;所以我们先执行一个减法操作,然后blez判断差与0的关系。

这里还定义了print_int,jal跳转至print_int,li $v0, 1输出真值1,然后 jr $ra 返回 。

给定一个栈,出栈顶两个元素,对其执行加法操作,再重新把结果压进栈里。这里涉及内存地址的读写操作。

.text

main:
add $sp, $sp, -8 
li $a0, 36
li $a1, 6
sw $a0, 0($sp) 
sw $a1, 4($sp)
jal addLast
li $v0, 10
syscall
addLast:
lw $t0, 0($sp)
lw $t1, 4($sp) 
addi $sp, $sp, 8
add $t0, $t0, $t1
addi, $sp, $sp, -4 
sw $t0, 0($sp)
jr $ra
.data

初始化$sp栈顶于 -8。我们将两个数36和6写进 地址为0($sp)和4($sp)里,用sw指令。
addLast方法里,我们将如上两个地址的值读出相加得$t0, 然后栈顶$sp地址减4,$t0写进新的$sp地址里。

刚写完又发现一篇很好的MIPS入门,中文的,比翻官方文档清晰一些。链接在这里

没有评论:

发表评论