MIPS
1.数据的声明(宏定义)
2.syscall指令
> v0寄存器存储操作码,a0存储数据
3.标签label
+ 标签名存储的为特点代码段的起始位置,在跳转指令与分支指令中可以简便地跳转。所以利用标签可以方便我们构造条件语句和循环语句(细节见后文)
4.循环
li $t0 100 # $t0存储循环次数
loop: do sth
addi $t0,$t0,-1 # i--
bgtz $t0,loop # if $t0>0,继续执行循环操作
j loop_end
loop_end:
5.数组
.data
array: .space 40 # 存储这些数需要用到数组,数组需要使用 10 * 4 = 40 字节
# 一个 int 整数需要占用 4 个字节,需要存储 10 个 int 整数
# 因此,array[0] 的地址为 0x00,array[1] 的地址为 0x04
# array[2] 的地址为 0x08,以此类推。
str: .asciiz "The numbers are:\n"
space: .asciiz " "
.text
li $v0,5
syscall # 输入一个整数
move $s0, $v0 # $s0 is n
li $t0, 0 # $t0 循环变量
loop_in:
beq $t0, $s0, loop_in_end # $t0 == $s0 的时候跳出循环
li $v0, 5
syscall # 输入一个整数
sll $t1, $t0, 2 # $t1 = $t0 << 2,即 $t1 = $t0 * 4
sw $v0, array($t1) # 把输入的数存入地址为 array + $t1 的内存中
addi $t0, $t0, 1 # $t0 = $t0 + 1
j loop_in # 跳转到 loop_in
loop_in_end:
la $a0, str
li $v0, 4
syscall # 输出提示信息
li $t0, 0
loop_out:
beq $t0, $s0, loop_out_end
sll $t1, $t0, 2 # $t1 = $t0 << 2,即 $t1 = $t0 * 4
lw $a0, array($t1) # 把内存中地址为 array + $t1 的数取出到 $a0 中
li $v0, 1
syscall # 输出 $a0
la $a0, space
li $v0, 4
syscall # 输出一个空格
addi $t0, $t0, 1
j loop_out
loop_out_end:
li $v0, 10
syscall # 结束程序
- 总体思路为先利用space定义数组大小,接着利用循环逐个读入数组元素,其中array[i]表示为array(t1),t1=4*i
- 利用lw来存储数组元素,利用sw来访问数组元素
6.宏定义
- 不带参数的宏定义:
.macro macro_name
# 代码段
.end_macro
- 带参数的宏定义:
.macro macro_name(%parameter1, %parameter2, ...)
# 代码段
.end_macro