mips笔记-指令

1. 寄存器

mips下一共有32个通用寄存器

汇编语言中,寄存器标志以$开头

寄存器的访问,可以直接使用$0..31(如$0),也可以使用define的名字,如下:

2. 程序结构

基本与gcc汇编一致

.data开始定义数据段

.text开始定义代码段

3. 几个常用的汇编指令

如果要访问内存, 只能使用load\stor指令

指令中一些字符的含义:

    b,    一般指byte(1个字节)

    w,    一般指word(4个字节)

3.1 load

    lb reg_dest, ram_src        // 将内存ram_src中的1字节数据载入(load)到reg_dest寄存器

    lw reg_dest, ram_src        // 将内存ram_src中的1个word(4字节)数据载入(load)到reg_dest寄存器

3.2 store

    sb reg_src, ram_dest        // 将reg_src中的一个byte数据写入到ram_dst中

    sw reg_src, ram_dest        // 将reg_src中的一个word数据写入到ram_dst中

3.3 li(load immediate)

    li reg_dest, value                // 加载立即数到寄存器

4. 寻址

4.1 la(load address)

    la $t0, var1                            // 将变量var1的值装入$t0

4.2 间接寻址,地址是寄存器的内容(类似于指针)

    lw    $t2, ($t0)                        // 将t0寄存器ram地址的内容,载入t2寄存器(t0寄存器的值是ram地址)

    sw   $t2, ($t0)                         // 将t2寄存器的值写入到t0寄存器指定的ram地址

4.1 偏移量操作

    lw    $t2,    4($t0)                    //  将t0寄存器值+4的地址中的数据,装入到t2寄存器

    sw    $t2,    -4($t0)                  // 将t2寄存器的值写入到地址$t0-4

5. 算术指令

    最多有3个操作数

    操作数只能是寄存器

    所有指令统一是32位

    add    $t0, $t1, $t2                // $t0 = $t1 + $t2, 这个是有符号的操作

    addu   $t0, $t1, $t2               // $t0 = $t1 + $t2, 这个是无符号的操作

    sub[u] $t2, $t3, $t4               // $t2 = $t3 - $t4,  u表示有符号操作

    addi    $t2, $t3, 5                   // $t2 = $t3 + 5,    add immediate(不能subi)

    mult    $t3, $t4                      // 结果保存在hi, lo寄存器

    div        $t3, $t4                    // Lo = $t3 / $t4

                                                  // Hi = $t3 %t4

Lo, Hi寄存器不支持直接获取,需要使用mfhi, mflo指令

    mfhi    $t0                            // $t0=Hi

    mflo    $t1                            // $t1=Lo

    move    $t2, $t3                    // $t2 = $t3

6. 控制指令

6.1 Branches(分支, if-else)

    b    target                            // 直接跳转

    beq    $t0, $t1, target          // if ($t0==$t1)    条件跳转

    blt    $t0, $t1, target          // if ($t0<$t1)    条件跳转

    ble    $t0, $t1, target          // if ($t0<=$t1)    条件跳转

    bgt    $t0, $t1, target          // if ($t0>$t1)    条件跳转

    bge    $t0, $t1, target          // if ($t0>=$t1)    条件跳转

    bne    $t0, $t1, target          // if ($t0!=$t1)    条件跳转

6.2 Jumps(跳转:while-for-goto)

    j    target                                // 直接跳转

    jr   $t1                                    // 直接跳转到$t1寄存器的地址处

6.3. jump and link子程序调用(需要返回)

    jal    sub_function                    // 调用函数sub_function, 调用前$ra=pc, 保存当前值

posted @ 2022-04-01 14:05  linux_farmer  阅读(322)  评论(0编辑  收藏  举报