linux下64位汇编的系统调用(3)

简介:

背景知识基本交代清楚了,下面我们实际写一个小例子看一下。代码的功能很简单,显示一行文本,然后退出。我们使用了syscall中的write和exit调用,查一下前面的调用号和参数,我们初步总结如下:

write(即sys_write)调用号为1,需传递3个参数

unsigned int fd
const char *buf
size_t count

exit(sys_exit)调用号为60,只需传递一个错误码

int error_code

如果该值为0表示程序执行成功。

因为以上两个调用最多的也只有3个参数,所以我们依次只会用到3个寄存器rdi,rsi和rdx。
实际代码如下:

section .text
;if use ld
global _start
;if use gcc
;global main
_start:
;main
    mov rax,1       ;write NO
    mov rdx,1       ;fd
    mov rsi,msg     ;addr of msg string
    mov rdx,msg_len ;lenght of msg string
    syscall

    mov rax,60      ;exit NO
    mov rdi,0       ;error_code
    syscall

    msg: db "Hello World!",0xa
    msg_len:equ $-msg

编译连接命令如下:

nasm -f elf64 p.s
ld -o p p.o

如果是mac os x系统下命令如下:

nasm -f macho64 p.s
ld -o p p.o

因为本博的标题是linux下的汇编,所以mac os x下请参考本猫另一篇博文[Mac OS X64位以及32位汇编系统调用]。
如果你要生成32位的代码,在编译时把elf64改为elf32就可以了,不过我前面说过:32位和64位汇编结构变化较大,光改这个是没办法运行成功的。
不出所料代码运行输出一行:Hello World!并且程序返回后用echo $?看,应该为0.

这个例子很简单,下面看一下稍微复杂点的调用:mmap,该调用共有6个参数,我们再一次总结如下:
mmap(sys_mmap) 系统调用号为9,参数分别为:

unsigned long addr
unsigned long len
unsigned long prot
unsigned long flags
unsigned long fd
unsigned long offset

第一个参数是需要映射到的地址,我们这里传0,表示不关心映射到哪;第二个参数是映射空间的大小;第三个参数表示映射区域的保护方式,有很多种,我们这里只让它可读可写即可,所以只用到2者的组合:
PROT_WRITE|PROT_READ
第四个参数是映射区域的一些特性,有很多组合。这里只用MAP_SHARED|MAP_ANONYMOUS,后者表示建立匿名映射,会忽略参数fd,所以不设及文件。
第五个参数就是fd,前面说了可以忽略,所以我们传递-1;最后一个参数是映射的偏移量,我们也传递0.
该调用如果成功返回映射区域内存的起始地址,否则返回MAP_FAILED(-1),错误原因存于errno中,我们可以用strerror(errno)查看具体含义。不过该函数是C库中的,这里我们捎带的用一下。

提到mmap我们不得不提到munmap,用猜大家也知道该调用的含义吧:
munmap(sys_munmap) 调用号为11,需传递2个参数:

unsigned long start
size_t len
相关文章
|
21天前
|
算法 Linux C++
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
29 0
|
1月前
|
存储 Linux 程序员
Linux中的主要系统调用
【2月更文挑战第16天】
|
2月前
|
Linux API 数据安全/隐私保护
Linux下的系统编程——系统调用(五)
Linux下的系统编程——系统调用(五)
44 0
Linux下的系统编程——系统调用(五)
|
7月前
|
Linux C语言
RISC-V Linux汇编启动过程分析
RISC-V Linux汇编启动过程分析
|
5月前
|
存储 Linux 调度
【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY...
【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY...
37 1
|
20天前
|
存储 监控 Linux
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
48 0
|
27天前
|
存储 缓存 Linux
Linux 系统调用深思:从原理到实战
Linux 系统调用深思:从原理到实战
37 1
|
27天前
|
缓存 Linux 编译器
C/C++ 函数调用以及Linux中系统调用 开销介绍:介绍C/C函数调用以及Linux中系统调用的开销情况
C/C++ 函数调用以及Linux中系统调用 开销介绍:介绍C/C函数调用以及Linux中系统调用的开销情况
16 0
|
5月前
|
存储 缓存 Linux
【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
64 1
|
4月前
|
存储 安全 Linux
Linux内嵌汇编
Linux内嵌汇编
22 0