繁体   English   中英

linux程序集:如何调用系统调用?

[英]linux assembly: how to call syscall?

我想在程序集中调用系统调用。 问题是我不能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,会发生什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM