Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 汇编语言中浮点数的打印_Linux_Assembly_Printf_Nasm_Glibc - Fatal编程技术网

Linux 汇编语言中浮点数的打印

Linux 汇编语言中浮点数的打印,linux,assembly,printf,nasm,glibc,Linux,Assembly,Printf,Nasm,Glibc,我正在尝试从assemler调用printf函数打印浮点值。它可以很好地处理字符串和整数值,但无法打印浮点。下面是一个工作代码示例: 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

我正在尝试从assemler调用printf函数打印浮点值。它可以很好地处理字符串和整数值,但无法打印浮点。下面是一个工作代码示例:

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
字符串是:255 ff。。结束

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

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会给出一个

错误:操作码和操作数的组合无效

信息。 编译器是在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
在主菜单之后:

然后在ret之前再次添加:

add rsp, 8

非常感谢。它打印数字,但segfault仍然存在:结果是:123.456000升分段错误如果答案是您所问问题的解决方案,您可以优雅地接受它;-)非常感谢您提供的解决方案:)