• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

AT&T汇编中系统调用和C函数调用的使用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

我的博客:www.while0.com

我的博客:www.shishangguan.net

区别:

  1. 系统调用的参数存储在寄存器中,函数调用的则存储在堆栈中。 
  2. 系统调用使用中断方式,函数调用使用call指令 

相同之处:

  1. 都有返回值和输入值
  2. 返回值都存储在%eax寄存器中

下边详细介绍他们的不同之处:

系统调用:

  • 使用:在%eax中存储系统调用号(可以在linux系统的/user/include/asm/unistd.h文件中查找可用的linux系统调用),然后使用0x80中断。

  • 传参数:
  1. %EBX  第一个参数
  2. %ECX  第二个参数
  3. %EDX  第三个参数
  4. %ESI   第四个参数
  5. %EDI   第五个参数
  • 返回值:

    %EAX

  • 例子: 
1 movl $1, %eax        #exit调用的调用号是1,要把调用号存储在%eax中  
2 movl $0, %ebx        #exit调用接收一个参数,即程序退出值,第一个参数放在%ebx中      
3 int %0x80            #使用0x80中断,引发linux系统调用    

 

函数调用(主要讲解标准类C函数):

  • 使用
    •   第一步,给堆栈中放参数
    •   第二步,调用函数
    •   第三步,清空堆栈
  • 定义
     1 .type funcname, @function
     2 functionname:
     3     pushl %ebp
     4     movl  %esp, %ebp    #开头部分可以用enter指令代替
     5 
     6     ............
     7 
     8     movl %ebp, %esp    #结尾部分可以用leave指令代替
     9     popl %ebp
    10     ret

     

  • 传参数
    调用函数时堆栈情况如下图:

    因为%ESP是不停变化的,所以通常把%ESP复制到%EBP寄存器中,并且把旧的%EBP寄存器也放到堆栈中,如下图所示:

    这样我们就可以拿到参数值了。
  • 给整个程序传命令行参数
    程序运行时堆栈如图所示:
  • 返回值
    在类C标准中,返回值存放在%EAX寄存器。

 

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
制作C/C++动态链接库(dll)若干注意事项发布时间:2022-07-13
下一篇:
在C#中运用SharpZipLib和unrar进行解压缩发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap