1.8K Views
April 17, 22
スライド概要
1. CPUの内部構造の初歩がわかる
2. 高級言語(C, pythonなど)と、CPUが理解できる命令
(機械語)との関係がわかる
3. CPU内部での命令実行サイクルがわかる
4. CPUがメモリへアクセスする方法は巧みな夫がある
機械系のためのメカトロニクス
内容
1. CPUの概要
①コンピュータの基本構成要素
②内部構造:レジスタ、ALU、BUS
2. CPUへの命令とは何か
①命令(高水準言語と機械語)
②opcodeとoperand(s)
③命令セット
3. 命令の実行のしくみ
1. Instruction とMachine cycle
①ステップ1(Fetch)
②ステップ2(Decode)
③ステップ3(Execute)
④実行結果の状態を示す(PSW)
4. アドレスモード
1. 直接アドレス(direct addressing)
2. 間接アドレス(indirect addressing)
3. レジスタを使ったアドレス指定
①レジスタアドレス
②レジスタ間接アドレス
③レジスタを使ったアドレス修飾
a. インデックスアドレス
b. ベーススアドレス
c. ベースインデックススアドレス
d. 相対アドレス
4. イミーディエイトアドレス
5. プログラムが再配置可能とは
これまでに主に,ロボティクス・メカトロニクス研究,特にロボットハンドと触覚センシングの研究を行ってきました。現在は、機械系の学部生向けのメカトロニクス講義資料、そしてロボティクス研究者向けの触覚技術のサーベイ資料の作成などをしております。最近自作センサの解説を動画で始めました。https://researchmap.jp/read0072509 電気通信大学 名誉教授
第12回コンピュータの原理 メカトロニクス CPU(命令、アドレスモード) 下 条 誠 電気通信大学名誉教授 https://researchmap.jp/read0072509/ 機械系のためのメカトロニクス The University of Electro-Communications Department of Mechanical Engineering and Intelligent System
達成目標 2 1. CPUの内部構造の初歩がわかる 2. 高級言語(C, pythonなど)と、CPUが理解できる命令 (機械語)との関係がわかる 3. CPU内部での命令実行サイクルがわかる 4. CPUがメモリへアクセスする方法は巧みな工夫がある これらのことがわかる 参考のためのスライドです。とばしても構いません。 参考文献:都倉信樹、コンピュータ概論、岩波書店(1992)
内 1. 2. 3. 4. 容 CPUの概要 ① コンピュータの基本構成要素 ② 内部構造:レジスタ、ALU、BUS CPUへの命令とは何か ① 命令(高水準言語と機械語) ② opcodeとoperand(s) ③ 命令セット 命令の実行のしくみ 1. Instruction と Machine cycle ① ステップ1(Fetch) ② ステップ2( Decode) ③ ステップ3(Execute) ④ 実行結果の状態を示す(PSW) アドレスモード 1. 直接アドレス(direct addressing) 2. 間接アドレス(indirect addressing) 3. レジスタを使ったアドレス指定 ① レジスタアドレス ② レジスタ間接アドレス ③ レジスタを使ったアドレス修飾 a. インデックスアドレス b. ベーススアドレス c. ベースインデックススアドレス d. 相対アドレス 4. イミーディエイトアドレス 5. プログラムが再配置可能とは 3 ③ ② ④ ① memory データが格納されてい るメモリへアクセスす る巧みな工夫 アドレスモード
CPUの概要 4
1. CPUの基礎について 5 1. バス(BUS)の説明 2. 算術論理演算器(ALU)の働きとその回路 3. CPUの基礎 ① CPUの内部構造 ② CPUへの命令 ③ アドレス指定モード ④ 実行順序の制御 ⑤ 割込み 4. メモリーの説明 説明は、往年の名機“PDP-11”を参考とする。その考え方 や構造はシンプルであり、後のコンピュータに大きな影響を 与えた。 PDP-11上のオペレーティングシステム (OS) の設計は他 のOS、例えばCP/MやMS-DOSの設計に影響を及ぼしている。 最初の公式にUNIXと名付けられたバージョンのOSは、 1970年に PDP-11/20 上で動作した。PDP-11のプログラ ミング上の低レベルな特徴とC言語の言語要素の類似は非常 によく言われている(wikipedia) PDP-11は16ビットマシンです。ただし、メモ リ番地はバイト単位(8ビット)となっています。
1.0 6 コンピュータの基本構成要素のイメージ 基本構成要素 CPU → 工場 data Memory→倉庫 Bus → 道路 製品の搬入 製品の搬出 製品材料 の格納 CPUの動作 サイクル 製品の製造 材料の搬入 CPU 材料の搬出 工場 Memory data 道路 Bus 倉庫
1.0 コンピュータの基本構成(簡単化したモデル) data Bus 保存 store 実行 execute データの保存 命令解読 decode CPUの動作 サイクル 命令取出し fetch データの読出し Memory NO 割込み処理へ Yes 割込み? interrupt 割込み機能は、メカトロニクス に大変重要な技術 Bus data メモリは、データを記憶する (プログラムもデータの一種) Busは、CPUとメモリの間でデータ のやり取りを行う通信路 7
1.0 コンピュータの基本構成 8 ⚫ CPUはBUSを通して メモリ、周辺機器と データのやり取りを 行う ⚫ CPUは、メモリ、周 辺機器とはアドレス (番地)を用いて データの通信を行う CPUは、各種アーキテク チャがあり、その内部構 造は違ってくる。 ⚫ BUSの通信容量/速 度がコンピュータの 性能を左右する 今回の説明は後のコンピュータ に大きな影響を与えた、往年の 名機“PDP-11”を参考にする PDP-11”の構造はシンプルで あり、その構造は後のコン ピュータに大きな影響を与えた、 往年の名機である。 data Busには、system bus、 Internal bus、 Storage busなど各種別ある
CPU, BUS, Memory, I/O(CPU直結バス例) CPUは、 ①番地を指定して、 ②データの入出力( ③読み/書き指令)を行う 電気を通す配線の束 ① ② ③ CPU直結バス (IBM PC, PDP11 Unibusなど) 9
1.1 CPUの内部構造の話し CPU Memory データ レジスタ 内部バス 制 御 部 命令 instructions 算術演算器 ALU 次では、これらについて簡単に 説明します。 CPUは、 1. データの保持を行うレジスタと 2. 算術論理演算を行うALUと 3. これらをつなぐデータ通信路で ある内部バス、 4. そしてこれらを制御する制御部 により構成されている 10
1.1 CPUの内部構造の話し 11 ⚫ CPUの内部構造を見てみよう RAM レジスタ registor address 内部BUS Bus Address Reg. control Bus Control Reg. SP stack pointer data Bus Data Reg. PC 内部BUS CPU (PDP11) 算術論理演算器 都倉信樹、コンピュータ概論、岩波書店(1992) 状態表示器 内部BUS program counter
1.2 レジスタとは何か 12 ◼ レジスタとは、CPU内部にある高速・小容量なメモリである ◼ 計算結果や途中経過などの保持や、メモリのアドレス修飾などに用いられる 汎用レジスタ 1. 役割が決まっている専用レジ スタと、様々な用途に用いら れる汎用レジスタがある 2. 専用レジスタとして、 ① プログラムカウンタ (PC: Program Counter) ② スタックポインタ (SP:Stack Pointer) SP ③ ステータスレジスタ (SR:Status Register) PC ④ この他、インデックスレジス タ、ベースレジスタ、アキュ ムレータなどがある Status Register
1.2 レジスタの回路構成 13 No.6ディジタル回路でも説明 バス上のデータをタイミングに応じて取込み/保持したり、記憶した内容 をバス上に出力する回路を示す。このような回路はレジスタと呼ばれる。 BUS 16,32,64本など 多数の導線がある Register D Q CK oe D Q CK D …… oe Q CK oe output enable CK ck↑のタイミングでデータバス上のデータを保持 ① ② ③ ④ バスの導線にそれぞれDフリップフロップが接続している D入力は、バス上のデータをCKの立上り↑で取込み保持する Q出力は、oeで制御されるトライステート回路である oe=1でバスに接続し、 oe=0でバスから絶縁状態となる Q出力:Tristate回路 • oe=1でバスに接続 • oe=0でバスから絶縁状態 X 切離される
1.3 ALU (Arithmetic Logic Unit)とは何か 14 ALUは、1)加減演算、2)論理演算、3)状態判定を行う装置である ① 入力A (16bits) A(a15 a14 a13…a2 a1 a0) ② 入力B (16bits) B(b15 b14 b13…b2 b1 b0) A B A入力 ③ 出力G (16bits) G(g15 g14 g13…g2 g1 g0) B入力 1)加減算 D F 出力 ステータス 制御部 入力 演算結果 2)論理演算 3)演算結果の状態判定 を行う G No.11CPU_ALUで説明
1.3 ALUの回路構成 15 No.11CPU_ALUで説明 FA: Full Adder ① N:negative 負数の時“1” ② Z:zero ゼロの時“1” ③ V:overflow オーバーフロー発生“1” ④ C:Carry 最上位からの桁上げ発生“1”
1.4 BUSとは何か 16 No.10 BUSで説明 ⚫ バスとは、例えれば データを運ぶ道路のよ うなもの ⚫ その通行速度が速く、 その道幅(車線)が広 いほど大量のデータを 高速に届けられる ⚫ データの輸送速度がコ ンピュータの性能を決 める バスは、CPU とメモリや周辺 機器の間をつな ぐ通信路である data バスとは、具体的には電気 信号を通す配線の束(16、 32、64本等)である。 Busには、system bus、 Internal bus、 Strage busなど各種別ある
2. CPUへの命令の話し 人間の言葉と機械の言葉 int main{} { int a, b, sum; scanf(“%d, %d”, &a, &b); sum=a+b; printf(“%d/n”, sum); return 0; } ✓ ✓ ✓ ✓ ✓ 人間の書いたプログラムを機械語へ翻訳 命令(セット)と機械語 機械語はどのように実行されていくのか instruction とmachine cycle 命令の実行ステップ 次は、CPUではどのような 処理が行われているか、の話 しをします 17
2. 命令(instruction)とは何か? 18 今回は、CPUでは、どのような処理が行われているか、の話しです ① 命令語とは何か(2.~) ② アドレスモードとは何か(4.~) 人間の言葉と機械の言葉 翻訳 int main{} { int a, b, sum; scanf(“%d, %d”, &a, &b); sum=a+b; printf(“%d/n”, sum); return 0; } 機械語が格納されているメモリへの アクセス方法には多くの種類がある RAM 必要とするデータ をメモリから取出 す いろいろな アクセスモード 1101011111100101 CPUはどのように情報 処理を行う? ①命令語とは何か 命令語が格納されて いるメモリ ②アドレスモードとは何か
2.0 命令とは何か program言語による CPUへの指示 int main{} { int a, b, sum; scanf(“%d, %d”, &a, &b); sum=a+b; printf(“%d/n”, sum); return 0; } 19 機械語 machine instructions 人間が理解 できる命令 CPUが理解 できる命令 1101011111100101 0111010101101101 1101011101100111 0101110101101100 変換が必要 compile 1111010101010011 0101011101101101
2.1 命令(高水準言語と機械語) 高水準言語 compiler 変換 int main{} { int a, b, sum; scanf(“%d, %d”, &a, &b); sum=a+b; printf(“%d/n”, sum); return 0; } 機械語に対応する人間 にも分かる表記コード compiler コンピュータ プログラム High level language assembler プログラム コード Assembly language { 命令1(program instion 1): 命令2(program instion 2): 命令3(program instion 3): 命令4(program instion 4): 命令5(program instion 5) : 命令6(program instion 6): } mnemonic code 1101011111100101 変換 assembler c, c#, c++ java, python, ruby, fortran, cobol 人間にとって理解しや すい構造を持った言語 機械語 変換 CPUが直接理解し実行 することができる命令 機械語 machine instructions 1101011111100101 これ 0111010101101101 1101011101100111 0101110101101100 1111010101010011 0101011101101101 20
2.1 命令(高水準言語と機械語) 高水準言語 Assembly language int main{} { int a, b, sum; sum=a+b; ……. return 0; } …. Add R1,R2 …. BNE Loop Return 機械語 1101011111100101 0111010101101101 1101011101100111 0101110101101100 1111010101010011 0101011101101101 Instruction と Machine cycle ④ memory ③ 機 械 語 ② compiler ① CPU memory 1101011111100101 0111010101101101 1101011101100111 0101110101101100 1111010101010011 0101011101101101 ……. RAM machine instructions ⚫ CPUは機械語を実行する ① 機械語を取出す (fetch) ② 機械語を解読する (decode) ③ 実行する (execute) ④ 保存する (store) 21
2.2 opcodeとoperand(s)について 22 ⚫ 命令(instruction)は、opcodeとoperand(s)から成る opcode 命令(operation) • 加算 • 減算 • 条件分岐 • サブルーチン • ・・・ operand(s) 番地(address)や値 • 命令で操作する対象の番地 (アドレス)や値など • operand(s)は複数個の場合 もある • 0オペランド命令もある (RESETなど) CPUのアーキテクチャによって、見かけは変わりますが、基本の考え方は、 どのプロセッサでもあまり変わりません ISAとして次からの説明 は、往年の名機PDP11の CPUを例に取ります
2.2 opcodeとoperand(s)の例 アセンブリ言語 (mnemonic) ADD R0, R1 機械語 0110 000000 000001 opcode operand 加算 23 R0とR1を加算して、結果をR1に入れる R0+R1→R1 対象は、R0,R1 R0 Before After R0: 0002 R0: 0002 R1: 0004 R1: 0006 R1 CPU (PDP11)
2.2 opcodeとoperand(s) この例では、operand(s)が2つ(の場所)に分れている (sourceとdestination) operands opcode 対応する機械語 ADD R0 source 0110 R1 destination 機械語(machine instruction) 000000 000001 R0+R1→R1 ① 加算命令では、「どれ」と「どれ」を足して、その結果を「何処」 に保存するかが必要になる ② それらの存在する番地を指定する部分が operand(s)である ③ また、その結果を格納する場所がdestinationとなる この例では、 ➢ 「R0」と「R1」が加算の対象となるレジスタ(場所) ➢ 「R1」が格納場所 (destination) となる 24
2.3 命令セット 25 ⚫ CPUが理解できる命令の集合を「命令セット」と呼んでいます ⚫ 代表的な命令セットとしては、「x86」「PowerPC」「MIPS」「ARM」などが あります ⚫ この命令セットの設計の考え方を命令セットアーキテクチャ (ISA Instruction Set Architecture,)と呼びます ⚫ 基本の考え方は、どのプロセッサでもあまり変わりません 高水準言語 python c++ fortran 変換(compiler) ISA c, c# java, コンパイラーは優秀で、 いろいろなCPUのISA に対しても、高級言語 から変換してくれます このためuserは ISAを気にする必 要はありません HardWare assembly language cobol ruby 見かけは変わ りますが
2.3 命令セットの例( PDP11) ① 1オペランド命令 opcode dst opcode source oprand destination oprand ADD R0 R1 ② 2オペランド命令 opcode src dst 0110 ③ 分岐命令 opcode reg dst この命令の機械語。16bit PDP-11は約70の命令を持っている。①~⑥にその命令の例を示す reg ⑥ 0オペランド命令 ① 1オペランド命令: CLR, INC, TST, ROR, JMP… ② 2オペランド命令: MOV, CMP, ADD, BIT, ASH… opcode ③ 分岐命令: BR, BNE, BEQ, BGT, BLT, BPL, … 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 opcode (operation code) src (source operand) dst (destination operand) reg (registor) R0+R1→R1 ② ソース(R0)からの値と送り先(R1)の値を、加算して、 送り先(R1)に保存する ⑤ サブルーチンからの戻り命令 opcode 2オペランド命令例 ① これは②の形式である。opecodeは、 “ADD”で加算を 示し、srcはR0で、dstはR1となる。 offset ④ サブルーチン呼び出し命令 opcode 000000 000001 26 :命令コード :ソース(源) :送り先 :レジスタ ④ サブルーチン呼び出し命令: JSR ⑤ サブルーチンからの戻り命令: RTS ⑥ 0オペランド命令: HALT、 WAIT、 RESET.. (CPUのarchitectureによって変わる。3オペランド命令などもある)
2.3 命令と機械語の例( PDP11) 機械語 ◼ アセンブラ出力リスト Line番号 address 27 アセンブリ言語 machine machine machine code1 code2 code3 5855 031252 000167 000600 5856 031256 013727 177776 …… …… …… 5976 032056 005037 Label 4$: 177572 ENDM: 命令 operand1 JMP ENDM MOV @#PSW, (PC)+ …… …… …… CLR @#SR0 operand2 ◼ 実際のメモリ配置 ✓ 3bits毎に区切り、8進(octal)表示 ✓ addresは16bits (word)毎 0 JMP 031252 000167 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 ENDM 031254 000600 15 14 031256 013727 0 031260 177776 …… …… CLR 032056 005037 @#SR0 032060 177572 032062 …… MOV @#PSW,(PC)+ 8進(octal)表示 0 0 8 7 …. 0 1 0 6 6 8進表示 machine address code …. 0 7 1 PDP-11 word 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 15 14 ✓ ✓ …. 8 7 …. 1 0 命令は、16bits(word)単位を基本に、1単位、2単位、3単位で構成される この例では、JMP、MOVは2単位(2 word)で構成されている
マイクロアーキテクチャ 28 ⚫ マイクロアーキテクチャ:microarchitecture (μarch) • 命令セット(ISA)を、CPU内部でどのように解釈して、どのような制御方式で実行 するかは、“μarch”によって決められる (CPU内部の仕組み) • CPUの設計方式は改良され変化していく。変化するCPU設計方針と命令セット (ISA)の違いをμarchによって吸収する 高水準言語 c++ c, python 命令 assembly language ISA c# μarch μ命令列 ・ ・ ・ HardWare assembly language java, ruby https://ja.wikipedia.org/wiki/マイクロアーキテクチャ Hardware μarch
アセンブリ言語とは アセンブリ言語(assembly language)とは、プログラミング言語の一つで、コン ピュータのCPU(MPU/マイクロプロセッサ)が直接解釈・実行できる機械語(マシ ン語)と正確に対応する命令語で構成された言語です。 機械語に対応し、かつ人間にも理解できる「ニーモニック」(mnemonic)と呼ばれ る短いアルファベットの命令語を用いて記述します。 例)add r1,r2, (”r1とr2を加算する” など) アセンブリ言語は、機械語と一対一の対応があるため、機械語への変換は簡単です。私も1980年 ごろ、この変換プログラム(Assembler)を作成したことが有ります。当時、私はIMSAI 8080を購入 しましたが、プログムから機械語への変換に大変手間がかかっていました。そこで研究室にあっ たPDP11/40を用いて、IMSAI用のアセンブラ言語を機械語に変換するプログラム(Cross Assembler)を作りました。ニーモニックと機械語の対応表を作り、あとプログラムの中のラベル に対応する処理を行うだけで良かったので、codingは1週間もかかりませんでした。しかし、完成 にはデバックを含めると3週間ほどかかった覚えがあります。 29
3.命令の実行のしくみ 30 ⚫ CPUの中でどのように命令が実行されて いくのかを見てみよう RAM CPU Memory 内部BUS レジスタ registor SP PC program counter 内部BUS CPU (PDP11) 算術論理演算器 状態表示器 内部BUS stack pointer
3.1 Instruction と Machine cycle ⚫ CPUはclock cycleにより順次内部処理を進める ④ ③ ② ②命令解読 decode 割込み? ① NO interruput ①命令取出し fetch Yes CPUの動作 周波数 ① ② ③ ④ ③実行 execute ④保存 store 割込み処理へ Clock memory machine cycle fetch decode execute store (write back) machine cycle数はCPU Architectureに依存する ① ② ③ 31
Instruction と Machine cycle ②命令解読 decode ⚫ fetch, decode, execute だけではだめなの? 割込み? NO interruput machine cycle ①命令取出し fetch ③実行 execute Yes 割込み処理へ ⚫ CPUアーキテクチャによる考え方の違いと思われる。 • 例えばMIPSアーキテクチャでは、CPUの内部レジスタ間で演算処理を行い、 結果をメモリに保存するという流れである。この考え方では、 ”fetch, decode, execute, store”が考え方として素直である • いわゆる、RISC系の”Load-Store archictecture”? • 私が参考にしている教科書では、 ”execute”の中にメモリへの書き出しも含 まれているので”fetch, decode, execute”の方が良いという考え方と思わる • 私としては、たいして大きな問題ではないと考える( 5 stepとする説明もあ るようだ ) 注)私の個人的な意見です MIPSアーキテクチャ:アーキテクチャとして美しく、教科書で例としてよく使われている。 実例としてPlayStationなどのCPUにも使われている 32
3.2 ①命令のステップ1(Fetch) プログラムは次のように実行される ADD 0110 1. Fetch: 主記憶にある命令をIRに読込む PC(Program Counter)は、次 に実行する命令番地を示す。 ④ R0 R1 33 R0+R1→ R1 000000 000001 1.fetch ① よって、そのメモリ番地内容 (命令)を読み出す PC(R7) ① BAR←PC(R7) i. trB=1でPC(R7)→IBB →ALUの B入力 ii. ALUのA入力=0として加算 ② iii. ALU出力→IBG→BAR ② メモリからREAD i. BARでメモリ番地指定 ii. データバスにメモリ内容を出 力→BDR ③ PC←PC+2 i. ① ② PC(R7) 注 次の番地を示すために+2) ④ IR(命令レジスタ)に読み込む i. CPU (PDP11) ADD R0,R1 BDR→IBG→IR(命令レジスタ) 主記憶 注)バイトアドレスのため+2(命令は16bit長即ち2バイト)
3.2 ②命令のステップ2( Decode) ADD 2. Decode: 制御部で命令を解釈 0110 R0 R1 R0+R1→ R1 000000 000001 IR(命令レジスタ)の内容を解釈 し、必要な操作信号を生成する。 例えば、 sr ① RR(4bit):データを書込むべきレジ スタを指定 i. ALU出力→IBG ii. sr=1でIBG→R1 ① ② RA(4bit): Aポートへ読出すレジス タを指定 i. trA=1でRA指定レジスタ→IBA ii. R0→IBA→ALUのA入力 ③ RB(4bit): Bポートへ読出すレジス タを指定 i. trB=1でRB指定レジスタ→IBB ii. R1→IBB →ALUのB入力 2.decode CPU (PDP11) この様にデータの流れを制御できる 主記憶 注)R0~R7は汎用レジスタで出口がA,Bある。Aポートは内部バスIBAに、BポートはIBBに接続している。 34
3.3 ③命令のステップ3(Execute) 3. Execute: 制御部で命令を実行 IR(命令レジスタ)の内容を解釈 した結果に基づき、必要な操作 を実行する。例えば、 ① R0→IBA→ALUのA入力 ADD 0110 ④ R0 R1 35 R0+R1→ R1 000000 000001 3.execute ① i. trA=1でRA指定レジスタ→IBA ii. R0→IBA→ALUのA入力 ② ② R1→IBB→ALUのB入力 i. trB=1でRB指定レジスタ→IBB ii. R1→IBB →ALUのB入力 ③ ALUに加算命令を指令 i. ALU制御入力 (x,y,z,u,v) CPU 注 (PDP11) ④ ALU出力→IBG→R1 i. ALU出力→IBG ii. sr=1でIBG→ RR指定レジスタ ① ② ③ iii. IBG→R1 この様にデータの流れを制御できる 主記憶 注)ALUの仕組みで解説した
3.4 ④実行結果の状態を示す(PSW) ALUで算術論理演算を実行した 結果を示す(PSW) ADD 0110 R0 R1 36 R0+R1→ R1 000000 000001 PSW: Program Status Word ① 実行結果の状態を示す 1. N:負数になると“1” 2. Z:ゼロとなると“1” 3. V:オーバーフローで“1” 4. C:最上位からの桁上げで “1” ② CPUの優先度を示す (3bit: 0~7) CPU (PDP11) PSWの構成 (address: FFFE) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 unused * * * T N Z V C 優先度 判定結果 実行結果の 状態を示す 主記憶
4.0 アドレスモードの話し 37 命令(instruction)は、opcode と operand(s) から成る opcode 命令(operation) operand(s) 番地(Address)や値 ②アドレスモード 機械語が格納されて いるメモリへのアク セス方法 例えば、operand(s)の少ないbit数 で、どのようにして広いメモリ空間 を指定するのだろう? Addressing ① ”ADD R0,R1“では命令部 分は4bitで、operandsは 12bitです ② そのアドレス空間は212、 たった4kBです ③ どうすればもっと広いメモ リ空間カバーできるのだろ うか?
4.0 いろいろなモードがある方が便利 38 プログラムはメモリのどこに配置されても動作することが求められる 再配置可能 (relocatable) このためプログラムの分岐命令などでは ➢ プログラム原点からの位置 などで記述される 次では、いろいろなアドレス方法を 解説します。 A_BGN+X JMP A LooP: sum=sun+i B load begin Program Program begin HDD 補助記憶装置 A: TST BNE Loop JMP A ①複数のプログ ラムがメモリ に配置される A: TST ②その配置位置 は常に同じで はない プログラム B 注)特定のハードウェアのI/Oレジスタ、Interrupts Vectorなどでは、絶対番地が必要な場合がある プログラム A プログラム C A-BGN ⚫ そして、このような特徴に対応できるアド レス指定方法が実行順序の制御では便利で ある Memory Address offset ➢ 現在の命令番地からの変位(offset) D C メモリ
4.0 アドレスモード 39 ◼ オペランドは番地(Address)や値を指定する。その番地の指定方式にはいろいろある。 考え方として「直接or間接」そしてレジスタを使った「アドレスの修飾」がある 重要 アドレス指定方式の種類 1. 直接アドレス(direct addressing) 2. 間接アドレス(indirect addressing) 3. レジスタを使ったアドレス指定 4. ① レジスタアドレス(register addressing) ② レジスタ間接アドレス(registor indirect addressing) ③ レジスタを使ったアドレスの修飾 a. インデックスアドレス(index addressing) b. ベースアドレス(base addressing) c. ベースインデックスアドレス(base index addressing) d. 相対アドレス(relative addressing) イミーディエイトアドレス(immediate addressing)
4.1 直接アドレス 40 (direct addressing) ⚫ メモリのアドレスを直接指定 (実効アドレスは、有効アドレスともいう) operand(s) 命令 A Address Memory 1000 1002 ・・・ A 直接指定 プログラムがメモリ上にロードされるとき、そのロード位置は一定ではない。 ただし“A”番地は絶対アドレスであるため、不都合が生じることが有る。 実効アドレス B
4.2 間接アドレス 41 (indirect addressing) ⚫ オペランドの値(A)が指定したメモリのアドレスの内容が実効アドレスとなる (実効アドレスは、有効アドレスともいう) operand(s) 命令 A Address Memory 1000 1002 ・・・ A B B C 間接指定 実効アドレス
4.3 ① レジスタアドレス (register addressing) ⚫ レジスタ(Ra)を直接指定 operand(s) 命令 Ra レジスタ Ra A 直接アドレス指定方式のレジスタ版 直接アドレス指定方式において、 アクセスの対象がレジスタとなる 42
4.3 ② レジスタ間接アドレス 43 (register indirect addressing) ⚫ レジスタ(Ra)を用いて間接的にアドレスを指定する 間接アドレス指定方式において、 アクセスの対象がレジスタとなる operand(s) 命令 Ra レジスタ Address Memory 1000 1002 Ra A ・・・ A 実効アドレス 間接アドレス指定方式のレジスタ版 B
4.3 ③ a.インデックスアドレス (index addressing) ⚫ 先頭位置アドレス(A)とインデックスレジスタ(Ri)を指定する方式 ➢ 配列など連続したデータに、繰り返し同じ命令を行う場合などに使用する ➢ インデックスレジスタには何番目の要素を処理しているかを表す値を記録し、この値を 順次変更して命令を実行する 連続的な領域にアクセスする場合に利用 operand(s) 命令 Ri A 配列等の 先頭位置 Address レジスタ 先頭位置 アドレス Memory 1000 1002 Ri インデックス レジスタ X + 順次変更して配列 などへアクセス (インデックスアドレスは、指標アドレス指定ともいう) A+X ・・・ A+X 実効アドレス B 44
4.3 ③ b.ベーススアドレス (base addressing) ⚫ 相対位置(A)とベースレジスタ(Rb)を指定する方式。 ➢ ベースレジスタには、プログラムをメモリ上にロードした時の先頭のアドレスを記録する ➢ すると、プログラムがメモリ上のどの位置にロードされても、命令の値(A)を変えること なく実行できる operand(s) 命令 Rb X プログラムが再配置可能 相対位置を順次変 更することでプロ グラムへアクセス Address Memory レジスタ 相対位置 1000 1002 Rb ベース レジスタ + A ロードした時の 先頭アドレス (ベースアドレスは、基底アドレス指定ともいう) A+X ・・・ A+X 実効アドレス B 45
4.3 ③ b.ベーススアドレス 46 (base addressing) 1. プログラムは利用時にメモリ上にロードされるため、そのメモリ内での位置は変化する 2. ただし、プログラムはメモリ内のどこにロードされても動作する必要がある 3. ここで図のようにプログラムCで目的のアドレスTargetにアクセスすることを考えよう レジスタRbを基準として、それに変位(X)を加え た値をアドレスとする HDD Address 命令 Rb レジスタ Rb 基底 A_BGN Memory C X A_BGN 変位 + C プログラム A X X+A_BGN ① プログラムCの始めの番地A_BGN をレジスタ Rbに入れる ② それに変位Xを加えた番地とする プログラム Target 1101011111100101 0111010101101101 0110000000000001 0101110101101100 ……. プログラム メモリ B D プログラム A load ⚫ B 補助記憶装置
47 4.3 ③ c.ベースインデックススアドレス (base index addressing) ⚫ インデックスレジスタ(Ri)とベースレジスタ(Rb)を指定する方式 ベースレジスタは「プログラムの開始位置」,インデックスレジスタは 「繰り返しの位置」に対して利用される operand(s) 命令 Rb Ri Address Memory 1000 1002 ・・・ Ri X Rb Y + X+Y X+Y 実効アドレス B
4.3 ③ d.相対アドレス 48 (relative addressing) ⚫ 相対変位(A)とプログラムカウンタ(PC)を指定する方式。 ➢ ベースアドレス指定方式とほぼ同じ。違いはベースレジスタの代わりにプログラムカウンタを 使用している点。 ベースレジスタを持たないとき利用される方式 operand(s) 命令 PC この場合、分岐命令などは、現在実行している命令(PC) からの相対アドレスでプログラムは記述する A Address Memory レジスタ 相対変位 1000 1002 + PC X プログラムカウンタ (自己相対アドレス指定) X+A ・・・ A+X 実効アドレス B
4.4 イミーディエイトアドレス (immediate addressing) ⚫ 命令のオペランド値そのものが対象のデータ operandを番地でなく値として使う operand(s) 命令 A 値として直接演算器へ送られる イミーディエイトアドレス指定方式 (即値アドレス指定方式) 例) ADD #10, R0 “10”+R0→ R0 Before R0: 0020 After R0: 0030 49
4. 5 プログラムが再配置可能とは 50 ◼ 再配置可能 (relocatable) プログラムが、例えばJMPやBEQなどの分岐するメモリ上の番地を、プログラム先頭からの相対位置など で指定しておけば、プログラムをメモリのどこに置いても正常に動作する。このようなプログラムのこと をリロケータブルであるという。 Address Memory C プログラム C 「 3③ b.ベーススアドレス」を参照のこと 5100 プログラム A D プログラム load ⚫ よって、ベースレジスタにプログ ラムの先頭アドレスを設定するこ とで、メモリのどこのアドレスに ロードされても実行可能となる。 A B HDD 補助記憶装置 Rb 5100 ベースレジスタ プログラム B メモリ
51 4.6 PDP11のアドレスモードの話し ⚫ アドレスモードによる実効アドレス指定 1. Operand(s)での、srcやdstでは各々6bit使 う。 3bitsでアドレスモードを、3bitsでR0 ~R7を指定する 2. 右図の例では、”mmm”→”001”は間接アド レスモードとなる。すなわち、R0の内容が実 効アドレスとなる 3. なにが便利か? 例えば、”ADD R1 R0“では 加える数を事前にR0とR1に主記憶から持っ てくる。そしてもう一度、演算結果を主記憶 に書出すことが必要となる 4. 間接アドレスモードでは、レジスタの内容が 実効アドレスとなるため、主記憶上の番地の 内容を一命令で直接操作できる ADD 命令レジスタIR R1 0110 001001 000001 dst src src、dstの 形式 m m m r r r モード指定 レジスタ指定 mmm 000 主なモードの意味 general register addressing レジスタの内容そのもの 001 indirect adressing レジスタの内容が番地 110 私がPDP-11を使い始めたころ、アセンブラ言語が利用言語でし た。そのアドレッシングモードの豊富に感銘を受けた覚えがあ ります。これを使いこなすと驚くほどプログラムを簡単に記述 できました。今回はその一つ間接アドレスについて説明しまし た。各種アドレッシング方式は、現在のCPUでも基本は変わら ず存在します。 @R0 index addressing レジスタの内容を番地に加える PDP-11は特別なベースレジスタを持たない。 このためPCを使った、③ d.相対アドレス (relative addressing)を多く用いる
PDP11のアドレスモード(間接アドレシング例) @R0(R0が示す番地の内容)+R1 → R1 ADD @R0, R1 0110 001000 000001 opcode ① R0に操作対象のメモリ番地を入れておく ② CPUはR0が示すアドレスを読込み加算を行う ➢ 間接アドレスモード 3② レジスタ間接アドレス (register indirect addressing) @R0+R1 → R1 ③ 間接アドレスを用いて広範囲なメモリ番地に アクセスできる Before レジスタ After レジスタ内容 R0 1020 R1 0004 レジスタ レジスタ内容 間接アドレ シング R0 1020 R1 0204 Address Memory Address Memory 1020 0200 1020 0200 16bit=2byte 52
53 PDP11のアドレスモード(immediate例) a. レジスタは auto increment mode ADD #10, R0 10+R0 → R0 0110 010111 000000 opcode a ① ② ③ ④ ⑤ b 3③ d.相対アドレス (relative addressing) ➢ fetch後に b. R7(PC)をアドレス修飾に使う 注)byteアドレスのため PCが示す1020番地の命令を読込む(fetch) するとauto increment mode により、PC+2→PC PCが示す1022番地の値を読込む(fetch) するとauto increment mode により、PC+2→PC 読込んだ即値(10) の加算を実行する、10+R0 → R0 Before After レジスタ レジスタ内容 R0 R7(PC) ② レジスタ レジスタ内容 20 R0 Address Memory 1020 0110010111000000 1022 10 ・・・ レジスタ+2注とする ADD #10,R0 ④ R7(PC) 30 Address Memory 1020 0110010111000000 1022 10 1024 2byte ADD #10,R0
つづく 54
メカトロニクス:アナログとディジタル 現実の世界 計算機の世界 アナログ量 (連続量) デジタル量 (離散量) (電圧、電 流) 物体 位置姿勢 距離 位置、速度、 加速度、力 関節 角度 力 ハンド 位置、速度 把持力 制御量 モータ制御用 電圧電流 今回の 大テーマ デジタル制御 digital control 測定量 Hand 55 ADC Program development 0 0 0 1 1 1 1 ..... 1 1 0 1 1 0 1 1 0 0 1 Filtering、 modeling、 learning DAC Program execution Robot Arm サンプル値 量子化データ 11 10 アナログ量 0 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 01 00 time アナログ信号 連続信号 0 0 0 1 ・・・・ 1 1 1 0 量子化(2bit例) 時間的に離散化 time デジタル量 デジタル信号(2bit例) 21 20