从键盘输入N个十进制数,求它们的和

从键盘输入N个十进制数,求它们的和(累加和要求不大于65535),并将累加结果在屏幕上显示出来。
要求给出必要的提示信息(用宏调用完成);
累加功能由子程序调用实现;
二进制数形式的累加和转换为十进制数并显示由子程序调用实现。
悬赏分:100 | 解决时间:2011-11-08 15:15:00
;==============================================
最佳答案:
;从键盘输入N个十进制数(数与数之间用空格隔开),以回车结束
;求它们的和(累加和要求不大于65535)
;并将累加结果在屏幕上显示出来
;给出必要的提示信息(用宏调用完成)
;累加功能由子程序调用实现
;以上要求均已满足。
;程序如下:
;----------------------------------------------
DISP_STR  MACRO  X     ;宏定义.
    MOV  DX, OFFSET X
    MOV  AH, 9
    INT  21H
ENDM
;----------------------------------------------
DATA  SEGMENT          ;数据段.
  MSG1 DB  13, 10, 'Please Input : $'
  MSG2 DB  13, 10, 'I can not count so much ! $'
  MSG3 DB  13, 10, 'The SUM is : $'
    x DW  ?            ;存放新输入数据.
    y DW  ?            ;求和.
DATA  ENDS
;----------------------------------------------
CODE   SEGMENT         ;代码段.
    ASSUME   CS: CODE, DS: DATA
START:
    MOV  AX, DATA
    MOV  DS, AX
;--------------------------------
    DISP_STR  MSG1     ;宏调用,提示 Please Input :
    MOV  y,  0         ;和 清零.
;--------------------------------
IN_LOOP:
    MOV  x,  0         ;数据清零.
_INX:
    MOV  AH, 1         ;输入字符.
    INT  21H
    CMP  AL, 13        ;回车?
    JZ   _IN_END       ;全部数字结束.
    CMP  AL, ' '       ;空格?
    JZ   _INY          ;本数字结束.
    CMP  AL, 30H
    JB   _IN_ERR       ;小于'0',输入错误.
    CMP  AL, 3AH
    JNB  _IN_ERR       ;大于'9',输入错误.
;--------------------------------
    SUB  AL, 30H
    MOV  AH, 0
    MOV  CX, AX
    MOV  AX, x
    MOV  BX, 10        ;老数据乘以10
    MUL  BX
    AND  DX, DX
    JNZ  _IN_ERR       ;输入过大,错误.
    ADD  AX, CX        ;加上新数据.
    JC   _IN_ERR
    MOV  x,  AX        ;保存.
    JMP  _INX          ;继续输入.
;--------------------------------
_INY:
    CALL SUM
    JC   _IN_ERR
    JMP  IN_LOOP       ;继续输入.
;--------------------------------
_IN_END:
    CALL SUM
    JC   _IN_ERR
    DISP_STR  MSG3     ;宏调用,提示  The SUM is :
    MOV  AX, y
    CALL PRINTAX       ;调用显示子程序
    JMP  EXIT
;--------------------------------
_IN_ERR:
    DISP_STR  MSG2     ;宏调用,提示 can not count so much !
EXIT:   
    MOV  AH, 4CH
    INT  21H
;--------------------------------
SUM PROC
    MOV  AX, x         ;完整的新数据.
    ADD  AX, y         ;求和.
    MOV  y,  AX        ;保存.
    RET
SUM ENDP  
;--------------------------------
PRINTAX PROC  
    MOV  BX, 10
    OR   AX, AX
    JZ   _0_
LOOP_P:
    XOR  DX, DX
    DIV  BX
    MOV  CX, AX     ;商.
    OR   CX, DX
    JZ   _E_       
    PUSH DX  
    CALL LOOP_P     ;递归.
    POP  DX        
    ADD  DL, '0'   
    JMP  _1_
_0_:MOV  DL, '0' 
_1_:MOV  AH, 2
    INT  21H
_E_:RET
PRINTAX ENDP
;------------------------------
CODE  ENDS
    END  START
;==============================================
回答者: 做而论道 | 十五级  采纳率:42% 名人 达人
回答时间:2011-11-8 15:03
提问者对于答案的评价:非常感谢
原题网址:http://zhidao.baidu.com/question/339194291.html
;==============================================

你可能感兴趣的:(80x86汇编语言)