gcc - GNU 汇编程序指令的文档

标签 gcc assembly mips directive gnu-assembler

我现在正在尝试学习 mips 汇编。为此,我编写了一个非常简单的 C 程序...

int main(){}

...并使用 gcc 的 -S 选项在 mips 机器上编译它以生成汇编代码。主函数的开头如下所示:

    .ent   main
main:
    .frame $fp,8,$31
    .mask  0x40000000,-8
    .fmask 0x00000000,0

然后我试图通过查看 documentation for gas 来弄清楚这一切意味着什么。 ,但我在那里找不到任何这些指令。那么它们是什么意思呢?在哪里可以找到更多信息?

最佳答案

我知道我的回答有点晚了。迟到总比不到好。

当您编译汇编文件时,代码中可能会出现两种指令。

  1. 一种是您的汇编器支持的指令,在您的情况下,它是GNU as指令。

  2. 另一种取决于您的汇编语言,并且因为您显然在这里使用 mips 汇编,所以 .ent 实际上是一个 mips 汇编 指令。

这是guide您可以在其中找到 .ent .frame .fmask .mask 指令:它们都是 mips 汇编指令。或者您也可以直接Google MIPS 汇编语言程序员指南。导航到第 8 章,伪操作码,您将获得所需的一切。

您可能想知道GNU as如何支持mips指令?输入 Info as,导航至Machine Dependent Features 章节,然后导航至MIPS-Dependent 子章节。但是,您仍然无法在这里找到 .ent 指令,也找不到 .frame .fmask .mask。这是因为 info as 不是 mips 汇编指南,不可能那么全面。

顺便说一下,许多程序员都熟悉的汇编器nasm有自己的指令和语法(Intel风格),与GNU as不同(源自古老的 AT&T 风格)。类似地,不同的汇编语言可能有自己独特的指令(但不是语法),也可以由汇编器支持,也可以汇编它们。这就是为什么两个指令源可能出现在一个汇编文件中的原因。现在,GNU as 汇编器甚至可以支持 Intel 语法。此外,还有一些工具可以在 AT&T 和 Intel 语法之间进行转换。但是,您应该记住指令与语法不同。说实话,我对此也很困惑。

关于gcc - GNU 汇编程序指令的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/730587/

相关文章:

c - 如何从汇编调用 C 函数

linux-kernel - MIPS32路由器: module_init not called for kernel module

c - 当从 MIPS 调用 C 时,我们使用 JR 还是 JALR?

c - 海湾合作委员会/MINGW C : re-initialize globals as on entry of main()

linux - 将 .text 部分放在 ELF 的最后

linux - Win32 InterlockedIncrement 和 InterlockedExchange 是跨进程的原子吗?

c++ - 如何在 VS C++ 中使用 IA32 指令 'fabs'?

assembly - 堆叠在MIPS中。 addi $ sp,$ sp,-4中4的目的是什么?

linux - 在 Linux Mint 17 x86_64 : skipping incompatible libraries 中编译 Open Surge 的问题

linux - Lubuntu 上的 gcc 无法正常工作