初詣に行ってきつつ、年末にふと買ってしまったパタヘネ本の2章を読んでいた。
算術演算
加算命令、減算命令はそれぞれ add
, sub
で、必要なオペランドは3つ。
// f, g, h, i, j をそれぞれレジスタの $s0, $s1, $s2, $s3, $s4 に割りつけたとする
f = (g + h) - (i + j);
// MIPS
add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t0, $t1
データ転送命令
MIPSでは算術演算は必ずレジスタを用いて行われる。レジスタはハードウェアを構成する基本要素であり、高速で処理することができる。ただし、プログラミング言語の変数とは違いレジスタの数は限られている。そのため、MIPSマシンにはメモリとレジスタ間でのデータ転送命令が必要になる。メモリからレジスタへデータを転送する命令はロード lw
と呼ばれる。逆にレジスタからメモリへデータを転送する命令はストア sw
と呼ばれる。MIPSではレジスタ長は32ビットであり、これを語とよぶ。また語アドレスは4の倍数でなければならない(整列化制約)。
// 変数 h, 配列 A のベースアドレスがそれぞれ、レジスタの $2, $3 に割りつけられているとする。
A[12] = h + A[8];
// MIPS
lw $t0, 32($s3) // $t0 = memory[$s3 + 4*8]
add $t0, $s2, $t0 // $t0 = $2 + $t0
sw $t0, 48($3) // memory[$3 + 4*12] = $t0
即値のオペランド
命令操作に定数を使用することが多いので、命令が用意してある。MIPSでは、負の定数も利用できるため即値減算命令は必要ない。
// 変数 h がレジスタの $2 に割りつけられているとする。
h = h + 4
// MIPS
addi $2, $2, 4