减去十进制值(汇编)

如何在汇编减去十进制值 IA32(linux)

1: mov edx, 1/2 sub ecx, ebx sub ecx, edx mov bal2, ecx 

我试过这个,但它是如何跳过小数的减法。 如果我input.5它给了我一个错误。

错误:expression后的垃圾“.5”

正如lightbulbone在他的回答中所说的那样,当使用通用寄存器( eax等)时,你不能处理浮点值。 你可以使用FPU,就像lightbulbone所暗示的那样,但是这样比较单调乏味。

或者,除非您的代码需要在古代CPU上运行 – 您可以使用SSE指令执行此任务,这更直接。 类似于您所展示的代码可能如下所示:

 .data OneHalf dd 0.5 bal2 dd ? .code movss xmm0, OneHalf ; instead of mov edx, 1/2 subss xmm1, xmm2 ; instead of sub ecx, ebx subss xmm1, xmm0 ; instead of sub ecx, edx movss bal2, xmm1 ; instead of mov bal2, ecx 

您提供的代码不能减去“十进制值”。 我假设用“十进制值”表示浮点值,在这种情况下,你不能像你所做的那样使用整数运算功能。

我强烈建议您下载英特尔IA-64架构软件开发人员手册( 英特尔IA-64架构软件开发人员Mnaul ),并通读介绍如何使用x87浮点设备的章节。 具体来看,看:

  • 第1卷,第5.2节
  • 第1卷,第8章
  • 卷2A,第3.2节

谨慎的说,我在浮点设备方面的经验非常少。 不过,我的理解是,它是一个基于堆栈的环境,您可以在其中加载(推送)一个项目到堆栈,然后对其进行操作。 我所看到的命令是:FLD,FSUB和FST(全部列在卷2A中)。

作为一个例子,下面是一个简短的程序,将+1和常量pi加载到浮点堆栈中,然后执行pi-1操作并弹出结果。

 /* floating point subtraction */ .text .globl _main 

_main:pushq%rbp movq%rsp,%rbp

  fld1 /* load +1.0 */ fldpi /* load pi (3.14159...) */ fsubp /* 3.14159 - 1.0, pop result */ movq $0x0, %rax leave ret