登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

仙剑奇侠传的博客

羽化成仙

 
 
 

日志

 
 

gas汇编调用c函数  

2011-08-19 22:47:40|  分类: 汇编 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

在window下用gnu进行汇编编程,现在系统一般是用win7系统,中断已经完全不能用了。在windows用汇编指令输出一行字符串在控制台应用程序,比登天还难。想来想去只得想到printf这个c标准函数。在进行编程时要用这个函数知道需要引用stdio.h这个头文件,可是这个文件的实现在win7系统中对应那个系统呢?找了半天找不到,无意中用gdb调试一个c程序,发现printf的实现在win7中就是在一个dll中实现,这文件就是msvcrt.dll。看gnu怎样调用汇编:

  1. 写一个汇编程序,源码如下:

    #这是一个汇编程序,演示怎样调用c函数

    .section .data

    LC0:

    .ascii "hell world\0"

    .section .text

    .globl _start

    .def    _start;    .scl    2;    .type    32; .endef

    .def    _printf;.scl    2;    .type    32;    .endef

    _start:

    pushl %ebp

    movl %esp,%ebp

    andl $-16,%esp

    subl    $32, %esp

    pushl $LC0

    call    _printf

    movl $1,%eax

    leave

    ret

     

  2. 程序说明

    #代表注解开始,与c的//类似

    .section .data 定义一个数据区,全局变量可以存这儿

    LC0:.ascii "hello world\0" 定义一个全局全量字符串,LC0代表标号,只要不是汇编的关键字,以字母与数字组合而成,因c的字符串以\0结尾。

    .section .text定义表示代码区(请大家复习下c的程序内存分配)

    .globl _start .globl指示符,代表码区首先要执行的函数

    .def 对函数进行声明

    _start:根当于一个函数开始

    pushl %ebp压栈

    andl $-16 ,%esp保证栈指针的地址为16的整数

    subl $32,%esp 开辟32字节空间,表示栈低与栈指针之间空间量,记住pop与push指令不是访问栈的唯一方式。

     

  3. 程序编译说明
    1. 生成object文件

      as –o hello.o hello.c

    2. 生成exe文件,很关键,看指令

      ld –o hello.exe hello.o msvcrt.dll

      这行的意思就是把msvcrt.dll的printf进行静态连接,生成hello.exe文件

4、关键是传给c函数的参数一定要正确,c函数一般是从右至左的方式的压栈,在汇编调用c函数时要注意。

  评论这张
 
阅读(657)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018