nasm系统调用

系统调用是用户空间与内核空间的接口,在汇编程序中使用linux系统调用需要如下步骤

linux 32位调用步骤

1.把系统调用号存入 RAX 寄存器

2.把参数存入 EBX ECX...

3.调用系统终端 (int 0x80)

4.返回结果一般存放在 EAX 寄存器

存放连续参数的寄存器为 EBX ECX EDX ESI EDI EBP,如果参数大于 6 个,那么第一个参数的内存地址将存在于 EBX 寄存器

linux 中系统调用号定义在 /usr/include/asm/unistd_32.h (内核3.10),下面是部分系统调用号

#define __NR_restart_syscall 0
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
#define __NR_open 5
#define __NR_close 6
#define __NR_waitpid 7
#define __NR_creat 8
#define __NR_link 9
#define __NR_unlink 10
#define __NR_execve 11
#define __NR_chdir 12
#define __NR_time 13
#define __NR_mknod 14
#define __NR_chmod 15

下面是 hello world 例子

section .data
    msg db 'hello world!',0xa

section .text
    global _start

_start:
    ;write(1,msg,13)
    mov eax,4
    mov ebx,1
    mov ecx,msg
    mov edx,13
    int 80h

    ;exit(0)
    mov eax,1
    mov ebx,0
    int 80h
[root@izbp1irxwqt7ei21awv6wvz ccc]# nasm -f elf64 main.asm -o main.o
[root@izbp1irxwqt7ei21awv6wvz ccc]# ld main.o
[root@izbp1irxwqt7ei21awv6wvz ccc]# ./a.out 
hello world!


linux 64位调用

用户模式的系统调用参数传递次序 RDI RSI RDX RCX R8 R9 (glibc封装了一层系统调用,所以如果是传递给glibc(比如调用write),那么按照函数调用约定即可,如果是自己写汇编,直接调用 syscall,那么必须使用如下顺序)

内核接口系统调用参数传递次序 RDI RSI RDX R10 R8 R9

linux 中系统调用号定义在 /usr/include/asm/unistd_64.h (内核3.10),下面是部分系统调用号

#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
#define __NR_fstat 5
#define __NR_lstat 6
#define __NR_poll 7
#define __NR_lseek 8
#define __NR_mmap 9
#define __NR_mprotect 10
#define __NR_munmap 11
#define __NR_brk 12
...
#define __NR_clone 56
#define __NR_fork 57
#define __NR_vfork 58
#define __NR_execve 59
#define __NR_exit 60
section .data
    msg db 'hello world!',0xa

section .text
    global _start

_start:
    ;write(1,msg,13)
    mov eax,1
    mov edi,1
    mov esi,msg
    mov edx,13
    syscall

    ;exit(0)
    mov eax,60
    mov edi,0
    syscall
[root@izbp1irxwqt7ei21awv6wvz ccc]# nasm -f elf64 main.asm -o main.o
[root@izbp1irxwqt7ei21awv6wvz ccc]# ld main.o
[root@izbp1irxwqt7ei21awv6wvz ccc]# ./a.out 
hello world!



上一篇: nasm特性
下一篇: nasm寻址模式
作者邮箱: 203328517@qq.com