【问题标题】:nasm system calls Linuxnasm 系统调用 Linux
【发布时间】:2016-05-12 14:39:47
【问题描述】:

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

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

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

希望我已经足够清楚了,

谢谢!

【问题讨论】:

  • @Michael 谢谢,但我已经知道这些网站,但他们实际上并没有告诉我必须在 ecx 中设置哪些“int flags”才能打开系统调用,或者 char *const 必须如何设置文件名......我显然在谷歌上搜索过,但我找不到我正在搜索的内容。这就是我在这里问的原因。 docs.cs.up.ac.za 站点有一个源链接,但是当我点击它时它什么也没做(在 linux 上)
  • “他们实际上并没有告诉我必须在 ecx 中设置哪些“int flags”才能打开系统调用” google“man sys_open”。 “或者 char *const 文件名必须如何” 我不明白评论。 const char* 只是一个以 NUL 结尾的字符串的地址。
  • @Michael 那么我自己的机器上没有任何 .h 文件或类似的文件来描述系统调用吗?只有谷歌?
  • 在 Linux 系统上,您可以从终端运行 man。系统调用位于手册页的第 2 部分,例如要查看 open 的手册页,您需要在终端中运行 man 2 open

标签: linux assembly nasm system-calls


【解决方案1】:

也许您正在寻找类似 linux/syscalls.h[1] 的东西,如果您已经通过 apt-get 或您的发行版使用的任何方式安装了 Linux 源代码,那么您的系统上就有了。

[1]http://lxr.free-electrons.com/source/include/linux/syscalls.h#L326

【讨论】:

    【解决方案2】:

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

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

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

    gcc 在处理.S 文件时实际上确实使用了 C 预处理器,但包含大多数 C 头文件也会为您提供一些 C 原型。

    或者使用sed 或其他东西将#defines 转换为NASM 宏。也许将一些 #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。当我尝试在其上运行 NASM 时,生成的文件有很多行 error: expression syntax error,但手动从中选择一些有效的行可能会起作用。

    一些常量是在多个步骤中定义的,例如#define S_IRGRP (S_IRUSR &gt;&gt; 3)。当转换为 NASM equ 符号定义时,这可能会或可能不会起作用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 2018-06-21
      • 2012-12-30
      相关资源
      最近更新 更多