CSS   发布时间:2022-04-17  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了printf float in nasm assembly 64-bit大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想用printf打印一个浮点值
global main
extern printf

section .data
   String: db `%f\n`,0

section .bss
   rs: resq 1

[...]

   movq xmm0,[rs]
   mov rdi,String
   mov rax,0
   call printf

rs包含浮点值1.6

(gdb) x/fg &rs
0x600ad8 <rs>:  1.6000000000000001

但程序打印

[username@localhost folder]$./programname
0.000000

谁能让程序打印1.6?我究竟做错了什么?

解决方法

我怀疑问题与您的代码设置rax为0有关,而它必须为1,因为您传递浮点参数(有关详细信息,请参阅 here).基本上rax应该包含xmmN寄存器中传递的变量参数的数量.

编辑:

printf中的崩溃似乎是由堆栈miaslignment引起的,因为程序在movaps指令崩溃(期望内存操作数在16字节边界上对齐):

=> 0x7ffff7a65f84 <__printf+36>:    movaps %xmm0,0x50(%rsp)
   0x7ffff7a65f89 <__printf+41>:    movaps %xmm1,0x60(%rsp)
   0x7ffff7a65f8e <__printf+46>:    movaps %xmm2,0x70(%rsp)
   0x7ffff7a65f93 <__printf+51>:    movaps %xmm3,0x80(%rsp)
   0x7ffff7a65f9b <__printf+59>:    movaps %xmm4,0x90(%rsp)
   0x7ffff7a65fa3 <__printf+67>:    movaps %xmm5,0xa0(%rsp)
   0x7ffff7a65fab <__printf+75>:    movaps %xmm6,0xb0(%rsp)
   0x7ffff7a65fb3 <__printf+83>:    movaps %xmm7,0xc0(%rsp)

当进入main时,堆栈不是16字节对齐,但如果你解决这个问题,程序运行正常.下面是我的测试程序(注意子rsp,开头8):

global main
extern printf

section .data
    String db `%f\n`,0
    rs dq 1.6

section .text

main:
    sub rsp,8
    movq xmm0,qword [rs]
    mov rdi,String
    mov rax,1
    call printf
    add rsp,8
    mov eax,0x60
    xor edi,edi
    syscall

大佬总结

以上是大佬教程为你收集整理的printf float in nasm assembly 64-bit全部内容,希望文章能够帮你解决printf float in nasm assembly 64-bit所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。