MASM32汇编中整数转浮点数:实现计算结果输出实数的方法
MASM32实现实数输出的修改方案
原代码使用整数除法idiv导致结果被截断,要输出带小数的实数,需改用**浮点运算(x87 FPU)**结合浮点数转字符串函数实现,以下是修改后的完整代码及说明:
修改后的代码
include \masm32\include\masm32rt.inc .code start: call main exit main proc LOCAL var1:DWORD LOCAL var2:DWORD LOCAL var3:DWORD LOCAL tong:DWORD LOCAL result:REAL8 ; 改为双精度浮点数存储结果 LOCAL temp_str[64]:BYTE ; 用于存储浮点数转字符串后的缓冲区 ; 读取输入整数 mov var1, sval(input("Enter number 1: ")) mov var2, sval(input("Enter number 2: ")) mov var3, sval(input("Enter number 3: ")) ; 原有整数加法输出部分保留 print chr$("v1 + v2 + v3 = ") mov eax, var1 add eax, var2 add eax, var3 mov tong, eax print str$(tong) print chr$(13,10) ; 浮点计算 [(v1 * v2) - v3] / 3 print chr$("[(v1 * v2) - v3] / 3 = ") fild var1 ; 将var1(整数)加载到FPU栈顶,转为浮点数 fild var2 ; FPU栈:st0=var2, st1=var1 fmulp st(1), st0; 计算st1*st0,结果存在st1,弹出st0 → st0=var1*var2 fild var3 ; FPU栈:st0=var3, st1=var1*var2 fsubp st(1), st0; 计算st1 - st0,结果存在st1,弹出st0 → st0=(var1*var2)-var3 fld REAL8 PTR [_three] ; 加载3.0到FPU栈顶 fdivp st(1), st0; 计算st1 / st0 → st0=[(var1*var2)-var3]/3 fstp result ; 将栈顶结果存入result变量,弹出栈 ; 将浮点数转为字符串并输出 invoke fltstr, result, addr temp_str, 1 ; 1表示保留1位小数,可按需调整 print addr temp_str print chr$(13,10) ret _three REAL8 3.0 ; 定义浮点常数3.0 main endp end start
关键修改点说明
- 变量类型调整:将
result改为REAL8(双精度浮点数),用于存储浮点计算结果。 - 浮点运算替换整数除法:使用x87 FPU指令完成计算:
fild:将整数加载到FPU并转换为浮点数fmulp:浮点乘法并弹出栈顶fsubp:浮点减法并弹出栈顶fdivp:浮点除法并弹出栈顶
- 浮点数转字符串:使用MASM32的
fltstr函数,将浮点数转换为字符串,第三个参数控制小数位数(示例中保留1位,对应需求的-33.3)。 - 定义浮点常数:声明
_three REAL8 3.0,用于浮点除法的除数,避免整数转浮点的额外操作。
测试验证
输入1、23、123时,计算过程为[(1*23)-123]/3 = (23-123)/3 = (-100)/3 ≈ -33.3,修改后的代码会正确输出该实数结果。
内容的提问来源于stack exchange,提问作者Sơn Nguyễn
相关产品推荐
相关产品推荐

