如何在汇编中减去十进制值 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浮点设备的章节。 具体来看,看:
谨慎的说,我在浮点设备方面的经验非常少。 不过,我的理解是,它是一个基于堆栈的环境,您可以在其中加载(推送)一个项目到堆栈,然后对其进行操作。 我所看到的命令是: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