Floating point 气体汇编器打印浮点

Floating point 气体汇编器打印浮点,floating-point,gnu-assembler,Floating Point,Gnu Assembler,我正在读一本关于如何使用NASM在汇编中编程的书,在构建一个打印3.1400000的程序时遇到了问题 代码可能有一些问题,例如,在 section.data pi:.float 3.14 应该是双四边形,但我不知道是哪个伪操作 映射到这一点;我试过了,但dq不是这样的 我还读到,在程序启动之前,调用堆栈需要对齐,我希望使用基指针可以解决这个问题,否则程序不会打印段错误 为了便于学习,我将GAS与Intel语法一起使用,因此我不确定下面的语法映射是否正确 代码: 汇编: gcc-无饼图-o fmt

我正在读一本关于如何使用NASM在汇编中编程的书,在构建一个打印3.1400000的程序时遇到了问题

代码可能有一些问题,例如,在
section.data pi:.float 3.14
应该是双四边形,但我不知道是哪个伪操作 映射到这一点;我试过了,但dq不是这样的

我还读到,在程序启动之前,调用堆栈需要对齐,我希望使用基指针可以解决这个问题,否则程序不会打印段错误

为了便于学习,我将GAS与Intel语法一起使用,因此我不确定下面的语法映射是否正确

代码:

汇编: gcc-无饼图-o fmtflt fmtflt.s

输出:

实际值:0.000000
预计:3.140000

是否有人可以填写缺失的部分,以便程序打印预期输出

在节中使用了错误的语句。data pi:.float 3.14应该是double quad类型,但我不知道哪个伪操作映射到该类型

使用
.double
组合8字节双精度浮点值。看

然后,正如约瑟夫所指出的,看看这句话:

mov     rax, 0             # set total numers xmm register  
如注释所述,
rax
应设置为用于传递参数的xmm(SSE)寄存器总数。请参见的图3.4,它是在使用它的Linux等系统上调用约定的权威参考。您正在xmm寄存器中传递1个参数(在下一行),因此将
rax
设置为
1
,而不是
0
。指令
mov eax,1
具有相同的效果(因为移动到32位寄存器中会使64位寄存器的上半部分归零),并且减少一个字节

通过这些更改,程序将为我正确打印
3.140000

我还读到,在程序启动之前,调用堆栈需要对齐,我希望使用基指针可以解决这个问题,否则程序不会打印段错误


是的,这部分你说对了。

你认为mov rax,0#set total numers xmm寄存器是什么?这是一个输入错误假设为1,但我不得不将数据类型更改为.double。
mov     rax, 0             # set total numers xmm register