Transcript Document

命令: マシンの言葉
(教科書第3章)
Copyright (C) 2002, 2004 Tsuneo Nakanishi
復習: プログラムとはなにか
プログラム=2進数で表現される命令(機械語)の列
# 1 から $s1 までの和を $s0 に納めるプログラム
add
$s1, $zero, $zero
addi
$s4, $zero, 1
L1:
add
$s1, $s1, $s0
sub
$s0, $s0, $s4
bne
$s0, $s4, L1
# 0 + 0 → $s1(∴ アセンブリ言語
0 → $s1)
# 0 + 1 → $s4(∴ 1 → $s4)
# $s1 + $s0→$s1
# $s0 – 1→$s0
# Jump to L1 if $s0≠0
アセンブラ
00000000000000001000100000100000
00100000000101000000000000000001
00000010001100001000100000100000
00000010000101001000000000100010
00010110000101000000000000000010
機械語
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令と命令セット(1)
命令(instruction): コンピュータへの指示.各コンピュータが理
解できる命令の集まりを命令セット(instruction set)と呼ぶ.
 命令を並べたものがプログラムである.
 命令セットはプロセッサによって異なる.
 この授業では MIPS の命令セットを例にする.
 基本の考え方はどのプロセッサでもあまり変わらない.
 MIPS は PlayStation で使用されているプロセッサ.
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令と命令セット(2)
MIPSの命令セット(R2000/3000):
転送命令
LB, BLU, LH, LHU, LUI, LW, LWL, LWR, SB, SH, SW, SWL, SWR
算術演算命令
ADD, ADDI, ADDIU, ADDU, DIV, DIVU, MULT, MULTU, SLT, SLTI, SLTIU,
SLTU, SUB, SUBU
論理演算命令
AND, ANDI, NOR, OR, ORI, SLL, SLLV, SRA, SRAV, SRL, SRLV, XOR, XORI
分岐命令
BEQ, BGEZ, BGEZAL, BGTZ, BLEZ, BLTZ, BLTZAL, BNE, J, JAL, JALR, JR
その他の命令
BCzF, BCzT, BREAK, CFCz, COPz, CTCz, LWCz, MFC0, MFCz, MFHI, MFLO,
MTC0, MTCz, MTHI, MTL0, RFE, SWCz, SYSCALL, TLBP, TLBR, TLBWI,
TLBWR
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令と命令セット(3)
モトローラの命令セット(68000):
転送命令
EXG, LEA, MOVE, MOVEA, MOVEM, MOVEP, MOVEQ, PEA, SWAP
算術演算命令
ABCD, ADD, ADDA, ADDI, ADDQ, ADDX, CLR, CMP, CMP2, CMPA, CMPI,
CMPM, DIVS, DIVSL, DIVU, DIVUL, EXT, EXTB, MULS, MULU, NBCD, NEG,
NEGX, PACK, SBCD, Scc, SUB, SUBA, SUBI, SUBQ, SUBX, TAS, TST,
UNPK
論理演算命令
AND, ANDI, ASL, ASR, BCHG, BCLR, BSET, BTST, EOR, EORI, LSL, LSR,
NOT, OR, ORI, ROL, ROR, ROXL, ROXR
分岐命令
その他の命令
Bcc, BRA, BSR, CALLM, DBcc, JMP, JSR, LINK, RTD, RTM, RTR, RTS, UNLK
BFCHG, BFCLR, BFEXTS, BFEXTU, BFFF0, BFINS, BFSET, BFTST, BKPT,
CAS, CAS2, CHK, CHK2, cpBcc, cpDBcc, cpGEN, cpRESTORE, cpSAVE,
cpScc, cpTRAPcc, ILLEGAL, MOVEC, MOVES, NOP, RESET, RTE, STOP,
TRAP, TRAPcc, TRAPV
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令と命令セット(4)
インテルの命令セット(x86):
転送命令
BSWAP, LEA, LGS, LSS, LFS, LDS, LES, MOV, MOVSX, MOVZX, POP, POPA,
POPAD, PUSH, PUSHA, PUSHAD, XCHG, XLAT, XLATB
算術演算命令
AAA, ADD, AAM, AAS, ADC, ADD, CBW, CDQ, CMP, CWD, CWDE, DAA, DAS,
DEC, DIV, IDIV, IMUL, INC, MUL, NEG, SBB, SETcc, SUB, XADD
論理演算命令
AND, BSF, BSR, BTC, BTR, BTS, NOT, OR, RCL, RCR, ROL, ROR, SAL, SAR,
SHL, SHR, SHLD, SHRD, TEST, XOR
分岐命令
その他の命令
CALL, ENTER, Jcc, JMP, LEAVE, LOOP, LOOPcond, RET,
ARPL, BOUND, CLC, CLD, CLI, CLTS, CMC, CMPS, CMPSB, CMPSW,
CMPSD, CMPXCHG, HLT, IN, INS, INSB, INSW, INSD, INT, INT0, INVD,
INVLPG, IRET, IRETD, LAHF, LAR, LGDT, LIDT, LLDT, LMSW, LOCK, LODS,
LODSB, LODSW, LODSD, LSL, LTR, MOVS, MOVSB, MOVSW, MOVSD,
NOP, OUT, OUTS, OUTSB, OUTSW, OUTSD, POPF, POPFD, PUSHF,
PUSHFD, REP, REPE, REPZ, REPNE, REPNZ, SAHF, SCAS, SCASB,
SCASW, SCASD, SGDT, SIDT, SLDT, SMSW, STC, STD, STI, STOS, STOSB,
STOSW, STOSD, STR, VERR, VERW, WAIT, WBINVD
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令と命令セット(5)
例1: MIPS の加減算命令
add
sub
ニーモニック
a, b, c
a, b, c
# b + c の結果を a に格納
# b – c の結果を a に格納
オペランド
注釈(コメント)
MIPS の算術/論理演算命令はどれも上記の3オペランド形式
設計原則①: 単純性は規則性につながる.
【注意】上記の MIPS の加減算命令の表記は,後述する内容(レジスタオペラ
ンド)をごまかして説明しているため,本当は正しくない.
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令と命令セット(6)
例1: MIPS の加減算命令
add
sub
a, b, c
a, b, c
# b + c の結果を a に格納
# b – c の結果を a に格納
例2: x86 の加減算命令
add
sub
ニーモニック
a, b
a, b
オペランド
; a + b の結果を a に格納
; a – b の結果を a に格納
注釈(コメント)
Copyright (C) 2002, 2004 Tsuneo Nakanishi
レジスタと主記憶(1)
一般的なコンピュータの内部構造
アドレスバス
データバス
プロセッサ
主記憶
コントローラ
コントローラ
コントローラ
ROM: Read Only Memory
RAM: Randam Access Memory
Copyright (C) 2002, 2004 Tsuneo Nakanishi
レジスタと主記憶(2)
一般的なコンピュータの内部構造
算術演算や論理演算
を実行する.
デコーダ
アドレスバス
ALUで計算されるデータを
記憶する.データは主記憶
から読み込まれ,主記憶に
書き戻される.
PC
レジスタ
小容量&高速アクセス可能
ALU
データバス
主記憶
・
・
・
プログラムの命令と
データを格納.
大容量&アクセス遅延大
Copyright (C) 2002, 2004 Tsuneo Nakanishi
レジスタ(1)
 レジスタのDフリップフロップで構成される.
 プロセッサは,主記憶に格納されているデータよりも,レジスタ
