初詣に行ってきつつ、年末にふと買ってしまったパタヘネ本の 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
Pinned Articles
About
ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです
Tags
JavaScript
PowerShell
kibana
elasticsearch
fluentd
nginx
イベント
五十嵐裕美
村川梨衣
logrotate
IoT
Scala
Java
C言語
iputils
ICMP
WUG
mastodon
Swift
AWS
Clock
Windows
アーキテクチャ
PoEAA
iOS
DeviceFarm
プログラミング言語
OS
StepFunctions
Lambda
Serverless
terraform
ポエム
RHEL
ネットワーク
GraphQL
CloudWatch
Linux
Coreutils
network
nc
telnet
LinuxKernel
fpinscala
ELB
IAM
AppSync
EFS
Gradle
english