我想在汇编中调用系统调用。问题是我不能mov ecx,rsp
. rsp
是64位寄存器,ecx
是一个32位寄存器。我想将缓冲区地址作为此系统调用的参数传递。我能做些什么?谢谢。
section .data
s0: db "Largest basic function number supported:%s\n",0
s0len: equ $-s0
section .text
global main
extern write
main:
sub rsp, 16
xor eax, eax
cpuid
mov [rsp], ebx
mov [rsp+4], edx
mov [rsp+8], ecx
mov [rsp+12], word 0x0
mov eax, 4
mov ebx, 1
mov ecx, rsp
mov edx, 4
int 80h
mov eax, 4
mov ebx, 1
mov ecx, s0
mov edx, s0len
int 80h
mov eax, 1
int 80h
要在 64 位 Linux 中进行系统调用,请将系统调用号放入 rax,并将其参数按顺序放在 rdi、rsi、rdx、r10、r8 和 r9 中,然后调用 syscall。
请注意,64 位索书号与 32 位索书号不同。
这是 GAS 语法的示例。将地址放入寄存器的 NASM 语法是lea rsi, [rel message]
使用 RIP 相关的 LEA。
.global _start
.text
_start:
# write(1, message, 13)
mov $1, %rax # system call 1 is write
mov $1, %rdi # file handle 1 is stdout
lea message(%rip), %rsi # address of string to output
mov $13, %rdx # number of bytes
syscall
# exit(0)
mov $60, %rax # system call 60 is exit
xor %rdi, %rdi # return code 0
syscall
.section .rodata # read-only data section
message:
.ascii "Hello, World\n"
也可以看看如果在 64 位代码中使用 32 位 int 0x80 Linux ABI 会发生什么?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)