`
deepfuture
  • 浏览: 4332056 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79401
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68342
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101467
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:281106
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14595
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65531
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31305
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45182
社区版块
存档分类
最新评论

算法下午茶系列-重温汇编(3)[调用C库函数]

 
阅读更多

首先我们先用汇编编写一个helloworld,注意我们直接在汇编代码中调用C语言的printf函数将"hello,world\n" 输出在屏幕上。

.section .data
  output:
  .asciz "hello,world\n"  
.section .text
   .global  main
   main:
   push $output
   call printf
   addl $4,%esp
   push $0
   call exit

 

上述代码中,

push $output将参数入栈,以便printf调用,

然后调用printf,printf会在栈中取出它需要的参数
2)我们直接使用GCC编译后运行 

deepfuture@ubu-s:~$ gcc -o  test test.s
deepfuture@ubu-s:~$ ./test
hello,world

 

3)那么调用C库函数所需要的参数入栈的顺序是什么?

再看一个例子

.section .data
  myvalue:
     .byte 67,68,69,70,0
  mygs:
     .asciz "%s\n"
   
.section .text
.globl main
   main:
    movl $myvalue,%ecx
    push %ecx
    push $mygs    
    call printf
    push $0
    call exit

        
    
    
67,68,69,70是C、D、E、F的ASCII码,0是字符串终结符
 这段代码的功能是输出“CEDF”,相当于下面的C代码

 

#include <stdio.h>
int main( void )
{
     char myvalue[]={67,68,69,70,0};
     printf( "%s\n" ,myvalue);
     return 0;
}

 其中,后面的0表示字符串的终结符。

 

第一个参数最后一个入栈,按调用的相反顺序入栈

 

 

如果转载请注明来源,如有错误之处,请及时指出。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics