kagamicomput201807

S
東北大学 工学部 機械知能・航空工学科
2018年度 クラスC3 D1 D2 D3
情報科学基礎 I
大学院情報科学研究科
鏡 慎吾
http://www.ic.is.tohoku.ac.jp/~swk/lecture/
7. MIPSの命令と動作 ― 分岐・ジャンプ・関数呼出し
(教科書7章
命令一覧は p.113)
2鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
分岐・ジャンプ命令
条件文や繰り返し文などを実現するには,命令の実行順の制御
が必要
(C言語)
(MIPSアセンブリ言語)
if (x == y) {
x = x + 1;
}
...
bne $s0, $s1, L1 # $s0 ≠ $s1 ならば L1 へ分岐
addu $s0, $s0, 1
L1: ...
ただし,変数 x, y の内容がそれぞれレジスタ
s0, s1 に置かれているとする
ラベル
3鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
資料: 主な分岐命令,比較命令
命令 説明
beq $a, $b, L $a = $b ならばラベル L へ分岐 (branch on equal)
bne $a, $b, L $a ≠$b 〃 (branch on not equal)
slt $c, $a, $b 符号つきで $a < $b ならば $c ← 1; さもなくば $c ← 0
sltu $c, $a, $b 符号無しで $a < $b ならば $c ← 1; さもなくば $c ← 0
sgt $c, $a, $b 符号つきで $a > $b 〃 (set on greater than)
sgtu $c, $a, $b 符号無しで $a > $b 〃 (set on greater than unsigned)
sle $c, $a, $b 符号つきで $a≦$b 〃 (set on less than or equal)
sleu $c, $a, $b 符号無しで $a≦$b 〃 (set on less than or equal unsigned)
sge $c, $a, $b 符号つきで $a≧$b 〃 (set on greater than or equal)
sgeu $c, $a, $b 符号無しで $a≧$b 〃 (set on greater than or equal unsigned)
•slt, sltu 以外の比較命令はマクロ命令
4鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
例: if – else 文
if (x < y) {
x = x + 1;
} else {
x = x + 2;
}
...
slt $t0, $s0, $s1
beq $t0, $zero, L1 # $s0 < $s1 でないならL1へ分岐
addu $s0, $s0, 1
j L2 # 無条件に L2 へジャンプ
L1: addu $s0, $s0, 2
L2: ...
(C言語)
(MIPSアセンブリ言語)
ただし,変数 x, y の内容がそれぞれレジスタ
s0, s1 に置かれているとする
5鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
例: while文
while (x < y) {
x = x + 1;
}
L1: slt $t0, $s0, $s1 # x < y なら $t0 ← 1; さもなくば $t0 ← 0
beq $t0, $zero, L2 # 比較結果が偽(ゼロ)なら L2 へ
addu $s0, $s0, 1 # x ← x + 1
j L1
L2: ...
(C言語)
(MIPSアセンブリ言語)
ただし,変数 x, y の内容がそれぞれレジスタ
s0, s1 に置かれているとする
6鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
関数呼出し
int func(int a, int b) {
a = a + b;
return a;
}
int main() {
int x, y, z;
x = func(5, 1);
y = func(8, 2);
z = func(x, y);
...
}
(C言語)
ただし,関数main内の変数 x, y, z の内
容がそれぞれレジスタ s0, s1, s2 に置か
れているとする
関数呼出しは単に j 命令でジャンプ
するだけでは実現できない
(元の位置に戻って来る必要がある)
7鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
関数呼出しの実行例
func: addu $a0, $a0, $a1
move $v0, $a0 # 戻り値には $v0, $v1 を使う
jr $ra # $ra のアドレスへジャンプ
main: # 初期化省略
li $a0, 5 # 引数には $a0~$a3 を使う
li $a1, 1
jal func # func へジャンプし,戻り先アドレスを $ra へ
move $s0, $v0
li $a0, 8
li $a1, 2
jal func
move $s1, $v0
move $a0, $s0
move $a1, $s1
jal func
move $s2, $v0
(MIPSアセンブリ言語)
8鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
資料: 主なジャンプ命令
命令 説明
j L ラベル L へジャンプ (jump)
jal L ラベル L へジャンプすると同時に,次の命令アドレ
スを $ra ($31) に保存
(jump and link)
jr $r レジスタ r に保存されたアドレスへジャンプ
(jump register)
9鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
分岐・ジャンプ命令の動作
メモリ
32ビットALU
32x32ビット
レジスタ
PC
命令デコーダ
アドレス(32ビット)
データ(8, 16, 32ビット)
次PC計算
制御回路
mux
mux
(1) レジスタ
読み出し
(2) 分岐判定
(3) 分岐先アドレス計算
10鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
参考: 「次PC計算」の処理
分岐条件が成立していないなら,
• PC + 4
成立しているなら,
• 条件分岐命令のとき:
PC + 4 £ 定数フィールド値
• ジャンプ命令のとき:
PC の下位28ビットを 4 £ 定数フィールド値 で置換
※ 命令長は常に4バイトなので,分岐・ジャンプ先のアドレスは必ず
4の倍数になる
※ この講義では「遅延分岐」は無視する
11鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
MIPS の命令フォーマット
MIPSの命令は基本的に以下の3フォーマットに分類される
31 26 25 21 20 16 15 11 10 6 5 0
funcOP rs rt rd シフト量
31 26 25 21 20 16 15 0
OP rs rt 定数(即値 / アドレスオフセット)
31 26 25 0
OP 定数(ジャンプ先)
R形式
I形式
J形式
レジスタ間演算,シフト命令(即値版も含む)など
レジスタ-即値間演算,ロード・ストア,分岐命令など
ジャンプ命令など
12鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
実際の関数呼出し
前の関数呼出しの例は,簡単に済むように巧妙に作られた例
である.実際には以下のようなことを考えなくてはならない.
• 呼出された関数はどのレジスタを使えばよいのか? 特に,呼
出された関数が呼出し元のレジスタを破壊しないためにはど
うすればよいのか?
• ra は一つしかないが,関数を多重で呼出す場合は?
• 4つを超える引数の受け渡しは?
これらはスタックと呼ばれるデータ構造をメモリ内に構築することで
取り扱われる
関数呼出時のプログラムの流れ
13鏡 慎吾 (東北大学): 計算機工学 2017 (7)
int g() {
…
}
int f() {
…
g();
}
int main() {
…
f();
…
}
main
f呼出
$s0 を使っており,f の呼出
後も使い続けるとする
こちらでも
$s0 を使うと
どうなる?f の呼出時に
$ra がセット
される
g の呼出時に
$ra は上書きさ
れてしまう
g呼出 リターン
リターン
14鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
スタックメモリ
0x8020
0x8010
0x8000
$sp 0x8020
0x8020
0x8010
0x800c
0x8000
$sp 0x800c $sp 0x8020
int f() {
g();
}
f() の
スタック
フレーム
g() の
スタック
フレーム
f() の
スタック
フレーム 0x8020
0x8010
0x8000
f() の
スタック
フレーム
push pop
addu $sp, $sp, -20 addu $sp, $sp, 20
MIPSの場合のレジスタ・スタック利用ルール
15鏡 慎吾 (東北大学): 計算機工学 2017 (7)
• 関数呼出時のレジスタ利用規約
• t0~t9 は,壊されたくないなら呼出し側がスタックに退避
(すなわち,主にテンポラリ用と想定されている)
• s0~s8 は,呼出された側が使いたいならスタックに退避
してリターン時に原状回復する
• 関数を多重で呼出す場合は ra もスタックに退避
• 4つを超える引数はスタックに積んでから関数を呼出す
16鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
典型的なメモリマップ
スタックポインタ
($sp)
スタック
(局所変数)
低位アドレス↓
高位アドレス↑
プログラム
大域変数・静的変数等
int global_var;
void func() {
int a, b;
static int static_var;
...
}
int main() {
int x, y;
int *p = (int *) malloc(256);
}
動的確保領域
グローバルポインタ
($gp)
例: ポケットモンスター 「5かい」バグ
17鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
ゲームボーイ用ゲーム「ポケットモンスター 赤」「ポケットモンスター
緑」 (任天堂, 1996) には,プレイヤが保有している道具やポケモ
ン(ゲーム世界内の架空生物)などを並べ替える機能があったが,
この機能の実装に不具合があり,特定の操作によって本来は存在
しないはずの道具(俗に「バグアイテム」)を入手することができた.
道具を使ったときに生じる効果は,道具ごとに定められているアド
レスに対する呼出しによって実現されており,バグアイテムを使用
すると想定外のアドレスへの呼出しが生じた.特に「5かい」という
名称で表示されるバグアイテムの場合は,呼出されるアドレス以
降がポケモンの種類やその状態等を保持するメモリ領域となって
おり,プレイヤがある程度自由に設定することができた.結果とし
て,任意のプログラムを作成し実行することが可能となっていた.
18鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
https://www.youtube.com/watch?v=IJ7mRJISeO0
19鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
https://www.youtube.com/watch?v=baXxP6b7ANQ
20鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
例: バッファ・オーバラン攻撃
int getnum() {
char buf[8];
gets(buf); /* 入力文字列を配列 buf に保存 */
return atoi(buf); /* 文字列 → 整数 */
}
buf
return
address
低位アドレス↓
高位アドレス↑
getNum() の
スタックフレーム
sp
このような問題があるので,gets,
scanf のように配列長を指定せ
ずに入力を読み込む関数は,使
用が推奨されない
21鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
例題(1)
以下に示すプログラムは,ある値を2 進数で表した際に,その中に
含まれる「1」のビットの数を数えるものである.
lw $s0, 0($s1)
move $t0, $zero
L1: and $t1, $s0, 1
addu $t0, $t0, $t1
srl $s0, $s0, 1
bne $s0, $zero, L1
sw $t0, 0($s1)
レジスタ $s1 の内容が指すアドレスに値13 が格納されている状
態でこのプログラムを実行した.
(1) 実行終了時の,レジスタ $s0,$t0,$t1 の内容を示せ.
(2) ラベルL1 で指される命令は,何回実行されるか答えよ.
22鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
解答例
lw $s0, 0($s1)
move $t0, $zero
L1:
and $t1, $s0, 1
addu $t0, $t0, $t1
srl $s0, $s0, 1
bne $s0, $zero, L1
sw $t0, 0($s1)
(1) $s0 は計算対象で,1ビットずつシフトして行き,最後は 0 になる
$t0 は最終結果で,ビット1の数になる.よって 3
$t1 は計算途中で使用し,ループごとに $s0 の最下位ビットを取
り出すのに使われる.最後は 1 になる
(2) 4回
$s0 = mem[$s1 + 0]; /* = 12 */
$t0 = 0;
do {
$t1 = $s0 & 1;
$t0 = $t0 + $t1;
$s0 = $s0 >> 1;
} while ($s0 != 0);
mem[$s1 + 0] = $t0;
23鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
例題(2)
move $v0, $zero
L1: lw $t0, 0($s0) … (※1)
sltu $t1, $v0, $t0
beq $t1, $zero, L2
move $v0, $t0 … (※2)
L2: addu $s0, $s0, 4
addu $s1, $s1, -1
bne $s1, $zero, L1
以下に示すプログラムは配列の中から最大値を探すものである.
いま,符号なし整数 (4バイト) が,メモリ上のアドレスが増える方向に
10, 20, 3, 22, 5
の順に並んでおり,この配列の先頭アドレスを $s0, 配列長 5 を $s1 に与えて
このプログラムを実行した.
(1) プログラムの実行が終わった時点でのレジスタ $s1, $v0, $t0, $t1 の内容を
示せ.
(2) ※1 及び ※2 の命令がそれぞれ何回実行されるか答えよ.
24鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
解答例
move $v0, $zero
L1: lw $t0, 0($s0)
sltu $t1, $v0, $t0
beq $t1, $zero, L2
move $v0, $t0
L2: addu $s0, $s0, 4
addu $s1, $s1, -1
bne $s1, $zero, L1
$v0 = 0;
do {
$t0 = mem[$s0 + 0];
if ($v0 < $t0) {
$v0 = $t0;
}
$s0 = $s0 + 4;
$s1 = $s1 – 1;
} while ($s1 != 0)
(1) $s1は処理すべき配列要素の残り数で,終了時は0になる.$v0 はその時
点までの最大値を保持するレジスタで,終了時は全体の最大値22になる.
$t0 は読み出した配列要素を格納するレジスタで,終了時は最後の要素 5
になる.$t1 は,それまでの最大値が読み出した配列要素より小さければ
1になるレジスタで(これが0のときはL2に分岐するため,最大値の更新が
スキップされる),最後のループでは 0 になる.
(2) ※1 は,配列長が5なので5回実行される.※2 は,最大値を更新するとき
のみ実行されるため3回実行される.
25鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
例題(3)
move $s2, $zero
L1: lw $t0, 0($s0)
addu $s1, $s1, -1
addu $s2, $s2, $t0
addu $s0, $s0, 4
bne $s1, $zero, L1
以下に示すプログラムは配列の内容の総和をレジスタ $s2 に返すものである.
いま,整数 (4バイト) の配列の先頭アドレスをレジスタ $s0 に,配列長 1000 を
レジスタ $s1 に与え,このプログラムを実行した.
(1) プログラムの実行が終わった時点でのレジスタ $s1 の内容を示せ.
(2) ラベル L1 で指されるlw命令は,何回実行されるか答えよ.
(3) このプログラム全体で,いくつの命令が実行されるか答えよ.(同じ命令が
2 回実行される場合,2 命令と数える)
26鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1)
解答例
(1) $s1は処理すべき配列要素の残り数で,終了時は0になる.
(2) 配列要素を読み出す命令で,配列長分の1000回実行される.
(3) 最初の move 命令は1回だけ,他の5命令は1000回実行され
るので,合計5001命令が実行される.
1 de 26

