如何解决GAS Assembler 打印浮点数
我正在阅读一本关于如何使用 NASM 进行汇编编程的书,但在构建打印 3.1400000 的程序时遇到了问题。
代码可能有一些问题,例如,在
MessageView(recipient: "+15555555555")
.ignoresSafeArea()
应该是 double quad 类型,但我不知道哪个伪操作
映射到那个;我试过 .dq 但是不行。
我也读过在程序启动之前调用堆栈需要对齐,我希望使用基指针可以解决这个问题,否则程序会打印段错误。
出于学习目的的另一个注意事项,我使用 GAS 和 Intel 语法,因此我不确定下面的语法映射是否正确。
代码:
section .data pi: .float 3.14
编译: gcc -no-pie -o fmtflt fmtflt.s
输出:
实际:0.000000
预期:3.140000
任何人都可以填写缺失的部分,以便程序打印预期的输出吗?
解决方法
在 .data pi 部分使用错误的语句:.float 3.14 应该是 double quad 类型,但我不知道哪个伪操作映射到那个;
使用 .double
组合一个 8 字节双精度浮点值。见https://sourceware.org/binutils/docs/as/i386_002dFloat.html#i386_002dFloat。
然后,正如约瑟夫指出的那样,看看这条线:
mov rax,0 # set total numers xmm register
正如评论所说,rax
应该设置为用于传递参数的 xmm (SSE) 寄存器的总数。请参阅the x86-64 SysV ABI 的图 3.4,这是在使用它的系统(如 Linux)上调用约定的权威参考。您在 xmm 寄存器中传递 1 个参数(在下一行),因此将 rax
设置为 1
,而不是 0
。指令 mov eax,1
具有相同的效果(因为将 64 位寄存器的上半部分移入 32 位寄存器为零)并且少了一个字节。
通过这些更改,程序正确地为我打印了 3.140000
。
我也读过在程序启动之前调用堆栈需要对齐,我希望使用基指针可以解决这个问题,否则程序会打印段错误。
是的,你说对了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。