8

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

int main(){}

...并在 mips 机器上使用 gcc 的 -S 选项编译它以生成汇编代码。下面是 main 函数的开头部分:

    .ent 主要
主要的:
    .frame $fp,8,$31
    .mask 0x40000000,-8
    .fmask 0x00000000,0

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

4

1 回答 1

7

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

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

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

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

这是您可以找到指令的指南.ent .frame .fmask .mask:它们都是 mips 汇编指令。或者你可以只是Google MIPS Assembly Language Programmer’s Guide。导航到chapter 8, Pseudo Op-Codes,您将获得所需的一切。

你可能想知道怎么GNU as能支持mips directives?键入Info as,导航到章节Machine Dependent Features,然后导航到子章节MIPS-Dependent。但是,您仍然无法在.ent此处找到指令,也找不到.frame .fmask .mask. 那是因为info as它不是 mips 组装指南,不能那么全面。

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

于 2018-03-13T12:12:06.987 回答