Created
January 19, 2024 14:55
-
-
Save nhubbard/0728660d72f243266d128f1ac931c334 to your computer and use it in GitHub Desktop.
MARS assembly spec
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# MARS Assembly Specification | |
## Basic Instructions | |
### Branch | |
* bc1f 1, label | |
* bc1t 1, label | |
* bc1f label | |
* bc1t label | |
* bgez $t1, label | |
* bgezal $t1, label | |
* bgtz $t1, label | |
* beq $t1, $t2, label | |
* blez $t1, label | |
* bltz $t1, label | |
* bltzal $t1, label | |
* bne $t1, $t2, label | |
### Compare | |
* c.eq.d $f2, $f4 | |
* c.eq.d 1, $f2, $f4 | |
* c.lt.d $f2, $f4 | |
* c.lt.d 1, $f2, $f4 | |
* c.le.d $f2, $f4 | |
* c.le.d 1, $f2, $f4 | |
* c.eq.s $f0, $f1 | |
* c.eq.s 1, $f0, $f1 | |
* c.lt.s $f0, $f1 | |
* c.lt.s 1, $f0, $f1 | |
* c.le.s $f0, $f1 | |
* c.le.s 1, $f0, $f1 | |
### Convert | |
* cvt.s.d $f1, $f2 | |
* cvt.w.d $f1, $f2 | |
* cvt.d.s $f2, $f1 | |
* cvt.w.s $f0, $f1 | |
* cvt.d.w $f2, $f1 | |
* cvt.s.w $f0, $f1 | |
### Jump | |
* j target | |
* jal target | |
* jalr $t1, $t2 | |
* jalr $t1 | |
* jr $t1 | |
### Logic | |
* and $t1, $t2, $t3 | |
* andi $t1, $t2, 100 | |
* neg.d $f2, $f4 | |
* neg.s $f0, $f1 | |
* nor $t1, $t2, $t3 | |
* or $t1, $t2, $t3 | |
* ori $t1, $t2, 100 | |
* sll $t1, $t2, 10 | |
* sllv $t1, $t2, $t3 | |
* sra $t1, $t2, 10 | |
* srav $t1, $t2, $t3 | |
* srl $t1, $t2, 10 | |
* srlv $t1, $t2, $t3 | |
* xor $t1, $t2, $t3 | |
* xori $t1, $t2, 100 | |
### Double Math | |
* abs.d $f2, $f4 | |
* add.d $f2, $f4, $f6 | |
* ceil.w.d $f1, $f2 | |
* div.d $f2, $f4, $f6 | |
* floor.w.d $f1, $f2 | |
* mul.d $f2, $f4, $f6 | |
* sqrt.d $f2, $f4 | |
* sub.d $f2, $f4, $f6 | |
* round.w.d $f1, $f2 | |
* trunc.w.d $f1, $f2 | |
### Integer Math | |
* add $t1, $t2, $t3 | |
* addi $t1, $t2, -100 | |
* addiu $t1, $t2, -100 | |
* addu $t1, $t2, $t3 | |
* clo $t1, $t2 | |
* clz $t1, $t2 | |
* div $t1, $t2 | |
* divu $t1, $t2 | |
* mult $t1, $t2 | |
* madd $t1, $t2 | |
* maddu $t1, $t2 | |
* mul $t1, $t2, $t3 | |
* msub $t1, $t2 | |
* msubu $t1, $t2 | |
* multu $t1, $t2 | |
* sub $t1, $t2, $t3 | |
* subu $t1, $t2, $t3 | |
### Float Math | |
* abs.s $f0, $f1 | |
* add.s $f0, $f1, $f3 | |
* ceil.w.s $f0, $f1 | |
* div.s $f0, $f1, $f3 | |
* floor.w.s $f0, $f1 | |
* mul.s $f0, $f0, $f3 | |
* sqrt.s $f0, $f1 | |
* sub.s $f0, $f1, $f3 | |
* round.w.s $f0, $f1 | |
* trunc.w.s $f0, $f1 | |
### Load | |
* lb $t1, -100($t2) | |
* lbu $t1, -100($t2) | |
* ldc1 $f2, -100($t2) | |
* lh $t1, -100($t2) | |
* lhu $t1, -100($t2) | |
* ll $t1, -100($t2) | |
* lui $t1, 100 | |
* lw $t1, -100($t2) | |
* lwc $f1, -100($t2) | |
* lwl $t1, -100($t2) | |
* lwr $t1, -100($t2) | |
### Store | |
* sb $t1, -100($t2) | |
* sc $t1, -100($t2) | |
* sdc $f2, -100($t2) | |
* sh $t1, -100($t2) | |
* sw $t1, -100($t2) | |
* swc1 $f1, -100($t2) | |
* swl $t1, -100($t2) | |
* swr $t1, -100($t2) | |
### Move | |
* movn $t1, $t2, $t3 | |
* movz $t1, $t2, $t3 | |
* mov.d $f2, $f4 | |
* movf.d $f2, $f4, 1 | |
* movt.d $f2, $f4, 1 | |
* movf.d $f2, $f4 | |
* movt.d $f2, $f4 | |
* movn.d $f2, $f4, $t3 | |
* movz.d $f2, $f4, $t3 | |
* mov.s $f0, $f1 | |
* movf.s $f0, $f1, 1 | |
* movt.s $f0, $f1, 1 | |
* movf.s $f0, $f1 | |
* movt.s $f0, $f1 | |
* movn.s $f0, $f1, $t3 | |
* movz.s $f0, $f1, $t3 | |
* mfc0 $t1, 8 | |
* mfc1 $t1, $f1 | |
* mfhi $t1 | |
* mflo $t1 | |
* movf $t1, $t2, 1 | |
* movt $t1, $t2, 1 | |
* movf $t1, $t2 | |
* movt $t1, $t2 | |
* mtc0 $t1, 8 | |
* mtc1 $t1, $f1 | |
* mthi $t1 | |
* mtli $t1 | |
### Set | |
* slt $t1, $t2, $t3 | |
* slti $t1, $t2, -100 | |
* sltiu $t1, $t2, -100 | |
* sltu $t1, $t2, $t3 | |
### System | |
* break 100 | |
* break | |
* syscall | |
* nop | |
### Traps | |
* eret | |
* teq $t1, $t2 | |
* teqi $t1, -100 | |
* tge $t1, $t2 | |
* tgei $t1, -100 | |
* tgeiu $t1, -100 | |
* tgeu $t1, $t2 | |
* tlt $t1, $t2 | |
* tlti $t1, -100 | |
* tltiu $t1, -100 | |
* tltu $t1, $t2 | |
* tne $t1, $t2 | |
* tnei $t1, -100 | |
## Extended/"Pseudo" Instructions | |
**NOTE:** These instructions are not logically grouped like the previous items. They are automatically expanded by the | |
MARS extended instruction parser. | |
* not $t1, $t2 | |
* add $t1, $t2, -100 | |
* add $t1, $t2, 100000 | |
* addu $t1, $t2, 100000 | |
* addi $t1, $t2, 100000 | |
* addiu $t1, $t2, 100000 | |
* sub $t1, $t2, -100 | |
* sub $t1, $t2, 100000 | |
* subu $t1, $t2, 100000 | |
* subi $t1, $t2, -100 | |
* subi $t1, $t2, 100000 | |
* subiu $t1, $t2, 100000 | |
* andi $t1, $t2, 100000 | |
* ori $t1, $t2, 100000 | |
* xori $t1, $t2, 100000 | |
* and $t1, $t2, 100 | |
* or $t1, $t2, 100 | |
* xor $t1, $t2, 100 | |
* and $t1, 100 | |
* or $t1, 100 | |
* xor $t1, 100 | |
* andi $t1, 100 | |
* ori $t1, 100 | |
* xori $t1, 100 | |
* andi $t1, 100000 | |
* ori $t1, 100000 | |
* xori $t1, 100000 | |
* seq $t1, $t2, $t3 | |
* seq $t1, $t2, -100 | |
* seq $t1, $t2, 100000 | |
* sne $t1, $t2, $t3 | |
* sne $t1, $t2, -100 | |
* sne $t1, $t2, 100000 | |
* sge $t1, $t2, $t3 | |
* sge $t1, $t2, -100 | |
* sge $t1, $t2, 100000 | |
* sgeu $t1, $t2, $t3 | |
* sgeu $t1, $t2, -100 | |
* sgeu $t1, $t2, 100000 | |
* sgt $t1, $t2, $t3 | |
* sgt $t1, $t2, -100 | |
* sgt $t1, $t2, 100000 | |
* sgtu $t1, $t2, $t3 | |
* sgtu $t1, $t2, -100 | |
* sgtu $t1, $t2, 100000 | |
* sle $t1, $t2, $t3 | |
* sle $t1, $t2, -100 | |
* sle $t1, $t2, 100000 | |
* sleu $t1, $t2, $t3 | |
* sleu $t1, $t2, -100 | |
* sleu $t1, $t2, 100000 | |
* move $t1, $t2 | |
* abs $t1, $t2 | |
* neg $t1, $t2 | |
* negu $t1, $t2 | |
* b label | |
* beqz $t1, label | |
* bnez $t1, label | |
* beq $t1, -100, label | |
* beq $t1, 100000, label | |
* bne $t1, -100, label | |
* bne $t1, 100000, label | |
* bge $t1, $t2, label | |
* bge $t1, -100, label | |
* bge $t1, 100000, label | |
* bgeu $t1, $t2, label | |
* bgeu $t1, -100, label | |
* bgeu $t1, 100000, label | |
* bgt $t1, $t2, label | |
* bgt $t1, -100, label | |
* bgt $t1, 100000, label | |
* bgtu $t1, $t2, label | |
* bgtu $t1, -100, label | |
* bgtu $t1, 100000, label | |
* ble $t1, $t2, label | |
* ble $t1, -100, label | |
* ble $t1, 100000, label | |
* bleu $t1, $t2, label | |
* bleu $t1, -100, label | |
* bleu $t1, 100000, label | |
* blt $t1, $t2, label | |
* blt $t1, -100, label | |
* blt $t1, 100000, label | |
* bltu $t1, $t2, label | |
* bltu $t1, -100, label | |
* bltu $t1, 100000, label | |
* rol $t1, $t2, $t3 | |
* rol $t1, $t2, 10 | |
* ror $t1, $t2, $t3 | |
* ror $t1, $t2, 10 | |
* mfc1.d $t1, $f2 | |
* mtc1.d $t1, $f2 | |
* mul $t1, $t2, -100 | |
* mul $t1, $t2, 100000 | |
* mulu $t1, $t2, $t3 | |
* mulu $t1, $t2, -100 | |
* mulu $t1, $t2, 100000 | |
* mulo $t1, $t2, $t3 | |
* mulo $t1, $t2, -100 | |
* mulo $t1, $t2, 100000 | |
* mulou $t1, $t2, $t3 | |
* mulou $t1, $t2, -100 | |
* mulou $t1, $t2, 100000 | |
* div $t1, $t2, $t3 | |
* div $t1, $t2, -100 | |
* div $t1, $t2, 100000 | |
* divu $t1, $t2, $t3 | |
* divu $t1, $t2, -100 | |
* divu $t1, $t2, 100000 | |
* rem $t1, $t2, $t3 | |
* rem $t1, $t2, -100 | |
* rem $t1, $t2, 100000 | |
* remu $t1, $t2, $t3 | |
* remu $t1, $t2, -100 | |
* remu $t1, $t2, 100000 | |
* li $t1, -100 | |
* li $t1, 100 | |
* li $t1, 100000 | |
* la $t1, ($t2) | |
* la $t1, -100 | |
* la $t1, 100 | |
* la $t1, 100000 | |
* la $t1, 100($t2) | |
* la $t1, 100000($t2) | |
* la $t1, label | |
* la $t1, label($t2) | |
* la $t1, label+100000 | |
* la $t1, label+100000($t2) | |
* lw $t1, ($t2) | |
* lw $t1, -100 | |
* lw $t1, 100 | |
* lw $t1, 100000 | |
* lw $t1, 100($t2) | |
* lw $t1, 100000($t2) | |
* lw $t1, label | |
* lw $t1, label($t2) | |
* lw $t1, label+100000 | |
* lw $t1, label+100000($t2) | |
* sw $t1, ($t2) | |
* sw $t1, -100 | |
* sw $t1, 100 | |
* sw $t1, 100000 | |
* sw $t1, 100($t2) | |
* sw $t1, 100000($t2) | |
* sw $t1, label | |
* sw $t1, label($t2) | |
* sw $t1, label+100000 | |
* sw $t1, label+100000($t2) | |
* lh $t1, ($t2) | |
* lh $t1, -100 | |
* lh $t1, 100 | |
* lh $t1, 100000 | |
* lh $t1, 100($t2) | |
* lh $t1, 100000($t2) | |
* lh $t1, label | |
* lh $t1, label($t2) | |
* lh $t1, label+100000 | |
* lh $t1, label+100000($t2) | |
* sh $t1, ($t2) | |
* sh $t1, -100 | |
* sh $t1, 100 | |
* sh $t1, 100000 | |
* sh $t1, 100($t2) | |
* sh $t1, 100000($t2) | |
* sh $t1, label | |
* sh $t1, label($t2) | |
* sh $t1, label+100000 | |
* sh $t1, label+100000($t2) | |
* lb $t1, ($t2) | |
* lb $t1, -100 | |
* lb $t1, 100 | |
* lb $t1, 100000 | |
* lb $t1, 100($t2) | |
* lb $t1, 100000($t2) | |
* lb $t1, label | |
* lb $t1, label($t2) | |
* lb $t1, label+100000 | |
* lb $t1, label+100000($t2) | |
* sb $t1, ($t2) | |
* sb $t1, -100 | |
* sb $t1, 100 | |
* sb $t1, 100000 | |
* sb $t1, 100($t2) | |
* sb $t1, 100000($t2) | |
* sb $t1, label | |
* sb $t1, label($t2) | |
* sb $t1, label+100000 | |
* sb $t1, label+100000($t2) | |
* lhu $t1, ($t2) | |
* lhu $t1, -100 | |
* lhu $t1, 100 | |
* lhu $t1, 100000 | |
* lhu $t1, 100($t2) | |
* lhu $t1, 100000($t2) | |
* lhu $t1, label | |
* lhu $t1, label($t2) | |
* lhu $t1, label+100000 | |
* lhu $t1, label+100000($t2) | |
* lbu $t1, ($t2) | |
* lbu $t1, -100 | |
* lbu $t1, 100 | |
* lbu $t1, 100000 | |
* lbu $t1, 100($t2) | |
* lbu $t1, 100000($t2) | |
* lbu $t1, label | |
* lbu $t1, label($t2) | |
* lbu $t1, label+100000 | |
* lbu $t1, label+100000($t2) | |
* lwl $t1, ($t2) | |
* lwl $t1, -100 | |
* lwl $t1, 100 | |
* lwl $t1, 100000 | |
* lwl $t1, 100($t2) | |
* lwl $t1, 100000($t2) | |
* lwl $t1, label | |
* lwl $t1, label($t2) | |
* lwl $t1, label+100000 | |
* lwl $t1, label+100000($t2) | |
* swl $t1, ($t2) | |
* swl $t1, -100 | |
* swl $t1, 100 | |
* swl $t1, 100000 | |
* swl $t1, 100($t2) | |
* swl $t1, 100000($t2) | |
* swl $t1, label | |
* swl $t1, label($t2) | |
* swl $t1, label+100000 | |
* swl $t1, label+100000($t2) | |
* lwr $t1, ($t2) | |
* lwr $t1, -100 | |
* lwr $t1, 100 | |
* lwr $t1, 100000 | |
* lwr $t1, 100($t2) | |
* lwr $t1, 100000($t2) | |
* lwr $t1, label | |
* lwr $t1, label($t2) | |
* lwr $t1, label+100000 | |
* lwr $t1, label+100000($t2) | |
* swr $t1, ($t2) | |
* swr $t1, -100 | |
* swr $t1, 100 | |
* swr $t1, 100000 | |
* swr $t1, 100($t2) | |
* swr $t1, 100000($t2) | |
* swr $t1, label | |
* swr $t1, label($t2) | |
* swr $t1, label+100000 | |
* swr $t1, label+100000($t2) | |
* ll $t1, ($t2) | |
* ll $t1, -100 | |
* ll $t1, 100 | |
* ll $t1, 100000 | |
* ll $t1, 100($t2) | |
* ll $t1, 100000($t2) | |
* ll $t1, label | |
* ll $t1, label($t2) | |
* ll $t1, label+100000 | |
* ll $t1, label+100000($t2) | |
* sc $t1, ($t2) | |
* sc $t1, -100 | |
* sc $t1, 100 | |
* sc $t1, 100000 | |
* sc $t1, 100($t2) | |
* sc $t1, 100000($t2) | |
* sc $t1, label | |
* sc $t1, label($t2) | |
* sc $t1, label+100000 | |
* sc $t1, label+100000($t2) | |
* ulw $t1, -100($t2) | |
* ulh $t1, -100($t2) | |
* ulhu $t1, -100($t2) | |
* ld $t1, -100($t2) | |
* usw $t1, -100($t2) | |
* ush $t1, -100($t2) | |
* sd $t1, -100($t2) | |
* ulw $t1, 100000 | |
* ulw $t1, label | |
* ulw $t1, label+100000 | |
* ulw $t1, ($t2) | |
* ulw $t1, 100000($t2) | |
* ulw $t1, label($t2) | |
* ulw $t1, label+100000($t2) | |
* ulh $t1, 100000 | |
* ulh $t1, label | |
* ulh $t1, label+100000 | |
* ulh $t1, ($t2) | |
* ulh $t1, 100000($t2) | |
* ulh $t1, label($t2) | |
* ulh $t1, label+100000($t2) | |
* ulhu $t1, 100000 | |
* ulhu $t1, label | |
* ulhu $t1, label+100000 | |
* ulhu $t1, ($t2) | |
* ulhu $t1, 100000($t2) | |
* ulhu $t1, label($t2) | |
* ulhu $t1, label+100000($t2) | |
* ld $t1, 100000 | |
* ld $t1, label | |
* ld $t1, label+100000 | |
* ld $t1, ($t2) | |
* ld $t1, 100000($t2) | |
* ld $t1, label($t2) | |
* ld $t1, label+100000($t2) | |
* usw $t1, 100000 | |
* usw $t1, label | |
* usw $t1, label+100000 | |
* usw $t1, ($t2) | |
* usw $t1, 100000($t2) | |
* usw $t1, label($t2) | |
* usw $t1, label+100000($t2) | |
* ush $t1, 100000 | |
* ush $t1, label | |
* ush $t1, label+100000 | |
* ush $t1, ($t2) | |
* ush $t1, 100000($t2) | |
* ush $t1, label($t2) | |
* ush $t1, label+100000($t2) | |
* sd $t1, 100000 | |
* sd $t1, label | |
* sd $t1, label+100000 | |
* sd $t1, ($t2) | |
* sd $t1, 100000($t2) | |
* sd $t1, label($t2) | |
* sd $t1, label+100000($t2) | |
* lwc1 $f1, ($t2) | |
* lwc1 $f1, -100 | |
* lwc1 $f1, 100000 | |
* lwc1 $f1, 100000($t2) | |
* lwc1 $f1, label | |
* lwc1 $f1, label($t2) | |
* lwc1 $f1, label+100000 | |
* lwc1 $f1, label+100000($t2) | |
* ldc1 $f2, ($t2) | |
* ldc1 $f2, -100 | |
* ldc1 $f2, 100000 | |
* ldc1 $f2, 100000($t2) | |
* ldc1 $f2, label | |
* ldc1 $f2, label($t2) | |
* ldc1 $f2, label+100000 | |
* ldc1 $f2, label+100000($t2) | |
* swc1 $f1, ($t2) | |
* swc1 $f1, -100 | |
* swc1 $f1, 100000 | |
* swc1 $f1, 100000($t2) | |
* swc1 $f1, label | |
* swc1 $f1, label($t2) | |
* swc1 $f1, label+100000 | |
* swc1 $f1, label+100000($t2) | |
* sdc1 $f2, ($t2) | |
* sdc1 $f2, -100 | |
* sdc1 $f2, 100000 | |
* sdc1 $f2, 100000($t2) | |
* sdc1 $f2, label | |
* sdc1 $f2, label($t2) | |
* sdc1 $f2, label+100000 | |
* sdc1 $f2, label+100000($t2) | |
* l.s $f1, ($t2) | |
* l.s $f1, -100 | |
* l.s $f1, 100000 | |
* l.s $f1, 100000($t2) | |
* l.s $f1, label | |
* l.s $f1, label($t2) | |
* l.s $f1, label+100000 | |
* l.s $f1, label+100000($t2) | |
* s.s $f1, ($t2) | |
* s.s $f1, -100 | |
* s.s $f1, 100000 | |
* s.s $f1, 100000($t2) | |
* s.s $f1, label | |
* s.s $f1, label($t2) | |
* s.s $f1, label+100000 | |
* s.s $f1, label+100000($t2) | |
* l.d $f2, ($t2) | |
* l.d $f2, -100 | |
* l.d $f2, 100000 | |
* l.d $f2, 100000($t2) | |
* l.d $f2, label | |
* l.d $f2, label($t2) | |
* l.d $f2, label+100000 | |
* l.d $f2, label+100000($t2) | |
* s.d $f2, ($t2) | |
* s.d $f2, -100 | |
* s.d $f2, 100000 | |
* s.d $f2, 100000($t2) | |
* s.d $f2, label | |
* s.d $f2, label($t2) | |
* s.d $f2, label+100000 | |
* s.d $f2, label+100000($t2) | |
Directives | |
======== | |
* .data | |
* .text | |
* .word | |
* .ascii | |
* .asciiz | |
* .byte | |
* .align | |
* .half | |
* .space | |
* .double | |
* .float | |
* .extern | |
* .kdata | |
* .ktext | |
* .globl | |
* .set | |
* .eqv | |
* .macro | |
* .end_macro | |
* .include |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment