gpt4 book ai didi

linux - nasm 系统调用 Linux

转载 作者:太空狗 更新时间:2023-10-29 12:13:02 24 4
gpt4 key购买 nike

我有一个关于汇编中的 linux x86 系统调用的问题。

当我在 Linux 上使用 nasm 创建一个新的汇编程序时,我想知道我必须使用哪些系统调用来完成特定任务(例如读取文件、写入输出或简单退出... ).我知道一些系统调用,因为我在互联网上的一些例子中读过它们(例如 eax=0,ebx=1 int 0x80 exit with return value of 1),但仅此而已......我怎么知道是否还有其他退出系统调用的参数?或者另一个系统调用?我正在寻找一个文档来解释哪些系统调用有哪些参数要传递到哪些寄存器。

我已经阅读了有关退出函数等的手册页,但它没有向我解释我在问什么。

希望我说得够清楚,

谢谢!

最佳答案

wiki(我刚刚再次更新 :) 有指向系统调用 ABI 的链接(每次调用的数字是什么,将参数放在哪里,要运行什么指令,以及返回时哪些寄存器会被破坏)。这没有记录在手册页中,因为它是特定于体系结构的。二进制常量也是如此:它们不必在每个架构上都相同。

grep -r O_APPEND /usr/include为您的目标架构递归搜索 .h文件。

更好的做法是进行设置,以便您可以在 asm 源代码中使用符号常量,以提高可读性并避免出错的风险。

gcc 在处理 .S 时实际上确实使用了 C 预处理器文件,但包括大多数 C 头文件也会让您获得一些 C 原型(prototype)。

或转换 #define s 到 NASM 宏 sed或者其他的东西。也许喂一些#include<>行到 C 预处理器并让它只打印出宏定义。

printf '#include <%s>\n' unistd.h sys/stat.h   |
gcc -dD -E - |
sed -ne 's/^#define \([A-Za-z_0-9]*\) \(.\)/\1\tequ \2/p'

这将每个非空 #define进入 NASM symbol equ value .生成的文件有很多行 error: expression syntax error当我尝试在其上运行 NASM 时,但手动从中选择一些有效的行可能会起作用。

一些常量是在多个步骤中定义的,例如#define S_IRGRP (S_IRUSR >> 3) .这在转换为 NASM 时可能有效,也可能无效 equ符号定义。

另请注意,在 C 0666 中, 是一个八进制常数。在 NASM 中,您需要 0o666666o ;前导 0 并不特殊。否则,十六进制和十进制常量的 NASM 语法与 C 兼容。

关于linux - nasm 系统调用 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35176388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com