8086汇编中整数与小数相乘及结果显示的实现方法咨询
在8086汇编中实现整数与小数的乘法及结果显示
嘿,咱们来搞定8086汇编里整数乘小数还能显示结果的事儿!因为8086本身没自带浮点运算功能,所以咱们得用定点数转换的思路——把小数放大成整数来计算,最后再把结果转回去加上小数点就行。比如你要算10×1.06,就把1.06放大100倍变成106,计算10×106=1060,最后把1060还原成10.60就行。
核心思路拆解
- 小数转整数:把带两位小数的数(比如1.06、2.05)放大100倍,变成整数106、205;如果是一位小数就放大10倍。
- 整数乘法:用8086的
MUL指令完成整数间的乘法(8位×8位结果存在AX寄存器里)。 - 结果还原与显示:把乘积除以放大倍数,拆分出整数部分和小数部分,依次打印整数、小数点、小数部分。
完整代码实现
1. 数据段定义
先把需要的变量都定义好,包括原始整数、放大后的小数、放大倍数、存储结果的变量,还有打印用的临时变量:
DATA SEGMENT num DB 10 ; 待乘的整数(比如10、100) decimal_scaled DB 106 ; 小数放大100倍后的值(1.06→106,2.05→205) scale DW 100 ; 放大倍数(两位小数用100,一位用10) result DW 0 ; 存储乘法结果 temp_num DW ? ; 临时存储整数部分(用于多位数打印) divisor DB 100 ; 打印多位数时的除数 quo DB 0 ; 临时存储商 DATA ENDS
2. 代码段实现
从初始化数据段,到乘法运算,再到拆分显示结果:
CODE SEGMENT START: MOV AX, DATA MOV DS, AX ; 第一步:执行整数乘法 MOV AL, num MUL decimal_scaled ; AX = AL × decimal_scaled(比如10×106=1060) MOV result, AX ; 把结果存到result变量 ; 第二步:拆分整数部分和小数部分 MOV AX, result DIV scale ; AX = 结果 ÷ 放大倍数(整数部分),DX = 余数(小数部分) MOV temp_num, AX ; 保存整数部分 ; 第三步:打印整数部分(支持两位数、三位数) ; 这里以三位数为例,比如100×2.05=20500,整数部分是205 MOV CX, 3 ; 循环3次打印三位 MOV BL, divisor ; 初始除数100 print_integer: MOV AX, temp_num MOV DX, 0 DIV BL ; AX=当前位的数字,DX=剩余的数 ; 打印当前位 MOV AH, 02H MOV DL, AL ADD DL, 30H ; 把数字转成ASCII码 INT 21H ; 更新剩余数和除数 MOV temp_num, DX MOV AL, BL MOV BL, 10 DIV BL ; 除数除以10,下次用10,再下次用1 MOV BL, AL LOOP print_integer ; 如果是两位数整数,直接用你提供的两位数打印逻辑即可: ; MOV AL, temp_num ; MOV CL, 10 ; DIV CL ; MOV AH, 02H ; MOV DL, AL ; ADD DL, 30H ; INT 21H ; MOV AH, 02H ; MOV DL, AH ; ADD DL, 30H ; INT 21H ; 第四步:打印小数点 MOV AH, 02H MOV DL, '.' INT 21H ; 第五步:打印小数部分(两位) MOV AX, DX ; DX里是之前除法的余数,也就是小数部分的放大值(比如60) MOV CL, 10 DIV CL ; AL=十位,AH=个位 ; 打印十分位 MOV AH, 02H MOV DL, AL ADD DL, 30H INT 21H ; 打印百分位 MOV AH, 02H MOV DL, AH ADD DL, 30H INT 21H ; 程序退出 MOV AH, 4CH INT 21H CODE ENDS END START
关键细节说明
- 适配不同位数:如果整数是一位数,直接打印AL的值就行;如果是三位数,就用上面的循环逻辑。你提供的
three_digit代码片段核心思路是对的,我调整了一下让它更适配结果拆分后的打印。 - 小数位数扩展:如果要处理三位小数,就把放大倍数改成1000,最后小数部分打印三位即可。
- 乘法范围:8位×8位的乘法结果最大是65535(255×255),如果你的整数和放大后的小数乘积超过这个值,就得用16位乘法(
MUL指令用AX和另一个16位寄存器相乘,结果存在DX:AX里)。
内容的提问来源于stack exchange,提问作者Adrian Joshua




