DATAS SEGMENT
suggestion db 'please input a year:$'
leap db 'This is a leap year$'
noleap db 'This is not a leap year$'
sum dw ?
buf db 8
db ?
db 100 dup(?)
DATAS ENDS
STACKS SEGMENT
db 100 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,suggestion
MOV AH,09H
INT 21H
LEA DX,buf
MOV AH,0AH
INT 21H
MOV CL,[BUF+1]
CALL datacata
CALL ifyear
JC A1
LEA DX,noleap
MOV AX,9
INT 21H
JMP EXIT
A1: LEA DX,leap
MOV AX,9
INT 21H
EXIT: MOV AH,4CH
INT 21H
datacata proc near
PUSH CX
DEC CX
MOV BL,10
LEA SI,BUF+2
FF: INC SI
LOOP FF
POP CX
MOV DL,30H
MOV AX,1
FF1: PUSH AX
SUB BYTE PTR [SI],DL
MUL BYTE PTR [SI]
ADD sum,AX
POP AX
MUL BL
DEC SI
LOOP FF1
RET
datacata ENDP
ifyear proc near
PUSH DX
PUSH BX
PUSH CX
MOV AX,sum
MOV CX,AX
MOV DX,00H
MOV BX,100
DIV BX
CMP DX,0
JNZ L1
MOV AX,CX
MOV BX,400
DIV BX
CMP DX,0
JZ L2
JMP L3
L1: MOV AX,CX
MOV BX,4
DIV BX
CMP DX,0
JZ L2
JMP L3
L2: STC
JMP L4
L3: CLC
L4: POP AX
POP BX
POP CX
RET
ifyear endp
MOV AH,4CH
INT 21H
CODES ENDS
END START
这是一个闰年的程序, 编译无错误 执行的时候,变成这样
------解决方案--------------------------------------------------------
- Assembly code
; 主要问题就如下所示。另外最后的显示内容最好前导有回车换行以版面更清楚些。LEA DX,bufMOV AH,0AHINT 21Hmov ch, 0 ;*+ ch 不置 0 进 datacata 可能会出错MOV CL,[BUF+1]CALL datacataCALL ifyearJC A1LEA DX,noleapMOV AH,9 ;* AX -> AHINT 21HJMP EXITA1: LEA DX,leapMOV AH,9 ;* AX -> AHINT 21HEXIT: MOV AH,4CHINT 21Hdatacata proc nearPUSH CXDEC CX MOV BL,10LEA SI,BUF+2FF: INC SILOOP FFPOP CXMOV DL,30HMOV AX,1FF1: PUSH AX ; SUB BYTE PTR [SI],DL ;*- MUL byte ptr 是 AL *[SI]; MUL BYTE PTR [SI] ;*- 在有千位年时就会出错mov dl, byte ptr [si] ;*+ 因为 1000=03E8,有 03h 在sub dl, '0' ;*+ AH 中没有进行乘运算mov dh, 0 ;*+mul dx ;*+ADD sum,AXPOP AXMUL BLDEC SILOOP FF1RETdatacata ENDPifyear proc nearPUSH DXPUSH BXPUSH CXMOV AX,sumMOV CX,AXMOV DX,00HMOV BX,100DIV BXCMP DX,0JNZ L1MOV AX,CXMOV BX,400DIV BXCMP DX,0JZ L2JMP L3L1: MOV AX,CXmov dx, 0 ;*+ 由于上面的 DIV 100 会在 DX 留值,故须置0MOV BX,4