システムソフトウェア構成論(立命館2022春講義)
35351
キーワード
当面の予定
2回-5回: ユーザープログラムの動作詳細
キーワード
6回-7回
8回-10回
11回-12回
13回-15回
やる予定なし
参考図書
2回目
レジスタ概観
$%eip: インストラクションポインタ,プログラムカウンタとほとんど同等
ニーモニック概観
mov op1, op2
op1の値をop2の値として転送
例: movel %eax %ebx
lea op1 op2
op1の実効アドレスをop2に読み込む
例: leal (%edx, %eax) $eax
$edx + $eaxという実効アドレスを%eaxへ転送
今,add $edx, %eaxとほとんど等価
add,or,and,or
例: add op1 op2
op1とop2の加算結果をop2に書き込む
その他の演算も同じ
cmp
subの計算結果を廃棄してフラグだけを立てる
計算結果をレジスタに保存しない
jcc
ccはフラグレジスタの何らかのことを指す
例えばz,nzならjz,jnz
push op1
スタックに値を積む
例: push %eax
%eaxの値をスタックに積む
%espを%eaxのサイズ分(今回は4byte)減算
行う動作の順番に注意
%espをサイズ減算した後,に,置き換える
pop op1
例: pop %eax
現在の%espが指すアドレスに格納されている値を%eaxへ格納
%espを%eaxのサイズ分(4byte)加算
leave
動作
1, %ebpの値を%espへ代入
2, スタックから値を取り出して%ebpへ入れる
https://gyazo.com/c33579fe9db49c15c406435af6143e6b
call op1
%eipの値をスタックにpush
op1へ制御を移す
ret
pop %eipの気持ち
3回目
https://gyazo.com/b1c0d770f2f0473b698dd6a9ff3b0231
pushの動作
まずespを動かす
その後に書き換え
https://gyazo.com/aadb0ade3313771696f8390983c38fa1
leaveの詳細
1, mov %ebp $esp
このとき%esp = %ebp = z
2, pop %ebp
このとき
%esp - %esp - 4
%espがサイズ分減算される
%ebp <- 1000
https://gyazo.com/5b4c53437add743cbd6797ea70467fe5
アドレッシング
面倒なので画像で記載
https://gyazo.com/fe28d982f3787b8c8e6d419052bf2a43
ラベル
https://gyazo.com/339eba15a6f4bd1b626bc74bcada9d85
スコープと生存期間
https://gyazo.com/18cf7eefc3d9aed0885bbd8907a5e884
https://gyazo.com/9d7ea4976b73ed63adcbee4392a3da3c
4回目
メモ
text = code / プログラム用
rodateとdata
区別する,生存期間が永久かつ初期値がある
BSS, block started by symbol
生存期間が永久かつ初期値なし
定数宣言の.commのデフォルトは.globlで.data
5回目
メモ
スタックフレーム
サブルーチン呼び出し(関数内関数呼び出し)
スタックフレーム作成
スタックフレーム削除
関数呼び出し元と呼び出し側,どっちが責任を…
%ebpのマイナス側に関数内変数,プラス側に関数の引数を
6回目
7回目
機械語コード/データ/管理情報から構成される
コンパイラ/アセンブラで生成される
実行可能
種類
linkable: リンカへの入力として利用可能
executable: メモリへロードして実行可能
loadable: ライブラリとしてメモリにロード可能
構成(たいていのオブジェクトファイルで含まれている)
ヘッダ情報
下記領域の位置,サイズ
対象のハードウェア情報
作成日時など
オブジェクトコード
機械語のコードとデータ
再配置情報
オブジェクトコードを,どこに置くか/変更するかに必要な情報
シンボル
この変数とかって何?という情報
デバッグ情報