汇编语言,实现分段函数,求闰年

 

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]?cl=实际输入的字符数(不包括回车)

lea di,buf+2 ;将年份的地址传给寄存器

call datacate

call ifyears

jc a1 ;如果判断是闰年就显示Y,不是闰年就显示N

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 ;转换成ASCII码,需要减30h

mov bl,10 ;10进制

mov ax,1

l1: push ax

sub byte ptr [si],dh?把输入的年份字符减30H

mul byte ptr [si] ;

add w,ax ;程序把换算成的年份数放在W处

pop ax

mul bl ;ax进位

dec si

loop l1

ret

datacate endp

ifyears proc near ;判断W处的年分数是否为闰年

push bx

push cx

push dx

mov ax,w ;将年份弄到cx寄存器

mov cx,ax

mov dx,0

mov bx,4

div bx

cmp dx,0 ;DX中放余数

jnz lab1 ;不被4整除

mov ax,cx

mov bx,100

div bx

cmp dx,0

jnz lab2 ;被4整除但不被100整除

mov ax,cx

mov bx,400 ;被400整除

div bx

cmp dx,0

jz lab2

lab1: clc ;设置CF标志位为0

jmp lab3

lab2: stc ;设置CF标志位为1

lab3: pop dx

pop cx

pop bx

ret

ifyears endp

code ends

end start