Linux 汇编语言中浮点数的打印
我正在尝试从assemler调用printf函数打印浮点值。它可以很好地处理字符串和整数值,但无法打印浮点。下面是一个工作代码示例: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
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升分段错误如果答案是您所问问题的解决方案,您可以优雅地接受它;-)非常感谢您提供的解决方案:)