《Linux操作系统分析》笔记1

概要

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

运行分析

总结

程序运行的时候,在内存中开辟两块内存区域,一块是代码段,一块是堆栈段。寄存器%eip指向代码区域,每执行一条代码,%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
*/

你可能感兴趣的:(Linux)