【问题标题】:A reference for AT&T syntax assembly floating point arithmeticAT&T 语法汇编浮点运算参考
【发布时间】:2010-10-10 22:22:50
【问题描述】:

过去一周我一直在努力寻找一个关于使用 AT&T 语法的 x86 汇编的浮点运算的体面资源。理想情况下,操作码列表、它们的作用以及浮点数的存储位置。我熟悉 IEEE 754 表示。我不熟悉浮点堆栈,以及任何涉及浮点运算的程序集。

奇怪的是,这很难找到。

编辑:在过去的一个月里,我一直在查看 gcc -S 输出来学习程序集。这就是我计算除浮点运算之外的所有内容的方法。即使经过几十个没有优化编译的小程序,我仍然无法弄清楚浮点操作码和堆栈。我只在网上找到了一些琐碎的例子。

【问题讨论】:

  • 重新编辑:所以,按照建议阅读libm,并阅读英特尔手册。对不起,你别无选择。 没有像样的基于 AT&T 语法的资源,因为没有人认真对待 x86 汇编编程使用它。
  • 好的,所以我有点太苛刻了,说没有人认真使用 AT&T 语法。无论如何,如果您在 Google 上搜索“devpro-libm”,您可以下载 OpenSolaris 中使用的 libm 代码。这可能是比glibc 更轻量级的下载。然后,查看usr/src/libm/src/i386/common 目录——它是硬核浮点汇编的金矿,全部用 AT&T 语法编写。
  • 我其实正要下载那个。谢谢 :) 我也不喜欢 AT&T 语法,它有一些严重的不一致之处——但我必须使用我必须使用的东西。尽管是 Intel 语法,this 是一个类似于我正在寻找的简明指南。适应 AT&T 语法的更改很容易。
  • +1 哇,这是一个相当全面的指南,至少一目了然(我知道 x86 FP,所以觉得没有必要详细阅读它;-))。是的,希望在这和libm 代码之间,你会被排序。后者其实评论的很好,不只是一大堆魔法咒语。 :-P
  • 是的,我现在应该准备好了。好吧,在确保我的编译器输出了一些不错的代码之后,一周之后。感谢所有的帮助。

标签: assembly floating-point x86


【解决方案1】:

好的。首先从 Intel 语法开始,因为大多数 x86 汇编编码器都使用它。 Intel's manuals 是了解 x86 如何处理浮点数据的绝佳资源。

在您学习了一般的 x86 汇编之后,AT&T 语法就不那么难学了。主要需要注意的是:

  • 寄存器以%为前缀;数字常量以$ 为前缀
  • 大多数双操作数指令的寄存器顺序被交换(即源在前,目标在后)
  • 指令名称指定大小;所以你会说movl $1337, (%ebx),而不是mov dword ptr [ebx], 1337

【讨论】:

  • 我不能使用 intel 语法。这是一个编译器项目,我们使用 AT&T 语法,所以它可以与 gcc 一起使用。
  • @Kizaru:我知道你不能在你的项目中使用它。但你应该先学习。最初使用 nasm 作为您的汇编程序。然后,一旦你掌握了 x86 汇编编程的窍门,then 使用 AT&T 语法。如果需要,让您的项目能够输出两种格式,最初以 nasm 为目标。
  • 我现在已经为除了浮点数之外的所有东西都设置好了编译器。这是让我退缩的一件事。这是一个课程项目。
  • @Kizaru:好的。那么给你的其他建议: 1.查看libm源代码;其中大部分是用 x86 汇编编写的,是的,是用 AT&T 语法编写的。 (在 GNU/Linux 上,这是 glibc 的一部分。) 2. 在 GCC 中编译一些浮点代码,并查看其汇编输出。
  • 建议:用C写一些浮点代码,用gcc -S编译。这将快速向您展示从 AT&T 语法处理 FP 需要了解的内容。通常,翻转任何两条指令 Intel 语法指令的操作数;有一些例外,但它们很少而且相差甚远。
猜你喜欢
  • 2021-11-25
  • 2010-12-19
  • 1970-01-01
  • 2013-05-15
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
相关资源
最近更新 更多