xiaosawanjava 发表于 2014-6-10 16:12:49

【汇编例题】判断某一年是否为润年


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        ;存放非ascii码数据的 闰年
    buf db 8    ;存放输入的闰年数据是ascii码
      
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

          ;功能09H
          ;功能描述:输出一个字符串到标准输出设备上。如果输出操作被重定向,那么,
          ;将无法判断磁盘已满
          ;入口参数:AH=09H
          ;DS:DX=待输出字符的地址
          ;说明:待显示的字符串以’$’作为其结束标志
          ;出口参数:无
          lea dx,infon;取infon的偏移地址
          mov ah,9
          int 21h


          ;功能10
          ;功能描述:从标准输入设备上读入一个字节字符串,遇到“回车键”结束输入
          ;(输入的字符在标准的输出设备上有回显)。如果该输入操作被重定向,那么,
          ;将无法判断文件是否已到文件尾
          ;入口参数:AH=0AH
          ;DS:DX=存放输入字符的起始地址
          ;接受输入字符串缓冲区的定义说明:
          ;1、第一个字节为缓冲区的最大容量,可认为是入口参数;
          ;2、第二个字节为实际输入的字符数(不包括回车键),可看作出口参数;
          ;3、从第三个字节开始存放实际输入的字符串;
          ;4、字符串以回车键结束,回车符是接受的最后一个字符;
          ;5、若输入的字符数超过缓冲区的最大容量,则多出的部分被丢弃,系统并
          ;发出响铃,直到输入“回车”键才结束输入。
          lea dx,buf    ;从键盘输入年份字符串
          mov ah,10
          int 21h
         
          mov cl, ;字符的个数
          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
          pop cx
   
      
          mov dh,30h
          mov bl,10
          mov ax,1
      l1: push ax
          subbyte ptr,dh
          mulbyte ptr
          add w,ax
          pop ax
          mul bl
          dec si
          loop l1
          ret
datacate endp

   ;能被4整除且又能不能被100整除 是闰年 能直接被400整除也是闰年
   ifyears proc near
         pushbx
         pushcx
         pushdx
         mov ax,w
         mov   cx,ax
         movdx,0
         movbx,4
         divbx
         cmpdx,0
         jnzlab1
         mov   ax,cx
         movbx,100
         divbx
         cmp dx,0
         jnzlab2
         movax,cx
         mov bx,400
         divbx
         cmpdx,0
         jzlab2
   lab1: clc
         jmp lab3
   lab2: stc
   lab3: popdx
         popcx
         popbx
         ret
   ifyears endp
code ends
   end start
      


页: [1]
查看完整版本: 【汇编例题】判断某一年是否为润年