Assembly nasm中的浮点运算
下面的代码始终返回0.0000000。我不知道它为什么这样做 这是密码Assembly nasm中的浮点运算,assembly,nasm,Assembly,Nasm,下面的代码始终返回0.0000000。我不知道它为什么这样做 这是密码 SECTION .data flt1: dq 5.327 formatin: db "%f", 0 SECTION .bss SECTION .text global _main extern _scanf extern _printf _main: push ebp mov ebp, esp push dword[flt1] push formatin
SECTION .data
flt1: dq 5.327
formatin: db "%f", 0
SECTION .bss
SECTION .text
global _main
extern _scanf
extern _printf
_main:
push ebp
mov ebp, esp
push dword[flt1]
push formatin
call _printf
add esp, 8
mov esp, ebp
pop ebp
ret
你能帮我解决这个问题吗?这样我就可以在c函数调用中显示带小数点的数字了,
float
被提升为double
。您还将flt1
声明为dq
,一个双精度。所以不管怎样,您都需要传递一个64位类型。如果您使用的是64位系统,只需使用push-qword[flt1]
。如果您使用的是32位系统,则必须改用fld
。由于参数大小不同,因此您必须在windows 8上的nasm x86中使用add esp,12
而不是add esp,8
。C惯例是将float
作为double
传递。尝试在32位模式下推送qword[flt1]@wallyk。没有推送qword的fld
/fstp
,SSE/MMX,或仅作为2个DWORD。此外,还必须调整add esp,8
。scanf的参数是号码的地址,而不是号码。(K&R称之为“最常见的错误”)尝试推送flt1。如前所述,printf
总是想要一个双精度的。