MIPS小结


MIPS

1.数据的声明(宏定义)

  • 格式: name: .storage_type value
    var : .word  3           #定义为子类型,初始值为3
    array :  .byte  'a','b'  #定义为字节类型,初始值为两个字符a和b
    array :  .space 40       #定义了一个数组,有40字节大小,可以存储10个整数或者40个字符
    string : .asciiz  "hello world\n"  #定义为字符串,字符串以null结尾
    

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
    

文章作者: yangyang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yangyang !
  目录