当前位置: 技术问答>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与系统调用结束有什么区别吗?还是有其他问题?
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;
}
纯汇编的程序_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;
}