【问题标题】:How to subtract two numbers and get a negative number in NASM?如何在 NASM 中减去两个数字并得到一个负数?
【发布时间】:2017-06-30 07:05:22
【问题描述】:

我有这段代码应该减去两个数字,一个浮点数 (10.25) 和一个整数 (15):

extern _printf
global _main
section .bss
  num1: resb 4
  num2: resb 4
section .data
  format_number: db "%f", 10, 0
section .text
_main:

  mov dword [num1], 15
  mov dword [num2], __float32__(10.25)

  sub esp, 8
  fild dword [num2]
  fsub dword [num1]
  fstp qword [esp]
  push format_number
  call _printf
  add esp, 12

ret

我得到的输出是:

1092878336.000000

我期望的输出是:

-4.750000

如何得到我期望的结果?

【问题讨论】:

  • 您正在使用fild 加载您已经作为浮点数存储在内存中的num2。您可能一直在寻找类似 @​​987654324@ fld dword [num2] fisub dword [num1] fstp qword [esp] 的东西。 FISUB 将 [num1] 处的整数值转换为扩展精度浮点数,然后从已经包含 10.25 的 FPU 堆栈的顶部减去该值
  • @MichaelPetch 非常感谢,我不知道fisub。我会阅读你在上一个问题中告诉我的教程。

标签: windows gcc assembly x86 nasm


【解决方案1】:

解决办法是:

extern _printf
global _main
section .bss
  num1: resb 4
  num2: resb 4
section .data
  format_number: db "%f", 10, 0
section .text
_main:

  mov dword [num1], 15
  mov dword [num2], __float32__(10.25)

  sub esp, 8
  fld dword [num2]
  fisub dword [num1]
  fstp qword [esp]
  push format_number
  call _printf
  add esp, 12

ret

我得到的输出是:

-4.750000

感谢@MichaelPetch,您的答案就是解决方案。 ^_^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2016-01-07
    • 1970-01-01
    相关资源
    最近更新 更多