我正在尝试从调用 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 包含格式化字符串的地址,rsi 和 rdx 包含要打印的相同数字在十进制和十六进制样式中,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/