MikeAssembler リファレンス - MIPS

アーキテクチャ名

mieru

概要

アーキテクチャ名の由来は MieruEMB Project で使われていることから。

一般的な製品では、PIC32MXシリーズのマイコンなどで使用されている。

レジスタ

以下の32個の32ビットレジスタ (汎用レジスタ) が計算用に使用できる。
MikeAssemblerでは、名前・番号のいずれでも指定できる。 (頭に$が必要である)

名前番号用途要保存
$zero$0 ゼロ固定-
$at$1 アセンブラ用に予約No
$v0, $v1$2, $3 関数の戻り値・式の評価結果No
$a0$a3$4$7 関数の引数No
$t0$t7$8$15 一時データNo
$s0$s7$16$23 保存される一時データYes
$t8, $t9$24, $25 一時データNo
$k0, $k1$26, $27 OSカーネル用に予約No
$gp$28 グローバルポインタYes
$sp$29 スタックポインタYes
$fp$30 フレームポインタYes
$ra$31 リターンアドレス(Yes)

※要保存:関数の処理で値を変えた後、関数から戻る時には呼び出された時の値に戻さないといけない。

さらに、以下の32ビットレジスタが存在する。

$atレジスタの使用可否設定

$atレジスタは疑似命令の処理で使用され、使い方を誤るとデータの破損に繋がる可能性がある。
MikeAssemblerでは、at_usage ディレクティブを用いて$atレジスタ (番号指定の $1 を含む) の使用可否を設定できる。

ディレクティブ設定
at_usage allow$atレジスタの明示的な使用を許可 (警告なし)
at_usage warn$atレジスタの明示的な使用を許可 (警告あり)
at_usage error$atレジスタの明示的な使用を禁止 (エラー)

at_usage は何度でも使用可能であり、書いた位置以降に設定が反映される。
デフォルトは warn (警告ありで許可) である。
大文字・小文字は区別しない。

命令セット

MikeAssemblerでは、以下の命令をサポートしている。
命令およびレジスタ名の大文字・小文字は区別しない。

$rs, $rt, $rd : 汎用レジスタ
imms : 符号付き16ビット整数
immz : 符号なし16ビット整数
imm16 : 16ビット整数 (符号付き・符号なしどちらも可)
imm32 : 32ビット整数 (符号付き・符号なしどちらも可)
shamt : 符号なし5ビット整数
addr : 飛び先のアドレス (符号なし32ビット整数)
c0reg : 符号なし5ビット整数 ($をつけてもよい)
sel : 符号なし3ビット整数
code10 : 例外ハンドラに渡す情報 (符号なし10ビット整数)
code20 : 例外ハンドラに渡す情報 (符号なし20ビット整数)

