START: MOV AX,DATA
MOV DS,AX
把 data (数据) 转到 DS 数据段寄存器,让数据段指向正确的位置。
DATA 不是指令,而是伪指令,实际上是一个动态的内存地址,要想运行,必须先放入到 DS 中,但
是内存数不能放入段地址。MOV AX,DATA 起到过渡作用
LEA DX,INFON LEA 为有效地址送寄存器指令 (DX)<-INFON
MOV AH,9
INT 21H 两步显示字符串
LEA DX,BUF
MOV AH,10 输入字符串年份到缓冲区,直到 enter 为止
INT 21H
MOV CL, [BUF+1] BUF+1 位置数字送移位计数器 CX 的低位 CL
LEA DI,BUF+2 BUF+2 送到存储器指针
CALL DATACATE调用 DATACATE:用于把年份存入 W
逻辑:从最低位开始,ADD 进去,乘 10,再 ADD 下一位,直到所有位数都存进去
CALL IFYEARS 调用 IFYEARS,判断是否为闰年
JC A1 CF=1 则跳转,是闰年语句
LEA DX,N 否则,不是闰年的语句送入 DX
MOV AH,9
INT 21H 输出字符串
JMP EXIT
A1: LEA DX,Y 用于输出是闰年的语句
MOV AH,9
INT 21H
EXIT: MOV AH,4CH
INT 21H
DATACATE PROC NEAR
proc 是定义子程序的伪指令,位置在子程序的开始处,它和 endp 分别表示子程序定
义的开始和结束两者必须成对出现。NEAR 属性(段内近调用): 调用程序和子程序在同一代
码段中,只能被相同代码段的其他程序调用
LEA SI,BUF+2 SI 存储器指针,传操作中的源指针
MOV BX,0 BX 存储器指针
X3:
MOV AL ,[SI]
SUB AL ,30H 将 BUF+2 里存的字符串(年份)变为数字 年份的每
一个数字
MOV AH,0 把 AX 填满
XCHG AX,BX 交换 AX,BX
MOV DX,10D 十进制数 10 存入 DX
MUL DX 把 AX*DX 存入(DX,AX)
XCHG AX,BX 交换 AX,BX
ADD BX,AXAX+BX->BX
INC SI 往后读一个数
LOOP X3 每循环一次 CX-1,直到 CX 置 0 为止
MOV W,BX 将年份存入 W 中
RET
DATACATE ENDP
proc 是定义子程序的伪指令,位置在子程序的开始处,它和 endp 分别表示子程序定
义的开始和结束两者必须成对出现。
IFYEARS PROC NEAR
PUSH BX BX 入栈