2016-01-03 14:59
2016-01-03 14:59

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