Skip to content

Instantly share code, notes, and snippets.

@nhubbard
Created January 19, 2024 14:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nhubbard/0728660d72f243266d128f1ac931c334 to your computer and use it in GitHub Desktop.
Save nhubbard/0728660d72f243266d128f1ac931c334 to your computer and use it in GitHub Desktop.
MARS assembly spec
# 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