初詣に行ってきた

初詣に行ってきつつ、年末にふと買ってしまったパタヘネ本の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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です