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ビットレジスタが存在する。
Hi
, Lo
: 乗算や除算の結果を格納する。PC
: 実行する命令の位置を格納する。$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 オーバーフロー時は例外を発生させる。 |
R | 0x00 | shamt = 0x00, funct = 0x20 |
addu $rd, $rs, $rt |
$rd = $rs + $rt |
R | 0x00 | shamt = 0x00, funct = 0x21 |
sub $rd, $rs, $rt |
$rd = $rs - $rt オーバーフロー時は例外を発生させる。 |
R | 0x00 | shamt = 0x00, funct = 0x22 |
subu $rd, $rs, $rt |
$rd = $rs - $rt |
R | 0x00 | shamt = 0x00, funct = 0x23 |
and $rd, $rs, $rt |
$rd = $rs & $rt |
R | 0x00 | shamt = 0x00, funct = 0x24 |
or $rd, $rs, $rt |
$rd = $rs | $rt |
R | 0x00 | shamt = 0x00, funct = 0x25 |
xor $rd, $rs, $rt |
$rd = $rs ^ $rt |
R | 0x00 | shamt = 0x00, funct = 0x26 |
nor $rd, $rs, $rt |
$rd = ~($rs | $rt) |
R | 0x00 | shamt = 0x00, funct = 0x27 |
sllv $rd, $rt, $rs |
$rd = $rt << ($rs & 0x1f) |
R | 0x00 | shamt = 0x00, funct = 0x04 |
srlv $rd, $rt, $rs |
$rd = $rt >>> ($rs & 0x1f) (論理シフト) |
R | 0x00 | shamt = 0x00, funct = 0x06 |
srav $rd, $rt, $rs |
$rd = $rt >> ($rs & 0x1f) (算術シフト) |
R | 0x00 | shamt = 0x00, funct = 0x07 |
slt $rd, $rs, $rt |
$rd = $rs < $rt (符号付き整数として比較)真なら1、偽なら0を格納する。 |
R | 0x00 | shamt = 0x00, funct = 0x2a |
sltu $rd, $rs, $rt |
$rd = $rs < $rt (符号なし整数として比較)真なら1、偽なら0を格納する。 |
R | 0x00 | shamt = 0x00, funct = 0x2b |
乗除算命令 | ||||
命令 | 動作 | 形式 | opcode | その他 |
mult $rd, $rs, $rt |
Hi:Lo = $rs * $rt (符号付き整数として乗算)$rd = Lo |
R | 0x00 | shamt = 0x00, funct = 0x18 |
mult $rs, $rt |
Hi:Lo = $rs * $rt (符号付き整数として乗算) |
R | 0x00 | rd = 0x00, shamt = 0x00, funct = 0x18 |
multu $rd, $rs, $rt |
Hi:Lo = $rs * $rt (符号なし整数として乗算)$rd = Lo |
R | 0x00 | shamt = 0x00, funct = 0x19 |
multu $rs, $rt |
Hi:Lo = $rs * $rt (符号なし整数として乗算) |
R | 0x00 | rd = 0x00, shamt = 0x00, funct = 0x19 |
div $rs, $rt |
Lo = $rs / $rt (符号付き整数として除算) |
R | 0x00 | rd = 0x00, shamt = 0x00, funct = 0x1a |
divu $rs, $rt |
Lo = $rs / $rt (符号なし整数として除算) |
R | 0x00 | rd = 0x00, shamt = 0x00, funct = 0x1b |
mfhi $rd |
$rd = Hi |
R | 0x00 | rs = 0x00, rt = 0x00, shamt = 0x00, funct = 0x10 |
mflo $rd |
$rd = Lo |
R | 0x00 | rs = 0x00, rt = 0x00, shamt = 0x00, funct = 0x12 |
即値演算命令 | ||||
命令 | 動作 | 形式 | opcode | その他 |
lui $rt, imm16 |
$rt = imm16 << 16 |
I | 0x0f | rs = 0x00, immediate = imm16 |
addi $rt, $rs, imms |
$rt = $rs + imms オーバーフロー時は例外を発生させる。 |
I | 0x08 | immediate = imms |
addiu $rt, $rs, imms |
$rt = $rs + imms |
I | 0x09 | immediate = imms |
andi $rt, $rs, immz |
$rt = $rs & immz |
I | 0x0c | immediate = immz |
ori $rt, $rs, immz |
$rt = $rs | immz |
I | 0x0d | immediate = immz |
xori $rt, $rs, immz |
$rt = $rs ^ immz |
I | 0x0e | immediate = immz |
sll $rd, $rt, shamt |
$rd = $rt << shamt |
R | 0x00 | rs = 0x00, funct = 0x00 |
srl $rd, $rt, shamt |
$rd = $rt >>> shamt (論理シフト) |
R | 0x00 | rs = 0x00, funct = 0x02 |
sra $rd, $rt, shamt |
$rd = $rt >> shamt (算術シフト) |
R | 0x00 | rs = 0x00, funct = 0x03 |
slti $rt, $rs, imms |
$rt = $rs < imms (符号付き整数として比較)真なら1、偽なら0を格納する。 |
I | 0x0a | immediate = imms |
sltiu $rt, $rs, imms |
$rt = $rs < imms (符号なし整数として比較)即値を符号拡張した結果を、符号なし整数として比較する。 真なら1、偽なら0を格納する。 |
I | 0x0b | immediate = imms |
分岐命令 | ||||
命令 | 動作 | 形式 | opcode | その他 |
beq $rs, $rt, addr |
if ($rs == $rt) PC = addr |
I | 0x04 | addr = PC + 4 + (immediate << 2) |
bne $rs, $rt, addr |
if ($rs != $rt) PC = addr |
I | 0x05 | addr = PC + 4 + (immediate << 2) |
j addr | PC = addr |
J | 0x02 | addr = ((PC + 4) & 0xf0000000) | (immediate << 2) |
jal addr | $31 = PC + 8 |
J | 0x03 | addr = ((PC + 4) & 0xf0000000) | (immediate << 2) |
jr $rs |
PC = $rs |
R | 0x00 | rt = 0x00, rd = 0x00, shamt = 0x00, funct = 0x08 |
jalr $rs |
$31 = PC + 8 |
R | 0x00 | rt = 0x00, rd = 0x1f, shamt = 0x00, funct = 0x09 |
jalr $rd, $rs |
$rd = PC + 8 |
R | 0x00 | rt = 0x00, shamt = 0x00, funct = 0x09 |
メモリアクセス命令 | ||||
命令 | 動作 | 形式 | opcode | その他 |
lb $rt, ($rs) |
$rt = *(int8_t*)$rs |
I | 0x20 | immediate = 0x0000 |
lb $rt, imms($rs) |
$rt = *(int8_t*)($rs + imms) |
I | 0x20 | immediate = imms |
lbu $rt, ($rs) |
$rt = *(uint8_t*)$rs |
I | 0x24 | immediate = 0x0000 |
lbu $rt, imms($rs) |
$rt = *(uint8_t*)($rs + imms) |
I | 0x24 | immediate = imms |
lh $rt, ($rs) |
$rt = *(int16_t*)$rs |
I | 0x21 | immediate = 0x0000 |
lh $rt, imms($rs) |
$rt = *(int16_t*)($rs + imms) |
I | 0x21 | immediate = imms |
lhu $rt, ($rs) |
$rt = *(uint16_t*)$rs |
I | 0x25 | immediate = 0x0000 |
lhu $rt, imms($rs) |
$rt = *(uint16_t*)($rs + imms) |
I | 0x25 | immediate = imms |
lw $rt, ($rs) |
$rt = *(uint32_t*)$rs |
I | 0x23 | immediate = 0x0000 |
lw $rt, imms($rs) |
$rt = *(uint32_t*)($rs + imms) |
I | 0x23 | immediate = imms |
sb $rt, ($rs) |
*(uint8_t*)$rs = $rt |
I | 0x28 | immediate = 0x0000 |
sb $rt, imms($rs) |
*(uint8_t*)($rs + imms) = $rt |
I | 0x28 | immediate = imms |
sh $rt, ($rs) |
*(uint16_t*)$rs = $rt |
I | 0x29 | immediate = 0x0000 |
sh $rt, imms($rs) |
*(uint16_t*)($rs + imms) = $rt |
I | 0x29 | immediate = imms |
sw $rt, ($rs) |
*(uint32_t*)$rs = $rt |
I | 0x2b | immediate = 0x0000 |
sw $rt, imms($rs) |
*(uint32_t*)($rs + imms) = $rt |
I | 0x2b | immediate = imms |
システム命令 | ||||
命令 | 動作 | 形式 | opcode | その他 |
mfc0 $rt, c0reg |
$rt = CP0[c0reg][0] |
C | 0x10 | funct = 0x00, shamt = 0x00, sel = 0x0 |
mfc0 $rt, c0reg, sel |
$rt = CP0[c0reg][sel] |
C | 0x10 | funct = 0x00, shamt = 0x00 |
mtc0 $rt, c0reg |
CP0[c0reg][0] = $rt |
C | 0x10 | funct = 0x04, shamt = 0x00, sel = 0x0 |
mtc0 $rt, c0reg, sel |
CP0[c0reg][sel] = $rt |
C | 0x10 | funct = 0x04, shamt = 0x00 |
ei | 割り込みを許可する (StatusレジスタのIEビットを1にする) | - | - | 0x41606020 |
ei $rt |
変更前のStatusレジスタの値を$rt に格納する割り込みを許可する (StatusレジスタのIEビットを1にする) |
R | 0x10 | rs = 0x0b, rd = 0x0c, shamt = 0x00, funct = 0x20 |
di | 割り込みを禁止する (StatusレジスタのIEビットを0にする) | - | - | 0x41606000 |
di $rt |
変更前のStatusレジスタの値を$rt に格納する割り込みを禁止する (StatusレジスタのIEビットを0にする) |
R | 0x10 | rs = 0x0b, rd = 0x0c, shamt = 0x00, funct = 0x00 |
ehb | 実行ハザードバリア | - | - | 0x000000c0 |
eret | 割込や例外の処理から復帰する | - | - | 0x42000018 |
break | ブレークポイント例外を発生させる | E | 0x00 | code = 0x00000, funct = 0x0d |
break code10 | ブレークポイント例外を発生させる | E | 0x00 | code = code10 << 10, funct = 0x0d |
syscall | システムコール例外を発生させる | E | 0x00 | code = 0x00000, funct = 0x0c |
syscall code20 | システムコール例外を発生させる | E | 0x00 | code = 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 | ||
la $rd, addr | $rd = addr |
lui $rd, addr >> 16 | ||
blt $rs, $rt, addr | if ($rs < $rt) PC = addr |
slt $1, $rs, $rt | ||
bgt $rs, $rt, addr | if ($rs > $rt) PC = addr |
slt $1, $rt, $rs | ||
ble $rs, $rt, addr | if ($rs <= $rt) PC = addr |
slt $1, $rt, $rs | ||
bge $rs, $rt, addr | if ($rs >= $rt) PC = addr |
slt $1, $rs, $rt |
形式名 | 命令の形式 | ||||||
---|---|---|---|---|---|---|---|
3126 | 2521 | 2016 | 1511 | 106 | 53 | 20 | |
R | opcode | rs | rt | rd | shamt | funct | |
I | opcode | rs | rt | immediate | |||
J | opcode | immediate | |||||
C | opcode | funct | rt | c0reg | shamt | sel | |
E | opcode | code | funct |