『Linuxオペレーティングシステム分析』ノート1
4834 ワード
概要
levonオリジナル作品転載出典「Linuxオペレーティングシステム分析」MOOCコースを明記してください
さぎょう
じっけん
c
まとめ
プログラムが実行されると、メモリに2つのメモリ領域が開き、1つはコードセグメントであり、1つはスタックセグメントである.レジスタ%eipはコード領域を指し、1つのコードを実行するたびに、%eipは次の命令のメモリアドレスを自動的に指す.
スタックセグメントはレジスタ%espおよび%edpによって指し示され、スタックセグメントは%esp,%edp,%eipポインタのほかに、ローカル変数およびパラメータの値も格納される.
%eax,%ebxなどのレジスタは,cpu演算時にデータを一時的に格納するために用いられる.
メモ
レジスタ
levonオリジナル作品転載出典「Linuxオペレーティングシステム分析」MOOCコースを明記してください
さぎょう
じっけん
c
int g(int x){
return x+63;
}
int f(int x){
return g(x);
}
int main(void){
return f(68)+61;
}
アセンブルg:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $63, %eax
popl %ebp
ret
f:
pushl %ebp
movl %esp, %ebp
pushl 8(%ebp)
call g
addl $4, %esp
leave
ret
main:
pushl %ebp
movl %esp, %ebp
pushl $68
call f
addl $4, %esp
addl $61, %eax
leave
ret
解析の実行まとめ
プログラムが実行されると、メモリに2つのメモリ領域が開き、1つはコードセグメントであり、1つはスタックセグメントである.レジスタ%eipはコード領域を指し、1つのコードを実行するたびに、%eipは次の命令のメモリアドレスを自動的に指す.
スタックセグメントはレジスタ%espおよび%edpによって指し示され、スタックセグメントは%esp,%edp,%eipポインタのほかに、ローカル変数およびパラメータの値も格納される.
%eax,%ebxなどのレジスタは,cpu演算時にデータを一時的に格納するために用いられる.
メモ
レジスタ
ax \\
bx \\
cx \\
dx \\
bp \\
sp \\
アドレッシングmovl %eax %edx // eax edx
movl $0x123 %edx // 16 0x123 edx
movl 0x123 %edx // 0x123 edx
movl (%ebx) %edx // ebx edx
movl 4(%ebx) %edx // ebx 4, , edx
インストラクションmovl %esp, %ebp
subl $63, %eax
addl $63, %eax
pushl %eax
/*
subl $4,%esp
movl %eax,(%esp)
*/
popl %eax
/*
movl (%esp),%sax
addl $4,%esp
*/
call $0x12345
/*
pushl %eip
movl $0x12345,%eip
*/
ret
/*
popl %eip
*/
enter
/*
pushl %ebp
movl %esp,%ebp
*/
leave
/*
movl %ebp,%esp
popl %ebp
*/