如何在8086汇编中实现两个用户输入分别乘对应变量后相加
8086汇编乘法加法功能实现方案
核心原理
8086指令集中,8位无符号乘法使用MUL指令完成:默认取AL寄存器的值作为被乘数,与指定的8位操作数相乘,16位长度的乘积会自动存入AX寄存器。由于两个乘积的最大值仅为 9*10 + 9*20 = 270,完全可以用16位寄存器存储,加法运算直接操作16位寄存器即可。
完整修改后代码
;TITLE Multiply input with number then add them .model small .stack 100 .data f1 DB 10 f2 DB 20 msg1 DB 13,10,"First input = $" ; 提示输入第一个1位数字 msg2 DB 13,10,"Second input = $" ; 提示输入第二个1位数字 msg3 DB 13,10,"Product = $" msg4 DB 13,10,"Addition = $" ; 提示输出最终相加结果 q1 DB ? ; 存储第一个用户输入 q2 DB ? ; 存储第二个用户输入 res DW ? ; 存储最终计算结果 .code main proc mov ax,@data mov ds,ax ; 读取第一个输入 mov ah,09h lea dx, msg1 int 21h mov ah,01h int 21h sub al,30h mov q1,al ; ======== 第一个输入乘f1实现 ======== mov al, q1 mul f1 ; 运算 al * f1,乘积存入AX mov res, ax ; 暂存第一个乘积到res变量 ; 读取第二个输入 mov ah,09h lea dx, msg2 int 21h mov ah,01h int 21h sub al,30h mov q2,al ; ======== 第二个输入乘f2实现 ======== mov al, q2 mul f2 ; 运算 al * f2,乘积存入AX ; ======== 两个乘积相加实现 ======== add res, ax ; 第二个乘积与res里存的第一个乘积相加,结果存在res中 ; 输出结果提示 mov ah,09h lea dx, msg4 int 21h ; ======== 十进制结果输出逻辑 ======== mov ax, res mov cx, 0 mov bx, 10 ; 逐位取余压栈 split_num: div bx ; 商存在AL,余数存在AH push ax ; 把余数压栈 inc cx ; 统计位数 mov ah, 0 cmp al, 0 ; 商为0则停止拆分 jne split_num ; 逐位弹出转ASCII输出 print_num: pop dx mov dl, dh add dl, 30h ; 余数转ASCII码 mov ah, 02h int 21h loop print_num mov ah, 4Ch int 21h main endp end main
关键代码说明
- 乘法运算:
MUL指令自动处理8位乘8位的进位,不需要额外判断溢出,符合你的业务场景需求 - 结果暂存:第一个乘积存入
res变量避免被第二次乘法的结果覆盖,直接相加即可得到最终值 - 输出逻辑:通过除10取余的方式把数字拆分为单个十进制位,转ASCII后逐位输出,支持最大3位数字的显示
内容的提问来源于stack exchange,提问作者Adrian Joshua
相关产品推荐
相关产品推荐

