- 论坛徽章:
- 0
|
有两种方式执行系统调用:使用c库,或者直接系统调用。c库的函数并不全部是系统调用外包,例如printf,malloc。直接的内核调用,更快速的获得内核服务。
linux下的使用方法,eax中放调用号,可以在asm/unistd.h中查到。可传递6个参数,ebx,ecx,edx,esi,edi,ebp。如果还有更多的参数,他们将被简单的传成结构体作为第一个参数。返回值放在eax中。没有使用到栈。
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
0xa代表'\n'
$ nasm -f elf hello.asm # this will produce hello.o ELF object file
$ ld -s -o hello hello.o # this will produce hello executable
./hello运行
结果类似于
write(1,msg,len);
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/70469/showart_1190119.html |
|