Recomendados

kagami_comput2015_7 por
kagami_comput2015_7kagami_comput2015_7
kagami_comput2015_7swkagami
399 vistas21 diapositivas
kagami_comput2016_07 por
kagami_comput2016_07kagami_comput2016_07
kagami_comput2016_07swkagami
857 vistas22 diapositivas
kagami_comput2016_02 por
kagami_comput2016_02kagami_comput2016_02
kagami_comput2016_02swkagami
643 vistas20 diapositivas
Usp友の会勉強会、ジャクソン構造図の巻(前編) por
Usp友の会勉強会、ジャクソン構造図の巻(前編)Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)umidori
4.5K vistas73 diapositivas
Usp友の会勉強会、ジャクソン構造図の巻(後編) por
Usp友の会勉強会、ジャクソン構造図の巻(後編)Usp友の会勉強会、ジャクソン構造図の巻(後編)
Usp友の会勉強会、ジャクソン構造図の巻(後編)umidori
3.5K vistas83 diapositivas
kagamicomput201706 por
kagamicomput201706kagamicomput201706
kagamicomput201706swkagami
350 vistas25 diapositivas

Más contenido relacionado

La actualidad más candente

Scala 初心者が米田の補題を Scala で考えてみた por
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
5.7K vistas64 diapositivas
Yokohama6 epi por
Yokohama6 epiYokohama6 epi
Yokohama6 epiえぴ 福田
594 vistas12 diapositivas
Scala 初心者が Hom 函手を Scala で考えてみた por
Scala 初心者が Hom 函手を Scala で考えてみたScala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみたKazuyuki TAKASE
487 vistas21 diapositivas
Rで学ぶ逆変換(逆関数)法 por
Rで学ぶ逆変換(逆関数)法Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法Nagi Teramo
40.3K vistas110 diapositivas
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー por
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キューYuto Takei
1.8K vistas39 diapositivas
指数分布とポアソン分布のいけない関係 por
指数分布とポアソン分布のいけない関係指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係Nagi Teramo
132K vistas37 diapositivas

