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,buf MOV AH,0AH INT 21H mov ch, 0 ;*+ ch 不置 0 进 datacata 可能会出错 MOV CL,[BUF+1] CALL datacata CALL ifyear JC A1 LEA DX,noleap MOV AH,9 ;* AX -> AH INT 21H JMP EXIT A1: LEA DX,leap MOV AH,9 ;* AX -> AH 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 是 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,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 dx, 0 ;*+ 由于上面的 DIV 100 会在 DX 留值,故须置0 MOV BX,4