KDOC 45: プログラミング言語の内部的な違いをアセンブリから調べる
今まで、プログラミング言語の内部的な違いを調べるのに、ソースコードを読むしかないと考えていた。しかし別の方法もある。生成されたassembly languageから調べる方法だ。
たとえばC言語で、グローバル変数、ローカル変数は全く別の扱いなことを確かめる方法を書く。
- グローバル変数はメモリ上の固定の位置にある
int x; int y[20]; int main() { return x + y[5]; }
x: .zero 4 y: .zero 80 main: movl y+20(%rip), %edx movl x(%rip), %eax addl %edx, %eax ret
- ローカル変数はスタックの中にある
int main() { int a = 1; return a; }
main: pushq %rbp movq %rsp, %rbp movl $1, -4(%rbp) movl -4(%rbp), %eax popq %rbp ret
ということで、プログラムの疑問について究極的に答えを得る方法は、CPUが実行する処理の違いを見ることだ。
関連。
- 『低レイヤを知りたい人のためのCコンパイラ作成入門』。本に書かれていた