La actualidad más candente(20)

Scala 初心者が米田の補題を Scala で考えてみた por Kazuyuki TAKASE
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE5.7K vistas
Scala 初心者が Hom 函手を Scala で考えてみた por Kazuyuki TAKASE
Scala 初心者が Hom 函手を Scala で考えてみたScala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみた
Kazuyuki TAKASE487 vistas
Rで学ぶ逆変換(逆関数)法 por Nagi Teramo
Rで学ぶ逆変換(逆関数)法Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法
Nagi Teramo40.3K vistas
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー por Yuto Takei
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
Yuto Takei1.8K vistas
指数分布とポアソン分布のいけない関係 por Nagi Teramo
指数分布とポアソン分布のいけない関係指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係
Nagi Teramo132K vistas
やさしく知りたいC言語 por uru nru
やさしく知りたいC言語やさしく知りたいC言語
やさしく知りたいC言語
uru nru44.4K vistas
私を SKI に連れてって por Susisu
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてって
Susisu 2.2K vistas
関数プログラミング入門 por Hideyuki Tanaka
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka21.8K vistas
Rで学ぶ回帰分析と単位根検定 por Nagi Teramo
Rで学ぶ回帰分析と単位根検定Rで学ぶ回帰分析と単位根検定
Rで学ぶ回帰分析と単位根検定
Nagi Teramo32.7K vistas
2011年11月11日 por nukaemon
2011年11月11日2011年11月11日
2011年11月11日
nukaemon607 vistas
Python勉強会2-数値と文字列 por 理 小林
Python勉強会2-数値と文字列Python勉強会2-数値と文字列
Python勉強会2-数値と文字列
理 小林646 vistas
最適化の手前の数学 por 俊介 後藤
最適化の手前の数学最適化の手前の数学
最適化の手前の数学
俊介 後藤2K vistas

