当前位置:  技术问答>linux和unix

nasm汇编调用C函数的问题

    来源: 互联网  发布时间:2016-02-19

    本文导语:  //file1.asm section .text extern printf global main main: push dword str1 call printf add esp,byte 4 ret str1: db "Hello,World!",0 //file2.asm section .text extern printf global main main: push dword str1 call printf add esp,byte 4 mov eax,1 mov ebx,0 int...

//file1.asm
section .text
extern printf
global main
main:
push dword str1
call printf
add esp,byte 4
ret
str1: db "Hello,World!",0

//file2.asm
section .text
extern printf
global main
main:
push dword str1
call printf
add esp,byte 4

mov eax,1
mov ebx,0
int 0x80
str1: db "Hello,World!",0

我使用nasm -felf file1.asm
gcc -o file1 file1.o
两条命令分别编译两个文件,得出的结果运行file1可以得到输出,但运行file2就没有结果,使用ret与系统调用结束有什么区别吗?还是有其他问题?

|
程序的执行总是会从ld时指定的入口点开始执行的通常是_start
纯汇编的程序_start .... INT 80 结束。
用cc编译链接的程序会链接和C函数库,C函数库会,程序从先执行C启动代码,建立C运行环境(CRT),然后调用main, main返回后会进行清理C运行环境的工作包括FLUSH缓冲区。然后INT 80结束。

关键在于楼主的Hello, World!后面没有换行符号,所以在行缓冲方式下,printf结束后,在屏幕上看不到东西的。
在file1.asm里,会返回到C的_start,然后FLUSH缓冲区,所以可以输出,会把printf放在缓冲区的信息输入到屏幕所以可以看到Hello, World!
在file2.asm里,printf后直接返回INT 80退出了,所以在屏幕上看不到任何输出。
楼主可以试试在file2.asm里把最后一行改为:
str1: db "Hello,World!", 0x0d, 0x0a, 0
就可以看到输出的信息了。

另外楼主可以试试这个程序,可以理解什么是行缓冲。
#include 
#include 
int main(void)
{
        printf("You will see me only once!n");
        printf("You will see me twice!");
        fork();
        return 0;
}

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 新手问题:Linux下nasm到底怎么用啊
  • 在window上安装过NASM的请止步~~
  • NASM中$$是什么意思
  • 在redhat9下如何使用gcc与NASM


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3