『Linuxオペレーティングシステム分析』ノート1

4834 ワード

概要
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
*/