用汇编语言,编写一个判断闰年的程序。要求:有程序的分析(最好是每一条程序都有注释);只能输入数字

2025-05-23 21:00:11
推荐回答(5个)
回答(1):

data segment ;定义数据段
infon db 0dh,0ah,'Please input a year: $'
Y db 0dh,0ah,'This is a leap year! $'
N db 0dh,0ah,'This is not a leap year! $'
w dw 0
buf db 8
db ?
db 8 dup(?)
data ends

stack segment stack
db 200 dup(0)
stack ends

code segment
assume ds:data,ss:stack,cs:code
start:mov ax,data
mov ds,ax

lea dx,infon ;在屏幕上显示提示信息
mov ah,9
int 21h

lea dx,buf ;从键盘输入年份字符串
mov ah,10
int 21h

mov cl, [buf+1]
lea di,buf+2
call datacate
call ifyears
jc a1

lea dx,n
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;
push cx;
dec cx
lea si,buf+2
tt1: inc si
loop tt1
;lea si,cx[di]
pop cx

mov dh,30h
mov bl,10
mov ax,1
l1: push ax
sub byte ptr [si],dh
mul byte ptr [si]
add w,ax
pop ax
mul bl
dec si
loop l1
ret
datacate endp

ifyears proc near
push bx
push cx
push dx
mov ax,w
mov cx,ax
mov dx,0
mov bx,4
div bx
cmp dx,0
jnz lab1
mov ax,cx
mov bx,100
div bx
cmp dx,0
jnz lab2
mov ax,cx
mov bx,400
div bx
cmp dx,0
jz lab2
lab1: clc
jmp lab3
lab2: stc
lab3: pop dx
pop cx
pop bx
ret
ifyears endp
code ends
end start

回答(2):

TITLE 从键盘输入年份,输出其是否是闰年
;==============================================
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
_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:
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
DIV B
CMP DX, 0
JNZ L1
MOV AX, x
CWD
DIV G
CMP DX, 0
JZ L2
MOV AX, x
CWD
DIV F
CMP DX, 0
JNZ L2
L1:
MOV DX, OFFSET VAR2
JMP _O_STR
L2:
MOV DX, OFFSET VAR1
_O_STR:
MOV AH, 09H
INT 21H
;--------------------------------
EXIT:
MOV AH, 4CH
INT 21H
;--------------------------------
CODE ENDS
END START
;==============================================

回答(3):

自己定义的年份来判断
DATAS SEGMENT
A DW 4
B DW 400
D DW 100
E DW 2000
M1 DB 'this is a leap year',13,10,'$'
M2 DB 'this is not a leap year',13,10,'$'
DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,E
CWD
DIV A
CMP DX,0
JNZ L2
MOV AX,E
CWD
DIV B
CMP DX,0
JNZ L1
JMP L3
L1:MOV AX,E
CWD
DIV D
CMP DX,0
JNZ L1
JMP L3
L2: LEA DX,M2
JMP DISP
L3:LEA DX,M1
JMP DISP
DISP:MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START

回答(4):

我不会

回答(5):

其实 谭浩强C 语言设计就有详细的源程序
另外
在WIN-TC的帮助文件里也有相似的类题