Linux 程序集 : how to call syscall?

标签 linux assembly x86-64 system-calls

我想在汇编中调用一个系统调用。问题是我不能 mov ecx,rsprsp为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,然后调用系统调用。

请注意,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"

另见 What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?

关于Linux 程序集 : how to call syscall?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20326025/

相关文章:

限制 gcc 内联 x86_64 程序集中的 r10 寄存器

c - 如何修复CONFIG_RETPOLINE = y,但编译器不支持

assembly - arm-thumb指令集的blx指令如何支持4MB范围

c - 非阻塞套接字选择在连接后返回 1

assembly - 发布与 Debug模式下局部堆栈变量的代码生成

c++ - 使用 SSE 指令

gcc - 如何在 NASM 中导出符号

delphi - 在内联汇编中将常量读入 SSE/AVX 寄存器

c - linux下如何加速连续程序启动?

linux - 如何将反引号传递给 Dockerfile CMD?