mips
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" MIPS 指令集合
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|------+--------------+------------------------------------|
| name | type | explanation |
|------+--------------+------------------------------------|
| add | add $1,$2,$3 | $1 = $2+$3 |
| addu | | 无符号数 |
| addi | | |
| and | and $1,$2,$3 | |
| nor | | $1=~($2\|$3) |
| sll | sll $1,$2,10 | $1 = $2 << 10 |
| srl | | |
| sra | | 算术移位 |
|------+--------------+------------------------------------|
| slt | slt $1,$2,$3 | $1 = ($2 < $3) ? 1 : 0 |
| sltu | | $2和$3无符号比较 |
|------+--------------+------------------------------------|
| lw | lw $1,8($2) | $1 = M[$2+8] |
| sw | sw $1,8($2) | M[$2+8] = $1 (四个字节) |
| sh | sh $1,8($2) | M[$2+8] = $1 (两个字节) |
| sb | sb $1,8($2) | M[$2+8] = $1 (一个字节) |
|------+--------------+------------------------------------|
| jr | jr $31 | PC = $31 |
| j | j num | PC = (PC+4)[31..28] ++ num/4 ++ 00 |
| jal | jal num | $31 = PC+4; PC = j num |
|------+--------------+------------------------------------|
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" MIPS 寄存器
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|-------+--------+----------------------------------------|
| name | number | explanation |
|-------+--------+----------------------------------------|
| zero | 0 | 储存0 |
| v0,v1 | 2,3 | 子程序返回值 |
| a0-a3 | 4-7 | 函数调用的参数 |
| t0-t7 | 8-15 | 临时值 |
| s0-s7 | 16-23 | 如果子程序对其更改,最后要把值还原回去 |
| sp | 29 | 堆栈指针 |
| ra | 31 | 子程序返回地址 |
|-------+--------+----------------------------------------|
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" MIPS的寻址方式
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|----------------+----------------+-----------------|
| name | MIPS example | X86 example |
|----------------+----------------+-----------------|
| 立即寻址 | addi $1,$2,100 | MOV AX,0 |
| 直接寻址 | 无 | MOV AX,[200H] |
| 一次间接寻址 | | |
| 寄存器寻址 | add $1,$2,$3 | MOV AX,BX |
| 寄存器间接寻址 | | MOV AX,[BX] |
| 相对寻址 | | MOV AX,[SI+10H] |
| 基址寻址 | | |
| 变址寻址 | | |
|----------------+----------------+-----------------|
相对寻址 : 某个确定的数(PC/寄存器)+指令中的数,不涉及内存
间接寻址 : 指令拿到一个数之后还要到内存里面再去拿另外一个数
基址寻址,变址寻址