怨念。怎么就一直待审核呢

Linux Course Lesson 1

gcc -S -o lesson1.s lesson1.c -m32

Lesson1.c

int g(int x)
{
    return x+3;
}

int f(int x)
{
    return g(x)+2;
}

int main()
{
    return f(8)+1;
}

Lesson1.s

g:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    addl    $3, %eax
    popl    %ebp
    ret
f:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    8(%ebp), %eax
    movl    %eax, (%esp)
    call    g
    addl    $2, %eax
    leave
    ret
main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    $8, (%esp)
23  call    f
24  addl    $1, %eax
    leave
    ret

程序从main函数入口,

subl    $4 %esp
movl    %ebp %esp
movl    %esp, %ebp
subl    $4, %esp
movl    $8, (%esp)
pushl   %eip
movl    f %eip(24)

于是,cpu执行到23行时,进入 f 函数中。至于ebp,esp寄存器则分别为堆栈基指针和堆栈顶指针。至于具体怎么操作,可以自己在纸上画一个堆栈。ret默认返回的是 eax中的内容。

ret 
<==>
 popl %eip

当eip下没有可执行命令的时候,ret为默认情况,ret可解读为
popl %eax (这句是个人的理解,不一定正确。如果有谁知道,麻烦跟我说一声我的想法是否是对的,& 如果有充分的理由更好~~原谅我这个伸手党)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值