首页 > 编程语言 >ARM64上内联汇编实现系统调用

ARM64上内联汇编实现系统调用

时间:2023-09-28 18:12:46浏览次数:38  
标签:汇编 openat mov fd result 内联 include ARM64

ARM64上内联汇编实现系统调用

#include <stdio.h>
#include <stdint.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int dir_fd = AT_FDCWD;  // 使用当前工作目录作为目录文件描述符
    const char *filename = "example.txt";
    int flags = O_RDONLY;  // 您可以设置适当的标志
    mode_t mode = 0;      // 您可以设置适当的文件模式

    int fd;
    int result;

    // ARM64 assembly code to invoke the openat syscall
    asm volatile(
        "mov x8, %1\n"          // syscall number for openat (56 on ARM64)
        "mov x0, %2\n"          // dirfd (directory file descriptor)
        "mov x1, %3\n"          // pathname (pointer to the string)
        "mov x2, %4\n"          // flags
        "mov x3, %5\n"          // mode
        "svc #0\n"              // Call the syscall
        "mov %0, x0\n"          // Store the result in 'result'
        : "=r" (result)
        : "i" (__NR_openat), "r" (dir_fd), "r" (filename), "r" (flags), "r" (mode)
        : "x0", "x1", "x2", "x3", "x8"
    );
    printf("result code %d\n", result);
    if (result >= 0) {
        printf("File opened successfully. File descriptor: %d\n", result);
        close(result);
    } else {
        perror("Error opening file");
    }

    return 0;
}

在上面的代码中,%1%2%3 等是内联汇编中的占位符,用于表示输入或输出操作数。这些占位符与C代码中的变量相对应,用于指定要传递给汇编代码的参数。

具体来说,在以下的代码行中:

%1 表示 __NR_openat,它是 openat 系统调用的系统调用号。"i" (__NR_openat) 中的 "i" 表示立即数(immediate),这里用于表示系统调用号是一个常数值。

%2 表示 dir_fd,它是目录文件描述符,表示在哪个目录中打开文件。在这里,"r" (dir_fd) 中的 "r" 表示寄存器(register),用于表示 dir_fd 是一个寄存器传递的参数。

%3 表示 filename,它是要打开的文件名字符串的指针。在这里,"r" (filename) 中的 "r" 同样表示寄存器传递的参数。

%4 和 %5 分别表示 flags 和 mode,它们是打开文件的标志和权限模式。同样,"r" 表示这些参数是通过寄存器传递的。

最后的 : "=r" (result) 表示将汇编代码中的结果存储到 result 变量中,并告诉编译器使用哪些寄存器作为输入和输出,以及哪些寄存器的值可能会在汇编代码块中被修改。

这种使用占位符的方式使得您可以将C代码中的变量传递给内联汇编,并在汇编代码中使用它们,同时告诉编译器如何处理这些参数。

标签:汇编,openat,mov,fd,result,内联,include,ARM64
From: https://www.cnblogs.com/tangshunhui/p/17736298.html

相关文章

  • 王道408计组汇编语言部分学习总结
    x86汇编语言指令基础x86处理器中程序计数器PC通常被称为IP 高级语言—>汇编语言—>机器语言x86架构CPU,有哪些寄存器EAX通用寄存器EBXECXEDXESI变址寄存器变址寄存器可用于线性表、字符串的处理EDIEBP堆栈基指针堆栈寄存器用于实现函数调用 ESP堆栈顶指针moveax,ebx#......
  • win32汇编-80386的内存分页机制
     读者可以注意到,在实模式下寻址的时候,“段寄存器+偏移地址”经过转换计算以后得到的地址是“物理地址”,也就是在物理内存中的实际地址。而保护模式下,“段选择器+偏移地址”转换后的地址被称为“线性地址”而不是“物理地址”。那么,线性地址就是物理地址吗?答案可能是“是”,也可......
  • x86汇编学习
    sal为算术左移,保持符号位不变。shl为逻辑左移,为无符号左移,最高位直接被次高位覆盖。对应的右移分别为sar,shr。参考[https://blog.csdn.net/deniece1/article/details/](https://blog.csdn.net/deniece1/article/details/103274744#汇编语言中sal(算术左移指令)和shl(逻辑左移指......
  • win32汇编-CR3寄存器和PDBR寄存器
     CR3寄存器是x86架构中的一种控制寄存器,用于存储页目录表的物理地址(PhysicalAddress)。在x86架构的操作系统中,使用分页机制将虚拟地址映射到物理地址。为了实现这种映射,需要使用页表和页目录表来管理地址转换。CR3寄存器存储了页目录表的物理地址,通过改变CR3寄存器的值,可以实......
  • 汇编语言学习笔记
    汇编语言主要知识点来自《汇编语言》速成指南(全程敲代码),配套材料:王爽老师的《汇编语言》使用DOSbox模拟运行8086CPU汇编语言如有错误,欢迎指正!1.入门简单引入关于8086CPU的知识。CPU内部主要由运算器、控制器、寄存器三大部分组成[1]。运算器:负责算术运算(+-*/基......
  • 汇编-dos中断大全
     中断INT21H:1、字符功能调用类(Character-OrientedFunction)01H、07H和08H—从标准输入设备输入字符02H—字符输出03H—辅助设备的输入04H—辅助设备的输出05H—打印输出06H—控制台输入/输出09H—显示字符串0AH—键盘缓冲输入0BH—检测输入状态0CH—清输入缓冲......
  • 汇编-BIOS中断大全:“INT 10H ~ INT 1AH”
     BIOS中断大全:“INT10H~INT1AH”1、显示服务(VideoService——INT10H)00H—设置显示器模式01H—设置光标形状02H—设置光标位置03H—读取光标信息04H—读取光笔位置05H—设置显示页06H、07H—初始化或滚屏08H—读光标处的字符及其属性09H—在光标处按指定属性......
  • 11 iframe内联框架
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>iframe内联框架</title></head><body><iframesrc="//player.bilibili.com/player.html?aid=55631961......
  • [FAQ] 适用于 macOS / Arm64 (M1/M2) 的 VisualBox
     使用与Windows、Linux、macOS的x86架构的一般在下面地址中下载:DownloadVisualBox:https://www.virtualbox.org/wiki/Downloads 针对于macOSM架构的安装包,不一定会有具体某个版本的。“在7.0支上不会有更多的M1包,因为我们不支持ARM的任何重要的修复/增强,所以投入......
  • arm汇编
    1GNU汇编格式label:instruction@commentlabel即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意label后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。instruction即指令,也就是汇编指令或伪指......