我尝试创建一个非常简单的示例:一个转换程序,其中一个数字是 int,另一个是 double。
global _main
extern _printf
section .data
km_h dd 70
format db '%fmph=%dkm/h',10,13,0
km_mi dq 1.609
section .code
_main:
push ebp
mov ebp, esp
sub esp, 16 ;for the parameters
fld qword [km_mi]
fimul dword [km_h]
mov dword [esp], format
mov eax, dword [km_h]
mov [esp+12], eax
fstp qword [esp+4]
push format
call _printf
mov esp, ebp
pop ebp
ret
我在 C 源代码上尝试了 cc -S,并使用 mov
[esp+X]
而不是 push
ing 编写它,但无论我尝试什么,它都会输出垃圾。
您的代码似乎存在一些导致垃圾输出的问题。这是应该可以正常工作的代码的更新版本:
global _main
extern _printf
section .data
km_h dd 70
format db '%fmph=%dkm/h',10,0
km_mi dq 1.609
section .text
_main:
push ebp
mov ebp, esp
sub esp, 16 ;for the parameters
fld qword [km_mi]
fmul dword [km_h]
mov dword [esp+8], format
fstp qword [esp+4]
push dword [km_h]
push dword [esp+8]
call _printf
mov esp, ebp
pop ebp
ret
以下是我根据之前在代码中遇到的问题所做的更改:
1.在
format
字符串中,我删除了回车符(13)以保持输出干净。
2.在
.text
部分,我将section .code
更改为section .text
以符合标准命名约定。
3.将
fimul
替换为 fmul
以正确地将浮点值与整数相乘。
4.调整
mov
指令的偏移量以正确定位堆栈中的值。这确保将正确的值传递给printf
.
5.我没有使用
fstp
和push
,而是使用mov
指令直接将值从内存移动到堆栈。这简化了代码并避免了任何潜在的堆栈错位问题。
通过进行这些更改,程序应该正确地将整数乘以浮点数并输出所需的结果。