一个直接调用系统调用的例子

#include <stdio.h>
#include <unistd.h>  // For syscall numbers

int main() {
    long pid;

    // Use inline assembly to invoke the system call directly
    asm("syscall"             // syscall instruction
        : "=a" (pid)          // output: return value in RAX (the pid)
        : "a" (39)            // input: system call number for getpid() in RAX
        : "rcx", "r11", "memory");  // clobbered registers

    printf("Process ID: %ld\n", pid);
    return 0;
}
    .file   "syscall.c"
    .text
    .section    .rodata
.LC0:
    .string "Process ID: %ld\n"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movl    $39, %eax
#APP
# 8 "syscall.c" 1
    syscall
# 0 "" 2
#NO_APP
    movq    %rax, -8(%rbp)
    movq    -8(%rbp), %rax
    movq    %rax, %rsi
    movl    $.LC0, %edi
    movl    $0, %eax
    call    printf
    movl    $0, %eax
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-20)"
    .section    .note.GNU-stack,"",@progbits

gcc -S syscall.c will generate above code.

sjc-ads-1999:~ > ./a.out
Process ID: 43772

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值