に格納されているデータをより高速に読み書きできる.
 レジスタはプログラミング言語の変数のような使い方をする.
 レジスタは,通常は主記憶に格納されている頻繁に参照されるデータを
一時的に記憶するために使用される.
 レジスタは,複雑な計算の中間結果など,一時的に使用されるデータを
記憶するために使用される.
 プロセッサには限られた数のレジスタしかない.
 MIPS の例: $s0, $s1, …, $s7, $t0, …, $t9 等の名前の32ビット幅の
レジスタを32本.(1ワード = 32bit)
 Intel Pentium の例: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, …,
等の名前の32ビット幅の一般用レジスタを8本.
Copyright (C) 2002, 2004 Tsuneo Nakanishi
レジスタ(2)
直感的にはレジスタの数を増やせば速くなるが・・・
レジスタを増やした.
回路が大きくなった.
配線が長くなって信号の遅延が増えた.
クロックの周波数を落とさざるを得なくなった.
設計原則②: 小型化は高速化につながる.
Copyright (C) 2002, 2004 Tsuneo Nakanishi
主記憶(1)
 主記憶は,順番に番地(アドレス)が振られた,一列に並んだセルである.
 今日では通常,各々のセルは1バイト,すなわち8ビットの二進数を記憶する.
 主記憶は,番地がインデックスになる,巨大な8ビット幅の一次元配列と考え
られる.
 今日は主記憶にはDRAM(Dynamic RAM)が使用されている.
番地
000…000
000…001
000…010
000…011
111…110
111…111
8bit
00101011
10110101
01010000
00010010
・
・
・
10101111
11111101
データ
アドレス選択
DRAMの構造
Copyright (C) 2002, 2004 Tsuneo Nakanishi
主記憶(2)
プロセッサは8ビット幅以上のデータを big-endian か littleendian のいずれかの形式で主記憶に格納する.
 big-endian: MSB側から8bitずつ順番に格納する.(例: MIPS)
 little-endian: LSB側から8bitずつ順番に格納する.(例: Intel
Pentium)
MSB
○
△
□
×
○
△
big-endian
□
×
little-endian
LSB
×
□
△
○
Copyright (C) 2002, 2004 Tsuneo Nakanishi
主記憶(3)
整列化制約: MIPS では,主記憶アクセスの高速化のため,ワー
ドは4の倍数の番地が先頭になるように配置しなければならない.
整列化制約がないと・・・
制御部の複雑化
32bit
0
4
8
12
16
20
1
5
9
13
17
21
2
6
10
14
18
22
3
7
11
15
19
23
アクセス2回!
Copyright (C) 2002, 2004 Tsuneo Nakanishi
MIPSのレジスタオペランド
レジスタをオペランドとする場合:
 MIPS では,0番から31番のレジスタに「$△△」と名前がつけら
