如何在程序集中减去小数值。 IA32(linux)
1: mov edx, 1/2
sub ecx, ebx
sub ecx, edx
mov bal2, ecx
我尝试了这个,但它有些如何用小数跳过减法。 如果我输入 .5 ,则会给我一个错误。
错误:表达式之后的垃圾`.5'
答案 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浮点工具的部分。具体来说,请看:
请注意,我对浮点设施的经验非常少。但是,我的理解是它是一个基于堆栈的环境,您可以在其中将项目加载(推送)到堆栈然后对其进行操作。我要看的命令是: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