t
约束
根据 GCC 文档https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints
吨
80387 浮点堆栈的顶部 (%st(0))。
所以我们可以这样做:
#include <assert.h>
int main(void) {
double io = 4.0;
__asm__ (
"fsqrt"
: "+t" (io)
:
:
);
assert(io == 2.0);
return 0;
}
GitHub 上游.
Refresher:+
表示io
将用作输入和输出。
在 Ubuntu 19.04 中测试。
GNU GAS ARM 程序集支持它
例如在 ARMv8 中:
主程序
#include <assert.h>
int main(void) {
float my_float = 1.5;
__asm__ (
"fmov s0, 1.0;"
"fadd %s[my_float], %s[my_float], s0;"
: [my_float] "+w" (my_float)
:
: "s0"
);
assert(my_float == 2.5);
}
GitHub 上游.
编译并运行:
aarch64-linux-gnu-gcc -o main.out -static -std=gnu99 main.c
qemu-aarch64 ./main.out
该修饰符在: ARMv8 浮点输出内联汇编%s
中提到
它也适用于 ARMv7。
但是,由于某种原因,它仅适用于浮点指令fmov
,例如,以下 ARMv7 尝试无法汇编:
mov r0, 1.5
有错误:
Error: garbage following instruction -- `mov r0,1.5'
大概是因为它使用了mov
指令,该指令作用于通用寄存器而不是浮点寄存器。
然而,也许这并不重要,因为在大多数情况下,您只想对浮点寄存器进行浮点运算,然后执行fcmp
如下操作vmrs
:
vmov s0, 1.5
vmov s1, 2.5
fadds s2, s0, s1
vmov s3, 4.0
/* Compare two floating point registers. Stores results in fpscr:
* (floating point status and control register).
*/
vcmp.f32 s2, s3
/* Move the nzcv bits from fpscr to apsr */
vmrs apsr_nzcv, fpscr
/* This branch uses the Z bit of apsr, which was set accordingly. */
beq theyre_equal
GitHub 上游.
GNU GAS 对每个拱门的语法都有微妙的不同,这总是让我感到好笑!
但是我找不到十六进制浮点文字语法:How to use hexadecimal floating point literals in GNU GAS?
在 Ubuntu 18.04 上测试。