れ,利用目的が想定されている.
 プログラム中の変数として使用するレジスタ: $s0, $s1, …, $s7(レジス
タ16番から23番に相当)
 計算の途中結果など一時変数として使用するレジスタ: $t0,$t1, …,
$t7(レジスタ8番から15番に相当)
 レジスタオペランドは,レジスタ名「$△△」をそのまま記述する.
レジスタオペランドを使用する命令の例:
add
sub
$t0, $s1, $s2
$t0, $t0, $t1
# $s1 + $s2 の結果を $t0 に格納
# $t0 – $t1 の結果を $t0 に格納
Copyright (C) 2002, 2004 Tsuneo Nakanishi
MIPS のメモリオペランド
メモリ上の記憶内容をオペランドとする場合:
 MIPS では,メモリオペランドを「n($△△)」と記述し,これは
($△△+n) 番地の内容を意味する.
 $△△ には,任意のレジスタが指定でき,これをベースレジスタと呼ぶ.
 n には,符号つき整数が指定でき,これをオフセットと呼ぶ.
 MIPS では,算術演算命令(add,sub など)でメモリオペランド
は指定できない.(=演算に使うデータはかならずレジスタに置
かなければならない!)
メモリオペランドを使用する命令の例:
lw
sw
$t0, 32($s0)
$t0, –8($s0)
# ($s0 + 32) 番地の内容を $t0 に格納
# ($s0 – 8) 番地に $t0 を格納
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令表現(1)
常識2: 今日のコンピュータは全ての情報を2進数で表現する.
命令も例外ではない!
# 1 から $s1 までの和を $s0 に納めるプログラム
add
$s1, $zero, $zero
addi
$s4, $zero, 1
L1:
add
$s1, $s1, $s0
sub
$s0, $s0, $s4
bne
$s0, $s4, L1
00000000000000001000100000100000
00100000000101000000000000000001
00000010001100001000100000100000
00000010000101001000000000100010
00010110000101000000000000000010
下記の情報を2進数に符号化:
• 命令の種類
• 読み書きされるレジスタ
• 読み書きされる主記憶の番地
• 一緒に計算される値 etc.
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令表現(2)
例)
add
$t0, $s0, $s1
命令語に符号化すべき情報:
 命令の種類: add
 ディスティネーションオペランド: $t0
 ソースオペランド: $s0, $s1
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令表現(3)
例)
add
$t0, $s0, $s1
op
rs
rt
rd
shamt funct
000000 10000 10001 01000 000000 100000
add
$s0 $s1
$t0
100000のときは加算,
100010のときは減算を意味
する.
加算または減算を
意味する.
01000
$t0
10000
$s0
01001
$t1
10001
$s1
…
…
…
…
01111
$t7
10111
$s7
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令表現(4)
例)
lw
$t0, 12($s0)
命令語に符号化すべき情報:
 命令の種類: lw
 ディスティネーションオペランド: $t0
 ベースレジスタ: $s0
 オフセット: +12
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令表現(5)
例)
lw
$t0, 12($s0)
op
rs
rt
address
100011 01000 10000 0000000000001100
lw
$t0
$s0
+12
16bit符号つき整数
(2の補数表現)
–32768~+32767
100011のときは lw,
101011のときは sw を
意味する.
01000
$t0
10000
$s0
01001
$t1
10001
$s1
…
…
…
…
01111
$t7
10111
$s7
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令表現(6)
命令形式: 命令語のフィールド構成.
 MIPS は命令語を32bit 幅で統一している.
 MIPS の命令形式は,R形式,I形式,J形式(後述)の3種類がある.
 どの命令形式かは,op フィールド(命令操作コード)で判別できる.
op
rs
rt
rd
shamt funct
R形式 000000 10000 10001 01000 000000 100000
6bit
5bit
5bit
5bit
6bit
6bit
op
rs
rt
address
I形式 100011 01000 10000 0000000000001100
6bit
5bit
6bit
16bit
Copyright (C) 2002, 2004 Tsuneo Nakanishi
命令表現(7)
命令形式設計のポイント:
 命令形式の種類の数は少なく!
 命令形式には規則性を!
ハードウェアの単純化と高速化
ベースレジスタの番地より –32768 以前,32767 以降のアドレス
にアクセスしたいときは?
設計原則③: すぐれた設計には適度な妥協が必要である.
Copyright (C) 2002, 2004 Tsuneo Nakanishi