题目说明:给出一个公式,例如 “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 
12-25 16:26