判断AX中的年份是否闰年

51 阅读2分钟

判断AX中的年份是否闰年,是则将’Y‘显示在屏幕上,否则将’N‘显示在屏幕上(用数据1900、2008、1999做测试)(显示字符使用INT 21H的02号功能)

DATA SEGMENT
    ;此处输入数据段代码
    YEAR DW 2022
    X DW ?
    Y DW ?
    Z DW ? 
DATA ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
START:
    MOV AX,DATA  
    MOV DS,AX  
    ;此处输入代码段代码
    MOV DX,0H  ;DX=0H
    MOV AX,YEAR  ;AX=2008
    
    ;/400
    MOV CX,190H  ;CX=0190H(400),16位
    DIV CX  ;AX=AX/CX
    ;DIV指令:
    ;如果除数为8位,被除数则为16位,默认在AX中存放
    ;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位
    ;如果除数为8位,AL存储商,AH存储余数
    ;如果除数为16位,AX存储商,DX存储余数
    MOV X,DX  ;X=0008,为2008/400的余数
    
    MOV DX,0H
    MOV AX,YEAR
    
    ;/100
    MOV BL,64H  ;BL=64H(100),8位
    DIV BL  ;AL=AX/BL
    MOV BYTE PTR Y , AH  ;Y为2008/100的余数,Y=08H
    ;BYTE PTR 指明要访问的内存单元为字节单元
    
    MOV DX,0H
    MOV AX,YEAR
    
    ;/4
    MOV BX,BYTE PTR 4H  ;BX=0004H
    DIV BX
    MOV Z,DX ;Z=0000,为2008/4的余数
    
    ;判断400整除
    OR X,0H  ;X=0008
    MOV AX,X  ;AX=0008
    JZ PrintY
    ;跳转条件ZF=1
    ;如果运算结果为0,ZF=1,否则ZF=0
    
    ;判断不被100整除,被4整除
    OR Y,0H  ;Y为2008/100的余数,Y=08H
    MOV AX,Y  ;AX=08H
    JZ PrintN
    OR Z,0H  ;Z=0000,为2008/4的余数
    MOV AX,Z  ;AX=0000
    JZ PrintY
    
    PrintN:
    	MOV AH,02H
    	MOV DL,'N'
    	INT 21H
    	JMP LEND
    
    PrintY:
    	MOV AH,02H
    	MOV DL,'Y'
    	INT 21H
    	
    LEND:
    	MOV AH,4CH
    	INT 21H
    
CODE ENDS
    END START