巴拉巴拉. 2022-04-14 13:23 采纳率: 50%
浏览 44

最简单的汇编加法程序如何设计呢

需要设计一个程序 内容含有加法即可
如何最简单的设计出一个程序呢

  • 写回答

1条回答 默认 最新

  • 北斗猿 新星创作者: 人工智能技术领域 2022-04-14 13:51
    关注
    
    enterline macro        ;定义回车换行的宏指令
        mov dl,13
        mov ah,2
        int 21h
        mov dl,10
        mov ah,2
        int 21h
    endm
    
    DATAS SEGMENT
        ;此处输入数据段代码
        info db'Please enter an addition expression, such as A + B$'
        err db 'Illegal input! Please Try Again$'
        again db'Invalid input, try again.$'
        overout db'The number overflowed, try again$'
        overout1 db'The result overflowed, try again$'
        inn db'Please enter your answer$'
        win db'Congratulations, the answer is right$'
        note db'Note: press the r key to continue to input the next question, and press the q key to exit the program$'
        lose1 db'Sorry, your answer is wrong. You have 2 more chances$'
        lose2 db'Sorry, your answer is wrong. You have 1 more chances$'
        lose3 db'Sorry, your answer is wrong. The right answer is $'
    
        result dw 0        ;用于存放最终结果
        errtime db ?    ;答案错误次数
        flag db ?
    
        buf db 30,?,30 dup(0)    ;定义键盘接收字符缓冲区,最多接收19个字符
        ff db ?        ;输出的判断前导0的标志
        input db ?    ;储存输入的按键
    
        op1 dw ?    ;定义两个操作数
        op2 dw ?
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        ;此处输入代码段代码
    
    main:                ;加法模块        ;设计完加法子程序后把下面这部分也封装进去
        lea dx,info        ;提示信息
        mov ah,9
        int 21h
        enterline
    
        mov errtime,3    ;允许犯错的次数
    
        call inputi        ;调用输入的子程序,输入公式
    
        cmp flag,1
        je main            ;由于错误输入跳回a1重新进行加法操作
        cmp flag,2
        je main            ;由于溢出跳回a1重新输入
    
    
    shuru:
        lea dx,inn        ;提示输入信息
        mov ah,9
        int 21h
        enterline
    
        call input2        ;调用输入的子程序,输入答案
        cmp flag,1
        je shuru            ;由于错误输入跳回shuru
        cmp flag,2
        je shuru            ;由于错误输入跳回shuru
    
        mov bx,result        ;判断输入的答案是否正确
        cmp bx,op1
        je correct
    
        dec errtime        ;尝试次数减1
        cmp errtime,2    ;剩余两次机会
        je error1
        cmp errtime,1    ;剩余1次机会
        je error2
        cmp errtime,0    ;不剩机会
        je error3
    
    error1:
        lea dx,lose1        ;提示信息
        mov ah,9
        int 21h
        enterline
        jmp shuru        ;执行完后跳回主菜单
    error2:
        lea dx,lose2        ;提示信息
        mov ah,9
        int 21h
        enterline
        jmp shuru        ;执行完后跳回主菜单
    error3:
        lea dx,lose3        ;提示信息
        mov ah,9
        int 21h
        mov bx,result        ;result是正确的和
        call outi            ;输出正确结果,结束此题
        enterline
    
    judge1:                ;结果错误时的按键提示
        lea dx,note        ;提示信息
        mov ah,9
        int 21h
        enterline
    
        call judge        ;判断输入的键是什么键
        enterline
        cmp input,'r'
        je main
        cmp input,'q'
        je stop
    
        jmp judge1
    correct:            ;表示结果正确
        lea dx,win        ;提示信息
        mov ah,9
        int 21h
        enterline
    
    judge2:                ;结果正确时的按键提示
        lea dx,note        ;提示信息
        mov ah,9
        int 21h
        enterline
    
        call judge        ;判断输入的键是什么键
        enterline
        cmp input,'r'
        je main
        cmp input,'q'
        je stop
        jmp judge2
    
    stop:
        MOV AH,4CH
        INT 21H
    
    inputi proc            ;输入子程序如下;专门用于存表达式的子程序
        mov flag,0        ;初始化flag,用于标志错误或溢出
        mov result,0    ;存放累加结果
    
        lea dx,buf        ;从键盘接收输入数值放入buf缓冲区(输入操作)
        mov ah,10
        int 21h
        enterline        ;回车换行
    
    
        mov cl,buf+1    ;获取实际键入字符数,置于CX寄存器中
        xor ch,ch        ;ch清0
    
        xor di,di        ;累加器清0
        xor dx,dx        ;dX寄存器清0
        mov bx,1        ;由于从个位数开始算起,因而将所乘权值设为1
    
        lea si,buf+2    ;将si指向接收到的第1个字符位置
        add si,cx        ;因为从个位算起,所以将si指向最后1个接收到的个位数
        dec si            ;往回减1使其指向字串最后一个元素
    
    ;cov是检测并生成第一个数字的步骤
    cov:mov al,[si]        ;取出个位数给al
        cmp al,'+'
        jz addi        ;遇见空格则跳转
    
        cmp al,'0'        ;边界检查:如果输入不是0-9的数字,就报错
        jb wrong
        cmp al,'9'
        ja wrong
    
        sub al,30h        ;将al中的ascii码转为数字
        xor ah,ah
        mul bx            ;乘以所处数位的权值
        cmp dx,0        ;判断结果是否超出16位数范围,如超出则报错
        jne yichu
    
        add di,ax        ;将形成的数值叠加放在累加器di中
           cmp di,99
        ja yichu        ;超过100报错
    
        mov ax,bx        ;将BX中的数位权值扩大10倍,此处需要借助ax来实现
        mov bx,10
        mul bx
        mov bx,ax
    
        dec si            ;si指针减1,指向前一数位
        loop cov        ;按CX中的字符个数计数循环
    
    lastadd:            ;从后往前数的最后一个加数,执行lastadd时loop已经结束
        mov bx,result
        add bx,di        ;存在bx寄存器中带回
        mov result,bx    ;备份结果在result中
        jmp return
    addi:
        mov bx,result    ;把当前累加值赋给bx
        add bx,di        ;di表示当前某一个加数
    
        cmp bx,result    ;判断是否溢出超过65535
        jb yichu
        mov result,bx    ;将结果存回result
    
        xor ax,ax
        xor bx,bx
        xor di,di        ;累加器清0
        mov bx,1        ;由于下一个加数又从个位数开始算起,因而将所乘权值设为1
    
        dec si            ;向前移动一格位置
        dec cx            ;遇到加号cx相应的减少1
        jmp cov        ;结束后跳到cov部分
    
    wrong:            ;输入错误
        lea dx,err
        mov ah,9
        int 21h
        mov flag,1
        enterline
        jmp return
    
    yichu:            ;加数超过100
        mov flag,2
        lea dx,overout
        mov ah,9
        int 21h
        enterline
    
    return:
        ret
    inputi endp
    
    
    input2 proc            ;专用于输入纯数字答案的子程序
        mov flag,0
        lea dx,buf        ;从键盘接收输入数值放入buf缓冲区
        mov ah,10
        int 21h
        enterline        ;回车换行
    
        mov cl,buf+1    ;获取实际键入字符数,置于CX寄存器中
        xor ch,ch
        xor di,di        ;累加器清0
        xor dx,dx        ;DX寄存器清0
        mov bx,1        ;由于从个位数开始算起,因而将所乘权值设为1
        lea si,buf+2    ;将si指向接收到的第1个字符位置
        add si,cx        ;因为从个位算起,所以将si指向最后1个接收到的个位数
        dec si
    
    cov:mov al,[si]        ;取出个位数给al
        cmp al,'0'        ;边界检查:如果输入不是0-9的数字,就报错
        jb wrong2
        cmp al,'9'
        ja wrong2
    
        sub al,30h        ;将al中的ascii码转为数字
        xor ah,ah
        mul bx            ;乘以所处数位的权值
        cmp dx,0        ;判断结果是否超出16位数范围,如超出则报错
        jne over2
    
        add di,ax        ;将形成的数值放在累加器di中
        jc over2        ;如数值超过16位数范围报错
    
        mov ax,bx        ;将BX中的数位权值乘以10
        mov bx,10
        mul bx
        mov bx,ax
        dec si            ;si指针减1,指向前一数位
        loop cov        ;按CX中的字符个数计数循环
    
           mov op1,di        ;将结果储存在op1中
        jmp return2
    
    wrong2:                ;给出错误提示
        lea dx,err
        mov ah,9
        int 21h
        enterline
        mov flag,1
    
        jmp return2
    
    over2:
        lea dx,overout
        mov ah,9
        int 21h
        enterline
        mov flag,2
    
    return2:
        ret
    input2 endp
    
    outi proc                ;输出子程序
        mov ax,bx            ;待输出的数先存在bx里面,在给ax
        mov bx,10000        ;初始数位权值为10000
        mov ff,0            ;每次都赋初值0
    
    cov1:xor dx,dx            ;将dx:ax中的数值除以权值
        div bx
        mov cx,dx            ;余数备份到CX寄存器中
    
        cmp ff,0            ;检测是否曾遇到非0商值
        jne nor1            ;如遇到过,则不管商是否为0都输出显示
        cmp ax,0            ;如未遇到过,则检测商是否为0
        je cont                ;为0则不输出显示
    nor1:
        mov dl,al            ;将商转换为ascii码输出显示
        add dl,30h
        mov ah,2
        int 21h
    
        mov ff,1            ;曾遇到非0商,则将标志置1
    cont:
        cmp bx,10            ;检测权值是否已经修改到十位了
        je outer            ;如果相等,则完成最后的个位数输出显示
    
        xor dx,dx            ;将数位权值除以10
        mov ax,bx
        mov bx,10
        div bx
        mov bx,ax
    
        mov ax,cx            ;将备份的余数送入AX
        jmp cov1                ;继续循环
    outer:
        mov dl,cl            ;最后的个位数变为ascii码输出显示
        add dl,30h
        mov ah,2
        int 21h
        enterline
    ret
    outi endp
    
    judge proc
        mov ah,1
        int 21h
        mov input,al        ;将储存的字符给input
    ret
    judge endp
    
    
    CODES ENDS
        END START
    
    评论

报告相同问题?

问题事件

  • 创建了问题 4月14日