【问题标题】:Force gcc to use syscalls强制 gcc 使用系统调用
【发布时间】:2017-03-08 06:46:26
【问题描述】:

所以我目前正在学习汇编语言(AT&T 语法)。我们都知道gcc 可以选择使用-S 参数从C 代码生成汇编代码。现在,我想看看一些代码,它在汇编中的样子。问题是,在实验室我们用as+ld 编译它,而目前我们不能使用C 库。例如,我们不能使用 printf。我们应该通过系统调用来完成(32 位就足够了)。现在我在 C 中有这段代码:

#include <stdio.h>

int main()
{
    int a = 5;
    int b = 3;
    int c = a + b;
    printf("%d", c);
    return 0;
}

这是简单的代码,所以我知道它在系统调用中的样子。但是如果我有一些更复杂的代码,我不想乱来替换每个call printf 并修改其他寄存器,因为gcc 为printf 生成了代码,我应该用系统调用来处理它。那么我能否以某种方式让gcc 使用系统调用(例如用于 I/O(控制台、文件))而不是使用 C 库生成汇编代码?

【问题讨论】:

  • GCC 不知道如何为 printf 生成代码,除非调用 C 库函数。
  • 嗯,好的。所以也许如果我在C而不是printf中插入一些汇编代码,那么它会工作......
  • 手册的第 2 部分是 dedicated to system calls,它枚举了 POSIX wrappers around the syscalls。您可以使用它们来启动。调用约定会有所不同,但应该是可管理的。
  • 系统调用是特定于操作系统的。你用什么操作系统?
  • Linux,64位,但必须为32位编译

标签: c linux gcc assembly x86


【解决方案1】:

在 Linux 下,存在宏系列 _syscallX 来生成系统调用,其中 X 命名参数的数量。它被标记为过时,但恕我直言仍在工作。例如,以下代码应该可以工作(此处未测试):

_syscall3(int,syswrite,int,handle,char*,str,int len);
// ---

char str[]="Hello, world!\n";
// file handle 1 is stdout
syswrite(1,str,14);

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2020-08-06
    相关资源
    最近更新 更多