MIPS pseudo instructions
source link: https://github.com/MIPT-ILab/mipt-mips/wiki/MIPS-pseudo-instructions
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Pseudo-instructions
In MIPS, some operations can be performed with help of other instructions. The most common operations are unified in pseudo-instructions — they can be coded in assembly language, and assembler will expand them to real instructions. The exact expansion is compiler-defined, but the result should be similar to ours:
Data moves
Name
Assembly syntax
Expansion
Operation in C
move
move $t, $s
or $t, $s, $zero
t = s
clear
clear $t
or $t, $zero, $zero
t = 0
load 16-bit immediate
li $t, C
ori $t, $zero, C_lo
t = C
load 32-bit immediate
li $t, C
lui $t, C_hi
ori $t, $t, C_lo
t = C
load label address
la $t, A
lui $t, A_hi
ori $t, $t, A_lo
t = A
Branches
Name
Assembly syntax
Expansion
branch unconditionally
b C
beq $zero, $zero, C
branch unconditionally
and link
bal C
bgezal $zero, C
branch if greater than
bgt $s, $t, C
slt $at, $t, $s
bne $at, $zero, C
branch if less than
blt $s, $t, C
slt $at, $s, $t
bne $at, $zero, C
branch if greater than
or equal
bge $s, $t, C
slt $at, $s, $t
beq $at, $zero, C
branch if less than
or equal
ble $s, $t, C
slt $at, $t, $s
beq $at, $zero, C
branch if greater than
unsigned
bgtu $s, $t, C
sltu $at, $t, $s
bne $at, $zero, C
branch if zero
beqz $s, C
beq $s, $zero, C
branch if equal to immediate
beq $t, V, C
ori $at, $zero, V
beq $t, $at, C
branch if not equal to immediate
bne $t, V, C
ori $at, $zero, V
bne $t, $at, C
Multiplication/Division
Name
Assembly syntax
Expansion
Operation in C
multiplicate
and return 32 bits
mul $d, $s, $t
mult $s, $t
mflo $d
d = (s * t) & 0xFFFFFFFF
quotient
div $d, $s, $t
div $s, $t
mflo $d
d = s / t
remainder
rem $d, $s, $t
div $s, $t
mfhi $d
d = s % t
Jumps
Name Assembly syntax Expansion Operation in C jump register and link to rajalr $s
jalr $s, $ra
ra = PC + 4; goto s;
Logical operations
Name Assembly syntax Expansion Operation in C notnot $t, $s
nor $t, $s, $zero
t = ~s
No-operations
Name Assembly syntax Expansion Operation in C nopnop
sll $zero, $zero, 0
{}
In fact, every MIPS instruction that has $zero
as its destination and doesn't touch memory, access I/O system, and/or call a trap, can be treated as a nop
; but using sll $zero, $zero, 0
is the most convenient because it's byte code is all-zeroes 0x00000000
.
Should we implement pseudo-instructions
Since 2014/2015, all instructions are printed as real MIPS instructions in MIPT-MIPS. Unexpanded pseudo-instructions are left only in testing traces source files (.s
files).
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK