减去十进制值(汇编)

时间:2010-08-28 09:19:59

标签: linux assembly floating-point x86

如何在程序集中减去小数值。 IA32(linux)

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

我尝试了这个,但它有些如何用小数跳过减法。 如果我输入 .5 ,则会给我一个错误。

  

错误:表达式之后的垃圾`.5'

2 个答案:

答案 0 :(得分:4)

正如灯泡正确地在他的回答中所说,当使用通用寄存器(eax等)时,你无法处理浮点值。你可以使用FPU,就像灯泡所暗示的那样,但这是相对单调乏味的。

或者 - 除非你的代码需要在古老的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

答案 1 :(得分:2)

您提供的代码无法减去“十进制值”。我假设通过“十进制值”你真的是指浮点值,在这种情况下你不能像你那样使用整数运算工具。

我强烈建议您下载英特尔IA-64架构软件开发人员手册(Intel IA-64 Architecture Software Developer's 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