题目说明:给出一个公式,例如 “35 + 28 = ”,输出计算结果
一、准备材料
DOS功能调用表:https://blog.csdn.net/mybelief321/article/details/13168071
emu8086软件:https://emu8086-microprocessor-emulator.en.softonic.com/
ASCII码参考表:http://ascii.911cha.com/
二、asm代码
其中的注释详细解释了每一步代码的含义
在输入公式时,数字必须为两位,例如:01 + 01 =
加号、等于号两侧都需要加空格(双元运算符书写惯例)
data segment question db "97 + 56 = $" result db 0,0,0,"$" data ends code segment start: mov ax, data mov ds, ax ;将data放入ax lea dx, question mov ah, 09h int 21h ;调用DOS 09H功能:显示以$结尾的字符串 xor ax,ax ;ax归0 mov al, question + 1 ;第一个数的个位存入al mov bl, question ;第一个数的十位存入bl mov cl, question + 6 ;第二个数的个位存入cl mov dl, question + 5 ;第二个数的十位存入dl sub al, 30H sub cl, 30H sub bl, 30H sub dl, 30H ;ASCII转码 clc ;清空进位标志CF add al, cl ;两数个位相加 aaa ;使用非压缩BCD码相加指令,结果存储在AX mov byte ptr result+2,al ;将最终结果的个位存入result的个位 mov al, bl adc al, dl ;检查CF进位标志,进行带进位加法 aaa mov byte ptr result+1,al ;将最终结果的十位存入result的十位 lea dx, result jc hundred ;如果CF位为1,则说明十位加法后产生了百位,则转至处理三位数的hundred流程 add byte ptr result+1,30h add byte ptr result+2,30h ;转ASCII用于打印 inc dx jmp display ;显示最终结果 hundred: mov byte ptr result, 31h ;若产生百位,则必定为1 add byte ptr result+1, 30h add byte ptr result+2, 30h ;个位和十位转为ASCII display: mov ah, 9 int 21h mov ax, 4c00h ;结束,返回值为AL:0 int 21h ends end start