【发布时间】:2021-06-22 20:31:03
【问题描述】:
我有以下程序在 C 的 printf 的帮助下在 asm 中打印一个浮点数:
.section .rodata
format: .ascii "Your number is: %f\n\0"
.section .text
.globl main
main:
lea format(%rip), %rdi
mov $0b1000000001011001100110011001101, %xmm0 # the number 2.7
mov $0, %eax
add $-8, %rsp
call printf@plt
add $8, %rsp
mov $0, %eax
ret
但是,我在组装时遇到错误:
int_c.s:7: 错误:不支持的指令 `mov'
您是否不允许将立即数添加到 xmm 寄存器中,或者上述程序似乎有什么问题?
更新:我得到了编译,但我认为我的问题是 movq 接受 8 字节,但我希望将 4 字节浮点数放入 fp 寄存器:
mov $2.7, %eax # using '2.7' to be more readable
movq %eax, %xmm0
在单步执行说明之后,在调用 printf 之前它看起来是正确的:
>>> p $xmm0
$2 = {
v4_float = {[0] = 2.70000005, [1] = 0, [2] = 0, [3] = 0},
v2_double = {[0] = 5.3194953090036137e-315, [1] = 0},
...
}
【问题讨论】:
-
确实是问题所在。如有疑问,请参阅指令集参考。
-
@Jester 当然,
movq有效,但添加它时似乎仍然存在问题,因为数字显示0。 -
@Jester 更新了问题。
-
printf需要double,因此它将查看低 64 位(v2_double到 gdb),这不是您想要的值。 -
无论如何,将浮点常量放入寄存器的最典型方法是从内存中加载。