Similar a kagamicomput201807

kagamicomput201707 por
kagamicomput201707kagamicomput201707
kagamicomput201707swkagami
453 vistas24 diapositivas
kagamicomput201806 por
kagamicomput201806kagamicomput201806
kagamicomput201806swkagami
275 vistas25 diapositivas
kagami_comput2015_6 por
kagami_comput2015_6kagami_comput2015_6
kagami_comput2015_6swkagami
860 vistas22 diapositivas
kagamicomput201801 por
kagamicomput201801kagamicomput201801
kagamicomput201801swkagami
425 vistas53 diapositivas
ウェーブレット木の世界 por
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
55.4K vistas67 diapositivas
kagami_comput2016_01 por
kagami_comput2016_01kagami_comput2016_01
kagami_comput2016_01swkagami
620 vistas53 diapositivas

Similar a kagamicomput201807(20)

kagamicomput201707 por swkagami
kagamicomput201707kagamicomput201707
kagamicomput201707
swkagami453 vistas
kagamicomput201806 por swkagami
kagamicomput201806kagamicomput201806
kagamicomput201806
swkagami275 vistas
kagami_comput2015_6 por swkagami
kagami_comput2015_6kagami_comput2015_6
kagami_comput2015_6
swkagami860 vistas
kagamicomput201801 por swkagami
kagamicomput201801kagamicomput201801
kagamicomput201801
swkagami425 vistas
kagami_comput2016_01 por swkagami
kagami_comput2016_01kagami_comput2016_01
kagami_comput2016_01
swkagami620 vistas
kagami_comput2016_06 por swkagami
kagami_comput2016_06kagami_comput2016_06
kagami_comput2016_06
swkagami879 vistas
kagamicomput201701 por swkagami
kagamicomput201701kagamicomput201701
kagamicomput201701
swkagami302 vistas
kagami_comput2015_1 por swkagami
kagami_comput2015_1kagami_comput2015_1
kagami_comput2015_1
swkagami697 vistas
kagami_comput2015_2 por swkagami
kagami_comput2015_2kagami_comput2015_2
kagami_comput2015_2
swkagami577 vistas
SSE4.2の文字列処理命令の紹介 por MITSUNARI Shigeo
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo8.8K vistas
命令プログラミングから関数プログラミングへ por Naoki Kitora
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
Naoki Kitora3.8K vistas
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17 por Yuya Unno
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Yuya Unno5.5K vistas
関数型都市忘年会『はじめての函数型プログラミング』 por Kenta USAMI
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
Kenta USAMI2.2K vistas
kagamicomput201802 por swkagami
kagamicomput201802kagamicomput201802
kagamicomput201802
swkagami250 vistas