レジスタ演算命令 (乗除算以外)
命令動作形式opcodeその他
add $rd, $rs, $rt $rd = $rs + $rt
オーバーフロー時は例外を発生させる。
R0x00shamt = 0x00, funct = 0x20
addu $rd, $rs, $rt $rd = $rs + $rt R0x00shamt = 0x00, funct = 0x21
sub $rd, $rs, $rt $rd = $rs - $rt
オーバーフロー時は例外を発生させる。
R0x00shamt = 0x00, funct = 0x22
subu $rd, $rs, $rt $rd = $rs - $rt R0x00shamt = 0x00, funct = 0x23
and $rd, $rs, $rt $rd = $rs & $rt R0x00shamt = 0x00, funct = 0x24
or $rd, $rs, $rt $rd = $rs | $rt R0x00shamt = 0x00, funct = 0x25
xor $rd, $rs, $rt $rd = $rs ^ $rt R0x00shamt = 0x00, funct = 0x26
nor $rd, $rs, $rt $rd = ~($rs | $rt) R0x00shamt = 0x00, funct = 0x27
sllv $rd, $rt, $rs $rd = $rt << ($rs & 0x1f) R0x00shamt = 0x00, funct = 0x04
srlv $rd, $rt, $rs $rd = $rt >>> ($rs & 0x1f) (論理シフト) R0x00shamt = 0x00, funct = 0x06
srav $rd, $rt, $rs $rd = $rt >> ($rs & 0x1f) (算術シフト) R0x00shamt = 0x00, funct = 0x07
slt $rd, $rs, $rt $rd = $rs < $rt (符号付き整数として比較)
真なら1、偽なら0を格納する。
R0x00shamt = 0x00, funct = 0x2a
sltu $rd, $rs, $rt $rd = $rs < $rt (符号なし整数として比較)
真なら1、偽なら0を格納する。
R0x00shamt = 0x00, funct = 0x2b
乗除算命令
命令動作形式opcodeその他
mult $rd, $rs, $rt Hi:Lo = $rs * $rt (符号付き整数として乗算)
$rd = Lo
R0x00shamt = 0x00, funct = 0x18
mult $rs, $rt Hi:Lo = $rs * $rt (符号付き整数として乗算) R0x00rd = 0x00, shamt = 0x00, funct = 0x18
multu $rd, $rs, $rt Hi:Lo = $rs * $rt (符号なし整数として乗算)
$rd = Lo
R0x00shamt = 0x00, funct = 0x19
multu $rs, $rt Hi:Lo = $rs * $rt (符号なし整数として乗算) R0x00rd = 0x00, shamt = 0x00, funct = 0x19
div $rs, $rt Lo = $rs / $rt
Hi = $rs % $rt
(符号付き整数として除算)
R0x00rd = 0x00, shamt = 0x00, funct = 0x1a
divu $rs, $rt Lo = $rs / $rt
Hi = $rs % $rt
(符号なし整数として除算)
R0x00rd = 0x00, shamt = 0x00, funct = 0x1b
mfhi $rd $rd = Hi R0x00rs = 0x00, rt = 0x00, shamt = 0x00, funct = 0x10
mflo $rd $rd = Lo R0x00rs = 0x00, rt = 0x00, shamt = 0x00, funct = 0x12
即値演算命令
命令動作形式opcodeその他
lui $rt, imm16 $rt = imm16 << 16
I0x0frs = 0x00, immediate = imm16
addi $rt, $rs, imms $rt = $rs + imms
オーバーフロー時は例外を発生させる。
I0x08immediate = imms
addiu $rt, $rs, imms $rt = $rs + imms I0x09immediate = imms
andi $rt, $rs, immz $rt = $rs & immz I0x0cimmediate = immz
ori $rt, $rs, immz $rt = $rs | immz I0x0dimmediate = immz
xori $rt, $rs, immz $rt = $rs ^ immz I0x0eimmediate = immz
sll $rd, $rt, shamt $rd = $rt << shamt R0x00rs = 0x00, funct = 0x00
srl $rd, $rt, shamt $rd = $rt >>> shamt (論理シフト) R0x00rs = 0x00, funct = 0x02
sra $rd, $rt, shamt $rd = $rt >> shamt (算術シフト) R0x00rs = 0x00, funct = 0x03
slti $rt, $rs, imms $rt = $rs < imms (符号付き整数として比較)
真なら1、偽なら0を格納する。
I0x0aimmediate = imms
sltiu $rt, $rs, imms $rt = $rs < imms (符号なし整数として比較)
即値を符号拡張した結果を、符号なし整数として比較する。
真なら1、偽なら0を格納する。
I0x0bimmediate = imms
分岐命令
命令動作形式opcodeその他
beq $rs, $rt, addr if ($rs == $rt) PC = addr I0x04addr = PC + 4 + (immediate << 2)
bne $rs, $rt, addr if ($rs != $rt) PC = addr I0x05addr = PC + 4 + (immediate << 2)
j addrPC = addr J0x02addr = ((PC + 4) & 0xf0000000) | (immediate << 2)
jal addr$31 = PC + 8
PC = addr
J0x03addr = ((PC + 4) & 0xf0000000) | (immediate << 2)
jr $rs PC = $rs R0x00rt = 0x00, rd = 0x00, shamt = 0x00, funct = 0x08
jalr $rs $31 = PC + 8
PC = $rs
R0x00rt = 0x00, rd = 0x1f, shamt = 0x00, funct = 0x09
jalr $rd, $rs $rd = PC + 8
PC = $rs
R0x00rt = 0x00, shamt = 0x00, funct = 0x09
メモリアクセス命令
命令動作形式opcodeその他
lb $rt, ($rs) $rt = *(int8_t*)$rs I0x20immediate = 0x0000
lb $rt, imms($rs) $rt = *(int8_t*)($rs + imms) I0x20immediate = imms
lbu $rt, ($rs) $rt = *(uint8_t*)$rs I0x24immediate = 0x0000
lbu $rt, imms($rs) $rt = *(uint8_t*)($rs + imms) I0x24immediate = imms
lh $rt, ($rs) $rt = *(int16_t*)$rs I0x21immediate = 0x0000
lh $rt, imms($rs) $rt = *(int16_t*)($rs + imms) I0x21immediate = imms
lhu $rt, ($rs) $rt = *(uint16_t*)$rs I0x25immediate = 0x0000
lhu $rt, imms($rs) $rt = *(uint16_t*)($rs + imms) I0x25immediate = imms
lw $rt, ($rs) $rt = *(uint32_t*)$rs I0x23immediate = 0x0000
lw $rt, imms($rs) $rt = *(uint32_t*)($rs + imms) I0x23immediate = imms
sb $rt, ($rs) *(uint8_t*)$rs = $rt I0x28immediate = 0x0000
sb $rt, imms($rs) *(uint8_t*)($rs + imms) = $rt I0x28immediate = imms
sh $rt, ($rs) *(uint16_t*)$rs = $rt I0x29immediate = 0x0000
sh $rt, imms($rs) *(uint16_t*)($rs + imms) = $rt I0x29immediate = imms
sw $rt, ($rs) *(uint32_t*)$rs = $rt I0x2bimmediate = 0x0000
sw $rt, imms($rs) *(uint32_t*)($rs + imms) = $rt I0x2bimmediate = imms
システム命令
命令動作形式opcodeその他
mfc0 $rt, c0reg $rt = CP0[c0reg][0] C0x10funct = 0x00, shamt = 0x00, sel = 0x0
mfc0 $rt, c0reg, sel $rt = CP0[c0reg][sel] C0x10funct = 0x00, shamt = 0x00
mtc0 $rt, c0reg CP0[c0reg][0] = $rt C0x10funct = 0x04, shamt = 0x00, sel = 0x0
mtc0 $rt, c0reg, sel CP0[c0reg][sel] = $rt C0x10funct = 0x04, shamt = 0x00
ei割り込みを許可する (StatusレジスタのIEビットを1にする) --0x41606020
ei $rt 変更前のStatusレジスタの値を$rtに格納する
割り込みを許可する (StatusレジスタのIEビットを1にする)
R0x10rs = 0x0b, rd = 0x0c, shamt = 0x00, funct = 0x20
di割り込みを禁止する (StatusレジスタのIEビットを0にする) --0x41606000
di $rt 変更前のStatusレジスタの値を$rtに格納する
割り込みを禁止する (StatusレジスタのIEビットを0にする)
R0x10rs = 0x0b, rd = 0x0c, shamt = 0x00, funct = 0x00
ehb実行ハザードバリア --0x000000c0
eret割込や例外の処理から復帰する --0x42000018
breakブレークポイント例外を発生させる E0x00code = 0x00000, funct = 0x0d
break code10ブレークポイント例外を発生させる E0x00code = code10 << 10, funct = 0x0d
syscallシステムコール例外を発生させる E0x00code = 0x00000, funct = 0x0c
syscall code20システムコール例外を発生させる E0x00code = code20, funct = 0x0c
疑似命令
命令動作展開する命令
nop何もしない sll $0, $0, 0
move $rd, $rs$rd = $rs sll $rd, $rs, 0
li $rd, imm32$rd = imm32 lui $rd, imm32 >> 16
ori $rd, $rd, imm32 & 0xffff
la $rd, addr$rd = addr lui $rd, addr >> 16
ori $rd, $rd, addr & 0xffff
blt $rs, $rt, addrif ($rs < $rt) PC = addr slt $1, $rs, $rt
bne $1, $0, addr
bgt $rs, $rt, addrif ($rs > $rt) PC = addr slt $1, $rt, $rs
bne $1, $0, addr
ble $rs, $rt, addrif ($rs <= $rt) PC = addr slt $1, $rt, $rs
beq $1, $0, addr
bge $rs, $rt, addrif ($rs >= $rt) PC = addr slt $1, $rs, $rt
beq $1, $0, addr

命令の形式

形式名命令の形式
  3126 2521 2016 1511 106 53 20
Ropcodersrtrdshamtfunct
Iopcodersrtimmediate
Jopcodeimmediate
Copcodefunctrtc0regshamtsel
Eopcodecodefunct

データの出典


戻る