x86_64汇编之六:系统调用(system call)

本文将主要讲述如何在汇编语言代码中调用Linux的系统调用。

一、32位系统的系统调用

在32位x86 Linux系统中,可用的系统调用定义在/usr/include/asm/unistd_32.h头文件中。

每个系统调用都对应一个编号 以及 若干个参数。如果想使用汇编语言调用系统调用,那么在调用之前,需要将系统调用编号存到%eax,将参数依次存到%ebx, %ecx, %edx, %esi, %edi, %ebp中,然后再执行int $0x80指令即可。

每个系统调用的编号和参数列表可以参考:https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86-32_bit

下面的汇编代码通过write系统调用往屏幕上打印出了Hello

.section .data
output:
	.string "Hello\n"

.text
...

movl $4, %eax # write对应编号为4
movl $1, %ebx # 第1个参数文件描述符为1,表示stdout
leal output(%rip), %ecx # 第2个参数,字符串指针
movl $6, %edx # 第3个参数,写入的字节数
int $0x80

movq $1, %eax # exit系统调用
xor %edi, %edi # 第1个参数,0,即exit(0)
int $0x80

二、64位系统的系统调用

在64位x86_64 Linux系统中,可用的系统调用定义在/usr/include/asm/unistd_64.h头文件中。

每个系统调用都对应一个编号 以及 若干个参数。如果想使用汇编语言调用系统调用,那么在调用之前,需要将系统调用编号存到%rax,将参数依次存到%rdi, %rsi, %rdx, %r10, %r8, %r9中,然后再执行syscall指令即可。

每个系统调用的编号和参数列表可以参考:
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86_64-64_bit

下面的汇编代码通过write系统调用往屏幕上打印出了Hello

.section .rodata
msg:
	.string "Hello\n"

.text
.globl _start
_start:
	pushq %rax # for stack alignment

	movq $1, %rax 
	movq $1, %rdi
	leaq msg(%rip), %rsi
	movq $6, %rdx
	syscall

	# exit(0)
	movq $60, %rax
	xor %rdi, %rdi
	syscall

需要注意,上述代码中第一行是为了实现栈对齐,关于栈对齐请参考x86_64汇编之四:函数调用、调用约定

如何运行上述代码?

as -o a.o a.s
ld -o a a.o 
./a

三、调用C函数

除了直接使用Linux提供的系统调用接口之外,我们还可以在汇编代码中直接使用C函数,例如直接调用call printf来调用printf函数。参数传递的规范遵循System V AMD64调用约定

.section .rodata
msg:
	.ascii "Hello, %d\n"
.text
.globl main
main:
	pushq %rbp # for stack alignment

	leaq msg(%rip), %rdi # 1st param
	movq $1, %rsi # 2nd param
	movb $0, %al # variable length param function:
				  # number of vector registers 
	callq printf

	# exit(0)
	movq $0, %rdi
	callq exit

注意上述的movb $0, %al:因为printf是可变参数函数,因此根据System V AMD64调用约定需要在%al寄存器中设置它使用的向量寄存器个数。

汇编并链接上述代码:

as -o a.o a.s
gcc -o a a.o # 由于调用了C标准库的函数,所以使用gcc进行链接
./a

最终打印出Hello, 1

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Linux-x86_64 error: 28: no space left on device"是指在Linux操作系统中,出现了磁盘空间不足的错误。这种错误通常发生在硬盘或分区的可用空间已经耗尽,无法继续入数据或创建新文件。 当系统磁盘空间不足时,可能会导致一些严重的问题,例如无法正常运行软件或操作系统等。因此,我们需要采取一些措施来解决这个问题。 首先,我们可以使用`df -h`命令来查看磁盘空间的利用情况。它会显示出所有磁盘分区的使用情况以及剩余空间。 如果我们发现有一些大文件或文件夹占用了大量的磁盘空间,我们可以使用`du -sh <文件名或文件夹名>`命令来查找占用空间最多的文件或文件夹。 一种常见的解决方法是删除一些不再需要的文件或文件夹,以释放磁盘空间。可以使用`rm`命令删除单个文件,或使用`rm -r`命令删除整个文件夹。 另外,我们也可以考虑使用一些工具来压缩已有的文件或文件夹,以节省磁盘空间。例如,可以使用zip或tar命令将文件打包成压缩文件,然后删除原始文件。 如果上述方法无法解决问题,可能需要对磁盘进行扩容。这可以通过添加新的硬盘或扩展现有的分区来实现。具体的步骤可以根据不同的情况而定,可以参考一些相关的教程或咨询专业人士的建议。 总之,当出现"Linux-x86_64 error: 28: no space left on device"错误时,我们应该首先查看磁盘空间的使用情况,然后删除不需要的文件或压缩已有文件,并在必要时扩展磁盘的容量,以解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值