Windows ASM printf与浮动

我一直试图在汇编程序中与Windows中的标准C库进行接口,我遇到了麻烦。 出于某种原因,我不能让printf接受浮点variables,所以这里有些问题。

这是我可以创build的最短程序来演示问题。 我已经包含了一些解释我理解应该发生的事情的评论。

谢谢

; ; Hello64.asm ; A simple program to print a floating point number in windows ; ; assemble: nasm float64.asm -f win64 ; link: golink /console /entry main float64.obj MSVCRT.dll ; ; tell assembler to generate 64-bit code ; bits 64 ; data segment section .data use64 pi dq 3.14159 textformat: db "hello, %lf!",0x0a, 0x00 ; friendly greeting ; set up the .text segment for the code section .text use64 ; global main is the entry point global main ; note that there is no _ before printf here, unlike in OS X extern printf main: mov rcx, textformat movq xmm0, qword [pi] mov rax, 1 ; need to tell printf how many floats call printf ; note next step - this puts a zero in rax xor rax,rax ret ; this returns to the OS based on how Windows calls programs. ; this return causes a delay then the program exits. 

你设法混合微软和sysv公约。 正确的方法是:

 mov rcx, textformat movq xmm1, qword [pi] movq rdx, xmm1 ; duplicate into the integer register sub rsp, 40 ; allocate shadow space and alignment (32+8) call printf add rsp, 40 ; restore stack xor eax, eax ret 

根据MSDN ,当使用可变参数时:

只有浮点值,整数和浮点寄存器将包含浮点值,以防被调用者期望整数寄存器中的值。