一个程序的汇编分析

源程序:

#include <syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>

int main(void){
        long id1,id2;
        id1 = syscall(SYS_getpid);
        printf("syscall(SYS_getpid)=%ld/n",id1);

        id2 = getpid();
        printf("getpid()=%ld/n",id2);
        return 0;
}

汇编代码:

0x080483d4 <main+0>:    push   %ebp
0x080483d5 <main+1>:    mov    %esp,%ebp
0x080483d7 <main+3>:    sub    $0x8,%esp
0x080483da <main+6>:    and    $0xfffffff0,%esp
0x080483dd <main+9>:    mov    $0x0,%eax
0x080483e2 <main+14>:   add    $0xf,%eax
0x080483e5 <main+17>:   add    $0xf,%eax
0x080483e8 <main+20>:   shr    $0x4,%eax
0x080483eb <main+23>:   shl    $0x4,%eax
0x080483ee <main+26>:   sub    %eax,%esp
0x080483f0 <main+28>:   sub    $0xc,%esp
0x080483f3 <main+31>:   push   $0x14
0x080483f5 <main+33>:   call   0x80482fc                      #调用syscall
0x080483fa <main+38>:   add    $0x10,%esp
0x080483fd <main+41>:   mov    %eax,0xfffffffc(%ebp) #获取syscall的返回值
0x08048400 <main+44>:   sub    $0x8,%esp
0x08048403 <main+47>:   pushl  0xfffffffc(%ebp)
0x08048406 <main+50>:   push   $0x8048518
0x0804840b <main+55>:   call   0x804831c                      #调用printf
0x08048410 <main+60>:   add    $0x10,%esp
0x08048413 <main+63>:   call   0x80482ec
0x08048418 <main+68>:   mov    %eax,0xfffffff8(%ebp)  #获曲getpid的返回值
0x0804841b <main+71>:   sub    $0x8,%esp
0x0804841e <main+74>:   pushl  0xfffffff8(%ebp)
0x08048421 <main+77>:   push   $0x8048531
0x08048426 <main+82>:   call   0x804831c                      #调用printf
0x0804842b <main+87>:   add    $0x10,%esp
0x0804842e <main+90>:   mov    $0x0,%eax
0x08048433 <main+95>:   leave
0x08048434 <main+96>:   ret
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值