NASM 尝试将整数乘以浮点数,printf 写入垃圾

问题描述 投票:0回答:1

我尝试创建一个非常简单的示例:一个转换程序,其中一个数字是 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 编写它,但无论我尝试什么,它都会输出垃圾。

assembly nasm x87
1个回答
0
投票

您的代码似乎存在一些导致垃圾输出的问题。这是应该可以正常工作的代码的更新版本:

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
指令直接将值从内存移动到堆栈。这简化了代码并避免了任何潜在的堆栈错位问题。

通过进行这些更改,程序应该正确地将整数乘以浮点数并输出所需的结果。

© www.soinside.com 2019 - 2024. All rights reserved.