Más de swkagami

kagamicomput201814 por
kagamicomput201814kagamicomput201814
kagamicomput201814swkagami
955 vistas28 diapositivas
kagamicomput201813 por
kagamicomput201813kagamicomput201813
kagamicomput201813swkagami
504 vistas29 diapositivas
kagamicomput201812 por
kagamicomput201812kagamicomput201812
kagamicomput201812swkagami
534 vistas21 diapositivas
kagamicomput201811 por
kagamicomput201811kagamicomput201811
kagamicomput201811swkagami
394 vistas27 diapositivas
kagamicomput201810 por
kagamicomput201810kagamicomput201810
kagamicomput201810swkagami
340 vistas23 diapositivas
kagamicomput201809 por
kagamicomput201809kagamicomput201809
kagamicomput201809swkagami
314 vistas20 diapositivas

Más de swkagami(20)

kagamicomput201814 por swkagami
kagamicomput201814kagamicomput201814
kagamicomput201814
swkagami955 vistas
kagamicomput201813 por swkagami
kagamicomput201813kagamicomput201813
kagamicomput201813
swkagami504 vistas
kagamicomput201812 por swkagami
kagamicomput201812kagamicomput201812
kagamicomput201812
swkagami534 vistas
kagamicomput201811 por swkagami
kagamicomput201811kagamicomput201811
kagamicomput201811
swkagami394 vistas
kagamicomput201810 por swkagami
kagamicomput201810kagamicomput201810
kagamicomput201810
swkagami340 vistas
kagamicomput201809 por swkagami
kagamicomput201809kagamicomput201809
kagamicomput201809
swkagami314 vistas
kagamicomput201808 por swkagami
kagamicomput201808kagamicomput201808
kagamicomput201808
swkagami560 vistas
kagamicomput201805 por swkagami
kagamicomput201805kagamicomput201805
kagamicomput201805
swkagami300 vistas
kagamicomput201804 por swkagami
kagamicomput201804kagamicomput201804
kagamicomput201804
swkagami502 vistas
kagamicomput201803 por swkagami
kagamicomput201803kagamicomput201803
kagamicomput201803
swkagami357 vistas
kagamicomput201714 por swkagami
kagamicomput201714kagamicomput201714
kagamicomput201714
swkagami674 vistas
kagamicomput201713 por swkagami
kagamicomput201713kagamicomput201713
kagamicomput201713
swkagami615 vistas
kagamicomput201712 por swkagami
kagamicomput201712kagamicomput201712
kagamicomput201712
swkagami312 vistas
kagamicomput201711 por swkagami
kagamicomput201711kagamicomput201711
kagamicomput201711
swkagami381 vistas
kagamicomput201710 por swkagami
kagamicomput201710kagamicomput201710
kagamicomput201710
swkagami373 vistas
kagamicomput201709 por swkagami
kagamicomput201709kagamicomput201709
kagamicomput201709
swkagami415 vistas
kagamicomput201708 por swkagami
kagamicomput201708kagamicomput201708
kagamicomput201708
swkagami581 vistas
kagamicomput201705 por swkagami
kagamicomput201705kagamicomput201705
kagamicomput201705
swkagami347 vistas
kagamicomput201704 por swkagami
kagamicomput201704kagamicomput201704
kagamicomput201704
swkagami349 vistas
kagamicomput201703 por swkagami
kagamicomput201703kagamicomput201703
kagamicomput201703
swkagami213 vistas

Último

The Things Stack説明資料 by The Things Industries por
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things IndustriesCRI Japan, Inc.
50 vistas29 diapositivas
01Booster Studio ご紹介資料 por
01Booster Studio ご紹介資料01Booster Studio ご紹介資料
01Booster Studio ご紹介資料ssusere7a2172
345 vistas19 diapositivas
Windows 11 information that can be used at the development site por
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development siteAtomu Hidaka
76 vistas41 diapositivas
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化 por
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化Knowledge & Experience
12 vistas34 diapositivas
SNMPセキュリティ超入門 por
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門mkoda
188 vistas15 diapositivas
Web3 Career_クレデン資料 .pdf por
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdfnanamatsuo
14 vistas9 diapositivas

