MIPS64指令集
需要注意的与32位的区别(32为的w:word ----- 64为的d: double):
运算类:add变成dadd,同理sub/mul/div变成dsub/dmul/ddiv
访存: lw变成ld, sw变成sd
寄存器名: S0/S1… 全部变为r0/r1/… / r31
I/O映射表
在符号区域定义的符号的值是当前符号所对应的内存地址,使用的是字节地址
如:
.data
A : .word 32
A的值并不是32,而是其所在的内存位置 0
在.text定义的变量记录的是当前的字地址
.text
Loop: dadd $s0,$s1,$s2
来源:网上资料
64位版本开头以“d”表示,无符号数以“u”结尾,立即数通常以“i”结尾,字节操作以“b”结尾,双字操作以“d”结尾,字操作以“w”结尾
序号 | 伪指令 | 功能 |
1 | .data | start of data segment |
2 | .text | start of code segment |
3 | .code | start of code segment (same as .text) |
4 | .org <n> | start address |
5 | .space <n> | leave n empty bytes |
6 | .asciiz <s> | enters zero terminated ascii string |
7 | .ascii <s> | enter ascii string |
8 | .align <n> | align to n-byte boundary |
9 | .word <n1>,<n2>.. | enters word(s) of data (64-bits) |
10 | .byte <n1>,<n2>.. | enter bytes |
11 | .word16 <n1>,<n2>.. | enters 16 bit number(s) |
12 | .word32 <n1>,<n2>.. | enters 32 bit number(s) |
13 | .double <n1>,<n2>.. | enters floating-point number(s) |
序号 | 指令 | 功能 |
| 访存 |
|
| lb reg,imm(reg) | load byte |
| lbu reg,imm(reg) | load byte unsigned |
| lh reg,imm(reg) | load 16-bit half-word |
| lhu reg,imm(reg) | load 16-bit half word unsigned |
| lw reg,imm(reg) | load 32-bit word |
| lwu reg,imm(reg) | load 32-bit word unsigned |
| ld reg,imm(reg) | load 64-bit double-word |
| l.s freg,imm(reg) | load 32-bit floating-point(single FP ) |
| l.d freg,imm(reg) | load 64-bit floating-point(double FP ) |
| sb reg,imm(reg) | store byte |
| sh reg,imm(reg) | store 16-bit half-word |
| sw reg,imm(reg) | store 32-bit word |
| sd reg,imm(reg) | store 64-bit double-word |
| s.s freg,imm(reg) | store 32-bit floating-point |
| s.d freg,imm(reg) | store 64-bit floating-point |
|
|
|
| 传送 |
|
| movz r1,r2,r3 | If(r3==0) r1=r2 |
| movn reg,reg,reg | move if register not equal to zero |
|
|
|
| mov.s freg,freg | move floating-point(single FP ) |
| mov.d freg,freg | move floating-point(double FP ) |
|
|
|
| mtc1 reg,freg | move data from integer register to FP register |
| mfc1 reg,freg | move data from FP register to integer register |
|
|
|
| lui reg,imm | load upper half of register immediate |
|
|
|
| 算术 |
|
| dadd reg,reg,reg | add integers |
| daddu reg,reg,reg | add integers unsigned |
| daddi reg,reg,imm | add immediate |
| daddui reg,reg,imm | add immediate unsigned( WinMIPS64格式 ) |
| daddiu reg,reg,imm | add immediate unsigned( MIPSsim格式 ) |
| add.s freg,freg,freg | add floating-point(single FP ) |
| add.d freg,freg,freg | add floating-point(double FP ) |
| dsub reg,reg,reg | subtract integers |
| dsubu reg,reg,reg | subtract integers unsigned |
| sub.s freg,freg,freg | subtract floating-point(single FP ) |
| sub.d freg,freg,freg | subtract floating-point(double FP ) |
| dmul reg,reg,reg | signed integer multiplication |
| dmulu reg,reg,reg | unsigned integer multiplication |
| mul.d freg,freg,freg | multiply floating-point |
| ddiv reg,reg,reg | signed integer division |
| ddivu reg,reg,reg | unsigned integer division |
| div.d freg,freg,freg | divide floating-point |
|
|
|
| 逻辑 |
|
| and reg,reg,reg | logical and |
| andi reg,reg,imm | logical and immediate |
| or reg,reg,reg | logical or |
| ori reg,reg,imm | logical or immediate |
| xor reg,reg,reg | logical xor |
| xori reg,reg,imm | exclusive or immediate |
|
|
|
| dsll reg,reg,imm | shift left logical |
| dsllv reg,reg,reg | shift left logical by variable amount |
| dsrl reg,reg,imm | shift right logical |
| dsra reg,reg,imm | shift right arithmetic |
| dsrlv reg,reg,reg | shift right logical by variable amount |
| dsrav reg,reg,reg | shift right arithmetic by variable amount |
|
|
|
| 转换 |
|
| cvt.d.l freg,freg | convert 64-bit integer to a double FP format |
| cvt.l.d freg,freg | convert double FP to a 64-bit integer format |
|
|
|
| 标志 |
|
| slt reg,reg,reg | set if less than |
| dslt reg,reg,reg | set if less than( 教材写错,上条为正确格式 ) |
| sltu reg,reg,reg | set if less than unsigned |
| slti reg,reg,imm | set if less than immediate |
| sltiu reg,reg,imm | set if less than immediate unsigned |
|
|
|
| c.lt.d freg,freg | set FP flag if less than |
| c.eq.d freg,freg | set FP flag if equal to |
| c.le.d freg,freg | set FP flag if less than or equal to |
|
|
|
| 跳转 |
|
| j imm | jump to address (不会保存返回地址) |
| jr reg | jump to address in register (不会保存返回地址) |
| jal imm | 跳转到imm地址并且将返回地址记录在寄存器ra中(会保存) |
| jalr reg | jump and link to address in register (会保存) |
|
|
|
| beqz reg,imm | branch if register is equal to zero |
| bnez reg,imm | branch if register is not equal to zero |
| beq reg,reg,imm | branch if pair of registers are equal |
| bne reg,reg,imm | branch if pair of registers are not equal |
| bc1t imm | branch to address if FP flag is TRUE |
| bc1f imm | branch to address if FP flag is FALSE |
|
|
|
| 控制 |
|
| nop | no operation |
| halt | stops the program |