初詣に行ってきつつ、年末にふと買ってしまったパタヘネ本の 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
ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです