linux - 在汇编程序中打印 float

标签 linux assembly printf nasm glibc

我正在尝试从调用 printf 函数的汇编器打印浮点值。它可以很好地处理字符串和整数值,但无法打印 float 。这是工作代码的示例:

global  main
extern  printf

section .data
  message:    db      "String is: %d %x %s", 10, 0
  end_message:    db    ".. end of string", 0 

section .text
  main:
    mov eax, 0xff
    mov     edi, message
    movsxd rsi, eax
    mov rdx, 0xff
    mov rcx, end_message
    xor rax, rax
    call printf
    ret

String is: 255 ff .. end of string

因此,参数通过寄存器传递:edi 包含格式化字符串的地址,rsirdx 包含要打印的相同数字在十进制和十六进制样式中,rcx 包含字符串结尾,rax 包含 0,因为我们没有要打印的 float 。 此代码工作正常,但在尝试打印 float 时发生了一些变化:

global main

extern printf

section .data
    val: dq 123.456
    msg: db "Result is: %fl",10, 0

section .text
    main:
    mov rdi,msg
    movsd xmm0,[val]
    mov eax,1
    call printf

    mov rax, 0
    ret

这段代码可以被编译,但在执行时会返回段错误。问题似乎出在 xmm0 的错误值上,但尝试将 movsd xmm0,[val] 更改为 movsd xmm0,val 会出现

error: invalid combination of opcode and operands

消息。 编译器是在 openSuSe 12.3 上运行的 NASM

更新。我尝试编写一个 C 程序并生成一个 .S 程序集。它给出了一个非常奇怪的解决方案:

main:
.LFB2:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $32, %rsp
    movl    %edi, -4(%rbp)
    movq    %rsi, -16(%rbp)
    movq    val(%rip), %rax
    movq    %rax, -24(%rbp)
    movsd   -24(%rbp), %xmm0
    movl    $.LC0, %edi
    movl    $1, %eax
    call    printf
    movl    $0, %eax
    leave
    .cfi_def_cfa 7, 8
    ret

可以写一个简单的 printf 示例吗?

最佳答案

对于您的汇编程序问题: 您需要在主程序启动之前对齐堆栈。

插入

sub rsp, 8

紧接在main之后:

然后在ret之前再次添加:

add rsp, 8

关于linux - 在汇编程序中打印 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26839444/

相关文章:

linux - 使用 2 个参数在 BASH 中执行 C 程序

c - 在 Linux 内核中赋值两个值

assembly - 是否有任何此类处理器具有绕过缓存的指令?

c - 为什么 `printf("%s", "foo")` not being optimized to ` fputs ("foo", stdout)`?

c - Scanf 总是返回 0.000000

c - 是否有跨体系结构的方法来检测 Linux 上的 CPU 功能?

linux - 使用反向代理记录所有传入的 HTTP 请求,然后在克隆服务器中执行它以进行性能测试

c++ - 数字除以零是硬件异常

assembly - 为超过 4 字节的 x86 程序集 MASM 声明本地存储

c - 为什么 GCC 不优化对 printf 的调用?