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が実行する処理の違いを見ることだ。
関連
抽象。
- 上の層の表現の違いを、下の層で実際に起きていることを見て確かめる
関連。
- 類推: プログラミング言語以外だと、「アセンブリを見る」相当するものはどれになるか