Último(11)

The Things Stack説明資料 by The Things Industries por CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.50 vistas
01Booster Studio ご紹介資料 por ssusere7a2172
01Booster Studio ご紹介資料01Booster Studio ご紹介資料
01Booster Studio ご紹介資料
ssusere7a2172345 vistas
Windows 11 information that can be used at the development site por Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka76 vistas
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化 por Knowledge & Experience
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
SNMPセキュリティ超入門 por mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda188 vistas
Web3 Career_クレデン資料 .pdf por nanamatsuo
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdf
nanamatsuo14 vistas
さくらのひやおろし2023 por 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之94 vistas
SSH応用編_20231129.pdf por icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4184 vistas
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) por NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... por NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...

kagamicomput201807

  • 1. 東北大学 工学部 機械知能・航空工学科 2018年度 クラスC3 D1 D2 D3 情報科学基礎 I 大学院情報科学研究科 鏡 慎吾 http://www.ic.is.tohoku.ac.jp/~swk/lecture/ 7. MIPSの命令と動作 ― 分岐・ジャンプ・関数呼出し (教科書7章 命令一覧は p.113)
  • 2. 2鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 分岐・ジャンプ命令 条件文や繰り返し文などを実現するには,命令の実行順の制御 が必要 (C言語) (MIPSアセンブリ言語) if (x == y) { x = x + 1; } ... bne $s0, $s1, L1 # $s0 ≠ $s1 ならば L1 へ分岐 addu $s0, $s0, 1 L1: ... ただし,変数 x, y の内容がそれぞれレジスタ s0, s1 に置かれているとする ラベル
  • 3. 3鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 資料: 主な分岐命令,比較命令 命令 説明 beq $a, $b, L $a = $b ならばラベル L へ分岐 (branch on equal) bne $a, $b, L $a ≠$b 〃 (branch on not equal) slt $c, $a, $b 符号つきで $a < $b ならば $c ← 1; さもなくば $c ← 0 sltu $c, $a, $b 符号無しで $a < $b ならば $c ← 1; さもなくば $c ← 0 sgt $c, $a, $b 符号つきで $a > $b 〃 (set on greater than) sgtu $c, $a, $b 符号無しで $a > $b 〃 (set on greater than unsigned) sle $c, $a, $b 符号つきで $a≦$b 〃 (set on less than or equal) sleu $c, $a, $b 符号無しで $a≦$b 〃 (set on less than or equal unsigned) sge $c, $a, $b 符号つきで $a≧$b 〃 (set on greater than or equal) sgeu $c, $a, $b 符号無しで $a≧$b 〃 (set on greater than or equal unsigned) •slt, sltu 以外の比較命令はマクロ命令
  • 4. 4鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 例: if – else 文 if (x < y) { x = x + 1; } else { x = x + 2; } ... slt $t0, $s0, $s1 beq $t0, $zero, L1 # $s0 < $s1 でないならL1へ分岐 addu $s0, $s0, 1 j L2 # 無条件に L2 へジャンプ L1: addu $s0, $s0, 2 L2: ... (C言語) (MIPSアセンブリ言語) ただし,変数 x, y の内容がそれぞれレジスタ s0, s1 に置かれているとする
  • 5. 5鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 例: while文 while (x < y) { x = x + 1; } L1: slt $t0, $s0, $s1 # x < y なら $t0 ← 1; さもなくば $t0 ← 0 beq $t0, $zero, L2 # 比較結果が偽(ゼロ)なら L2 へ addu $s0, $s0, 1 # x ← x + 1 j L1 L2: ... (C言語) (MIPSアセンブリ言語) ただし,変数 x, y の内容がそれぞれレジスタ s0, s1 に置かれているとする
  • 6. 6鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 関数呼出し int func(int a, int b) { a = a + b; return a; } int main() { int x, y, z; x = func(5, 1); y = func(8, 2); z = func(x, y); ... } (C言語) ただし,関数main内の変数 x, y, z の内 容がそれぞれレジスタ s0, s1, s2 に置か れているとする 関数呼出しは単に j 命令でジャンプ するだけでは実現できない (元の位置に戻って来る必要がある)
  • 7. 7鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 関数呼出しの実行例 func: addu $a0, $a0, $a1 move $v0, $a0 # 戻り値には $v0, $v1 を使う jr $ra # $ra のアドレスへジャンプ main: # 初期化省略 li $a0, 5 # 引数には $a0~$a3 を使う li $a1, 1 jal func # func へジャンプし,戻り先アドレスを $ra へ move $s0, $v0 li $a0, 8 li $a1, 2 jal func move $s1, $v0 move $a0, $s0 move $a1, $s1 jal func move $s2, $v0 (MIPSアセンブリ言語)
  • 8. 8鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 資料: 主なジャンプ命令 命令 説明 j L ラベル L へジャンプ (jump) jal L ラベル L へジャンプすると同時に,次の命令アドレ スを $ra ($31) に保存 (jump and link) jr $r レジスタ r に保存されたアドレスへジャンプ (jump register)
  • 9. 9鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 分岐・ジャンプ命令の動作 メモリ 32ビットALU 32x32ビット レジスタ PC 命令デコーダ アドレス(32ビット) データ(8, 16, 32ビット) 次PC計算 制御回路 mux mux (1) レジスタ 読み出し (2) 分岐判定 (3) 分岐先アドレス計算
  • 10. 10鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 参考: 「次PC計算」の処理 分岐条件が成立していないなら, • PC + 4 成立しているなら, • 条件分岐命令のとき: PC + 4 £ 定数フィールド値 • ジャンプ命令のとき: PC の下位28ビットを 4 £ 定数フィールド値 で置換 ※ 命令長は常に4バイトなので,分岐・ジャンプ先のアドレスは必ず 4の倍数になる ※ この講義では「遅延分岐」は無視する
  • 11. 11鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) MIPS の命令フォーマット MIPSの命令は基本的に以下の3フォーマットに分類される 31 26 25 21 20 16 15 11 10 6 5 0 funcOP rs rt rd シフト量 31 26 25 21 20 16 15 0 OP rs rt 定数(即値 / アドレスオフセット) 31 26 25 0 OP 定数(ジャンプ先) R形式 I形式 J形式 レジスタ間演算,シフト命令(即値版も含む)など レジスタ-即値間演算,ロード・ストア,分岐命令など ジャンプ命令など
  • 12. 12鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 実際の関数呼出し 前の関数呼出しの例は,簡単に済むように巧妙に作られた例 である.実際には以下のようなことを考えなくてはならない. • 呼出された関数はどのレジスタを使えばよいのか? 特に,呼 出された関数が呼出し元のレジスタを破壊しないためにはど うすればよいのか? • ra は一つしかないが,関数を多重で呼出す場合は? • 4つを超える引数の受け渡しは? これらはスタックと呼ばれるデータ構造をメモリ内に構築することで 取り扱われる
  • 13. 関数呼出時のプログラムの流れ 13鏡 慎吾 (東北大学): 計算機工学 2017 (7) int g() { … } int f() { … g(); } int main() { … f(); … } main f呼出 $s0 を使っており,f の呼出 後も使い続けるとする こちらでも $s0 を使うと どうなる?f の呼出時に $ra がセット される g の呼出時に $ra は上書きさ れてしまう g呼出 リターン リターン
  • 14. 14鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) スタックメモリ 0x8020 0x8010 0x8000 $sp 0x8020 0x8020 0x8010 0x800c 0x8000 $sp 0x800c $sp 0x8020 int f() { g(); } f() の スタック フレーム g() の スタック フレーム f() の スタック フレーム 0x8020 0x8010 0x8000 f() の スタック フレーム push pop addu $sp, $sp, -20 addu $sp, $sp, 20
  • 15. MIPSの場合のレジスタ・スタック利用ルール 15鏡 慎吾 (東北大学): 計算機工学 2017 (7) • 関数呼出時のレジスタ利用規約 • t0~t9 は,壊されたくないなら呼出し側がスタックに退避 (すなわち,主にテンポラリ用と想定されている) • s0~s8 は,呼出された側が使いたいならスタックに退避 してリターン時に原状回復する • 関数を多重で呼出す場合は ra もスタックに退避 • 4つを超える引数はスタックに積んでから関数を呼出す
  • 16. 16鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 典型的なメモリマップ スタックポインタ ($sp) スタック (局所変数) 低位アドレス↓ 高位アドレス↑ プログラム 大域変数・静的変数等 int global_var; void func() { int a, b; static int static_var; ... } int main() { int x, y; int *p = (int *) malloc(256); } 動的確保領域 グローバルポインタ ($gp)
  • 17. 例: ポケットモンスター 「5かい」バグ 17鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) ゲームボーイ用ゲーム「ポケットモンスター 赤」「ポケットモンスター 緑」 (任天堂, 1996) には,プレイヤが保有している道具やポケモ ン(ゲーム世界内の架空生物)などを並べ替える機能があったが, この機能の実装に不具合があり,特定の操作によって本来は存在 しないはずの道具(俗に「バグアイテム」)を入手することができた. 道具を使ったときに生じる効果は,道具ごとに定められているアド レスに対する呼出しによって実現されており,バグアイテムを使用 すると想定外のアドレスへの呼出しが生じた.特に「5かい」という 名称で表示されるバグアイテムの場合は,呼出されるアドレス以 降がポケモンの種類やその状態等を保持するメモリ領域となって おり,プレイヤがある程度自由に設定することができた.結果とし て,任意のプログラムを作成し実行することが可能となっていた.
  • 18. 18鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) https://www.youtube.com/watch?v=IJ7mRJISeO0
  • 19. 19鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) https://www.youtube.com/watch?v=baXxP6b7ANQ
  • 20. 20鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 例: バッファ・オーバラン攻撃 int getnum() { char buf[8]; gets(buf); /* 入力文字列を配列 buf に保存 */ return atoi(buf); /* 文字列 → 整数 */ } buf return address 低位アドレス↓ 高位アドレス↑ getNum() の スタックフレーム sp このような問題があるので,gets, scanf のように配列長を指定せ ずに入力を読み込む関数は,使 用が推奨されない
  • 21. 21鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 例題(1) 以下に示すプログラムは,ある値を2 進数で表した際に,その中に 含まれる「1」のビットの数を数えるものである. lw $s0, 0($s1) move $t0, $zero L1: and $t1, $s0, 1 addu $t0, $t0, $t1 srl $s0, $s0, 1 bne $s0, $zero, L1 sw $t0, 0($s1) レジスタ $s1 の内容が指すアドレスに値13 が格納されている状 態でこのプログラムを実行した. (1) 実行終了時の,レジスタ $s0,$t0,$t1 の内容を示せ. (2) ラベルL1 で指される命令は,何回実行されるか答えよ.
  • 22. 22鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 解答例 lw $s0, 0($s1) move $t0, $zero L1: and $t1, $s0, 1 addu $t0, $t0, $t1 srl $s0, $s0, 1 bne $s0, $zero, L1 sw $t0, 0($s1) (1) $s0 は計算対象で,1ビットずつシフトして行き,最後は 0 になる $t0 は最終結果で,ビット1の数になる.よって 3 $t1 は計算途中で使用し,ループごとに $s0 の最下位ビットを取 り出すのに使われる.最後は 1 になる (2) 4回 $s0 = mem[$s1 + 0]; /* = 12 */ $t0 = 0; do { $t1 = $s0 & 1; $t0 = $t0 + $t1; $s0 = $s0 >> 1; } while ($s0 != 0); mem[$s1 + 0] = $t0;
  • 23. 23鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 例題(2) move $v0, $zero L1: lw $t0, 0($s0) … (※1) sltu $t1, $v0, $t0 beq $t1, $zero, L2 move $v0, $t0 … (※2) L2: addu $s0, $s0, 4 addu $s1, $s1, -1 bne $s1, $zero, L1 以下に示すプログラムは配列の中から最大値を探すものである. いま,符号なし整数 (4バイト) が,メモリ上のアドレスが増える方向に 10, 20, 3, 22, 5 の順に並んでおり,この配列の先頭アドレスを $s0, 配列長 5 を $s1 に与えて このプログラムを実行した. (1) プログラムの実行が終わった時点でのレジスタ $s1, $v0, $t0, $t1 の内容を 示せ. (2) ※1 及び ※2 の命令がそれぞれ何回実行されるか答えよ.
  • 24. 24鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 解答例 move $v0, $zero L1: lw $t0, 0($s0) sltu $t1, $v0, $t0 beq $t1, $zero, L2 move $v0, $t0 L2: addu $s0, $s0, 4 addu $s1, $s1, -1 bne $s1, $zero, L1 $v0 = 0; do { $t0 = mem[$s0 + 0]; if ($v0 < $t0) { $v0 = $t0; } $s0 = $s0 + 4; $s1 = $s1 – 1; } while ($s1 != 0) (1) $s1は処理すべき配列要素の残り数で,終了時は0になる.$v0 はその時 点までの最大値を保持するレジスタで,終了時は全体の最大値22になる. $t0 は読み出した配列要素を格納するレジスタで,終了時は最後の要素 5 になる.$t1 は,それまでの最大値が読み出した配列要素より小さければ 1になるレジスタで(これが0のときはL2に分岐するため,最大値の更新が スキップされる),最後のループでは 0 になる. (2) ※1 は,配列長が5なので5回実行される.※2 は,最大値を更新するとき のみ実行されるため3回実行される.
  • 25. 25鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 例題(3) move $s2, $zero L1: lw $t0, 0($s0) addu $s1, $s1, -1 addu $s2, $s2, $t0 addu $s0, $s0, 4 bne $s1, $zero, L1 以下に示すプログラムは配列の内容の総和をレジスタ $s2 に返すものである. いま,整数 (4バイト) の配列の先頭アドレスをレジスタ $s0 に,配列長 1000 を レジスタ $s1 に与え,このプログラムを実行した. (1) プログラムの実行が終わった時点でのレジスタ $s1 の内容を示せ. (2) ラベル L1 で指されるlw命令は,何回実行されるか答えよ. (3) このプログラム全体で,いくつの命令が実行されるか答えよ.(同じ命令が 2 回実行される場合,2 命令と数える)
  • 26. 26鏡 慎吾 (東北大学): 情報科学基礎I 2018 (1) 解答例 (1) $s1は処理すべき配列要素の残り数で,終了時は0になる. (2) 配列要素を読み出す命令で,配列長分の1000回実行される. (3) 最初の move 命令は1回だけ,他の5命令は1000回実行され るので,合計5001命令が実行される.