用80x86汇编语言,编写一个判断闰年的程序

来源:互联网 发布:知乎 神人 常凯申 编辑:程序博客网 时间:2024/06/05 04:26

要求:有程序的分析;只能输入数字,输入其它有错误提示。

;==============================================
;程序如下:
;==============================================
DATA  SEGMENT          ;数据段.

  MSG1 DB  13, 10, 'Please Input : $'
  VAR1 DB  13, 10, 'THE YEAR IS LEAP!','$'
  VAR2 DB  13, 10, 'THE YEAR IS NOT LEAP!','$'
  MSG3 DB  13, 10, 'Input ERROR.  $'

     x DW ?        ;年份:0~65535
     B DW 4
     G DW 400
     F DW 100

DATA  ENDS
;----------------------------------------------
CODE   SEGMENT         ;代码段.
    ASSUME   CS: CODE, DS: DATA
START:
    MOV  AX, DATA
    MOV  DS, AX
;--------------------------------
    MOV  DX, OFFSET MSG1 ;提示 Please Input :
    MOV  AH, 9
    INT  21H
;--------------------------------
IN_LOOP:
    MOV  x,  0         ;数据清零.

    MOV  CX, 4         ;输入4位
_INX:
    PUSH CX
    MOV  AH, 1         ;输入单个字符.
    INT  21H
;--------------------------------
    CMP  AL, '0'
    JB   _IN_ERR       ;小于'0',不是数字.
    CMP  AL, 3AH
    JB   SUB_30H       ;'0'~'9'.
;--------------------------------
_IN_ERR:               ;大于'9',也不是数字.
    MOV  DX, OFFSET MSG3 ;提示 Input ERROR.
    MOV  AH, 9
    INT  21H
    JMP  EXIT          ;转到结束程序.
;--------------------------------
SUB_30H:
    SUB  AL, '0'       ;还原为数字.
    MOV  AH, 0
    MOV  CX, AX        ;暂存新数据.
  
    MOV  AX, x
    MOV  BX, 10        ;老数据乘以10
    MUL  BX
    ADD  AX, CX        ;加上新数据.
    MOV  x,  AX        ;保存.

    POP  CX
    LOOP _INX          ;继续输入.
;--------------------------------
    MOV  AX, x         ;取来刚刚输入的年份
    CWD                ;拓展为32位
    DIV  B             ;除以4
    CMP  DX, 0         ;余数为0?
    JNZ  L1            ;非0,就不是闰年
;--------------------
    MOV  AX, x       
    CWD
    DIV  G             ;除以400
    CMP  DX, 0       
    JZ   L2            ;余数为0,就是闰年
;--------------------
    MOV  AX, x
    CWD
    DIV  F             ;除以100
    CMP  DX, 0
    JNZ  L2            ;余数非0,就是闰年
;--------------------
L1:
    MOV  DX, OFFSET  VAR2  ;显示:THE YEAR IS NOT LEAP!
    JMP  _O_STR
L2:
    MOV  DX, OFFSET  VAR1  ;显示:THE YEAR IS LEAP!
_O_STR:
    MOV  AH, 09H           ;显示
    INT  21H
;--------------------------------
EXIT:
    MOV  AH, 4CH
    INT  21H
;--------------------------------
CODE  ENDS
    END  START
;==============================================
原题网址:http://zhidao.baidu.com/question/340373455.html
后记:
这程序是正确的。并且在几个答案中,是唯一符合题目要求的,实验一下即可得出结论。
但是,提问者得到了正确答案后,却采用了投票方式来决定最优,真不地道。
;==============================================

0 0