【发布时间】:2015-11-02 20:34:39
【问题描述】:
我阅读了一些关于浮点运算的内联汇编 C 代码。代码如下。
__asm__ __volatile__ ("fninit);
//There are some other in line assembly here, I omit them because they have nothing to do with my question.
__asm__ __volatile__ ("fcomp %st");
这些代码在 x86 系统中运行。但是,我想将这些代码更改为可以在 armv8 系统中运行的代码。
首先,我想知道上面的代码是什么意思。其次,我想知道如何更改上面的代码使其在armv8系统中运行。
【问题讨论】:
-
我们不是代码翻译服务,也不是来教你x86和ARM汇编的。
-
我只是想知道这两个系统的区别。只需两条指令!
-
您搜索过相关说明吗?你没有证明你试图自己回答这个问题。
-
FNINIT初始化 x87 FPU。FCOMP将堆栈顶部ST(0)与ST(1)进行比较,然后弹出堆栈。由于您没有显示代码,我们无法判断正在比较的内容。我们也不知道这段代码正在实现什么比较运算符,因为FCOMP之后的代码丢失了。由于 HLL 支持浮点操作数的比较,因此不清楚此处使用内联汇编的目的是什么。如果您只是在 HLL 级别比较操作数会发生什么? -
你不能单独移植单个指令;确保您可以交叉引用指令列表并找出
fcomp是一个浮点比较,因此粗略的 A64(我假设 ARMv8 中的 3 个不同指令集您可能是指一个)等效将是(也许不足为奇)fcmp,但 ARM 指令采用两个显式参数,而不是 x87 的隐式堆栈使用 - 你要指定哪些寄存器?如果不考虑代码的意图并适当地重组整个事情,你仍然会迷失方向。
标签: floating-point x86 stack arm inline-assembly