1. 寄存器

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

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

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

lw指令与sw指令的控制信号MemtoReg可以不相同_操作数

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)

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

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

t2,(t2,(t0)                        // 将t0寄存器ram地址的内容,载入t2寄存器(t0寄存器的值是ram地址)
    sw   t2,(t2,(t0)                         // 将t2寄存器的值写入到t0寄存器指定的ram地址
4.1 偏移量操作
 t2,4(t2,4(t0)                    //  将t0寄存器值+4的地址中的数据,装入到t2寄存器
 t2,−4(t2,−4(t0)                  // 将t2寄存器的值写入到地址$t0-4

5. 算术指令

    最多有3个操作数

    操作数只能是寄存器

    所有指令统一是32位

t0,t0,t1, t2//t2//t0 = t1+t1+t2, 这个是有符号的操作
    addu   t0,t0,t1, t2//t2//t0 = t1+t1+t2, 这个是无符号的操作
 t2,t2,t3, t4//t4//t2 = t3−t3−t4,  u表示有符号操作
 t2,t2,t3, 5                   // t2=t2=t3 + 5,    add immediate(不能subi)
 t3,t3,t4                      // 结果保存在hi, lo寄存器
 t3,t3,t4                    // Lo = t3/t3/t4
                                                  // Hi = $t3 %t4

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

t0//t0//t0=Hi
 t1//t1//t1=Lo
 t2,t2,t3                    // t2=t2=t3

6. 控制指令

6.1 Branches(分支, if-else)
    b    target                            // 直接跳转
 t0,t0,t1, target          // if (t0==t0==t1)    条件跳转
 t0,t0,t1, target          // if (t0<t0<t1)    条件跳转
 t0,t0,t1, target          // if (t0<=t0<=t1)    条件跳转
 t0,t0,t1, target          // if (t0>t0>t1)    条件跳转
 t0,t0,t1, target          // if (t0>=t0>=t1)    条件跳转
 t0,t0,t1, target          // if (t0!=t0!=t1)    条件跳转

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

j    target                                // 直接跳转

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

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

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