Windows 带浮点数的 ASM printf
Windows ASM printf with float
我一直在尝试在汇编程序中与 Windows 中的标准 C 库接口,但我遇到了麻烦。出于某种原因,我不能让 printf 接受浮点变量,所以这里有问题。
这是我能创建的最短的演示问题的程序。我已经包含了解释我对应该发生的事情的理解的评论。
谢谢
;
; 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.
您成功地混合了 Microsoft 和 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,当使用可变参数时:
For floating-point values only, both the integer and the floating-point register will contain the float value in case the callee expects the value in the integer registers.
我一直在尝试在汇编程序中与 Windows 中的标准 C 库接口,但我遇到了麻烦。出于某种原因,我不能让 printf 接受浮点变量,所以这里有问题。
这是我能创建的最短的演示问题的程序。我已经包含了解释我对应该发生的事情的理解的评论。
谢谢
;
; 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.
您成功地混合了 Microsoft 和 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,当使用可变参数时:
For floating-point values only, both the integer and the floating-point register will contain the float value in case the callee expects the value in the integer registers.