Skip to content

Instantly share code, notes, and snippets.

@hktechn0
Created June 27, 2015 06:57
Show Gist options
  • Save hktechn0/7c11260ac035b63f6a1b to your computer and use it in GitHub Desktop.
Save hktechn0/7c11260ac035b63f6a1b to your computer and use it in GitHub Desktop.
seccamp2015_q5.txt
以下のようなC言語の関数functionがあるとします。
void function(int *array, int n) {
int i;
for(i = 0; i < n; i++) {
array[i] = i * n;
}
}
上記プログラムをコンパイルした結果の一例 (i386)は以下となりました。
00000000 <function>:
0: 56 push %esi
1: 53 push %ebx
2: 8b 5c 24 0c mov 0xc(%esp),%ebx
6: 8b 4c 24 10 mov 0x10(%esp),%ecx
a: 85 c9 test %ecx,%ecx
c: 7e 18 jle 26 <function+0x26>
e: 89 ce mov %ecx,%esi
10: ba 00 00 00 00 mov $0x0,%edx
15: b8 00 00 00 00 mov $0x0,%eax
1a: 89 14 83 mov %edx,(%ebx,%eax,4)
1d: 83 c0 01 add $0x1,%eax
20: 01 f2 add %esi,%edx
22: 39 c8 cmp %ecx,%eax
24: 75 f4 jne 1a <function+0x1a>
26: 5b pop %ebx
27: 5e pop %esi
28: c3 ret
このとき以下の(1)~(5)の設問について、回答と好きなだけ深い考察を記述してください。知らない点は、調査したり自分で想像して書いてもらっても結構です。どうしてもわからない部分は、具体的にここがわかりませんと記述しても良いです。(1)~(2)の回答は必ず答えてください。(3)~(5)の回答は任意です。わかることを書いてください。CPU やコンパイラは特定の実装を例に説明しても良いですし、理想を自由に考えても良いです。
(1)【必須】上記の C 言語のプログラムはどのような動作をしますか。また、この関数を呼び出して利用する main 関数の例を作成してください。
(2)【必須】上記のアセンブリコードを、いくつかのブロックに分割して、おおまかに何をしている部分かを説明してください。もし、上記のアセンブリが気に入らないのであれば、好きなアーキテクチャやコンパイラのアセンブル結果を載せて説明しても良いです。
(3)【任意】 コンパイラがソースコードの関数を解釈して、ターゲットのアーキテクチャのバイナリを生成するまで、どのように内部で処理を行っていると思いますか。(キーワード: 構文解析、変数、引数、呼出規約、レジスタ、スタック、アセンブラ、命令セット)
(4)【任意】CPU の内部では、プログラムのバイナリはどのように解釈され実行されていると思いますか。(キーワード: フェッチ、デコード、オペコード、オペランド、命令パイプライン、回路)
(5)【任意】現在の CPU やコンパイラの不満点があれば自由に記述してください。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment