You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

8086汇编中整数与小数相乘及结果显示的实现方法咨询

在8086汇编中实现整数与小数的乘法及结果显示

嘿,咱们来搞定8086汇编里整数乘小数还能显示结果的事儿!因为8086本身没自带浮点运算功能,所以咱们得用定点数转换的思路——把小数放大成整数来计算,最后再把结果转回去加上小数点就行。比如你要算10×1.06,就把1.06放大100倍变成106,计算10×106=1060,最后把1060还原成10.60就行。

核心思路拆解

  1. 小数转整数:把带两位小数的数(比如1.06、2.05)放大100倍,变成整数106、205;如果是一位小数就放大10倍。
  2. 整数乘法:用8086的MUL指令完成整数间的乘法(8位×8位结果存在AX寄存器里)。
  3. 结果还原与显示:把乘积除以放大倍数,拆分出整数部分和小数部分,依次打印整数、小数点、小数部分。

完整代码实现

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

火山引擎 最新活动