⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dzz.asm

📁 电子表的课程设计
💻 ASM
字号:
;name: ELECTRONIC CLOCK
                         ;design by zengqingyu class1 and moxiaolei class3
data  segment

mess1   db  '                                   \\\|///                                              ',0ah,0dh
        db  '                                \\ .-.- //                                            ',0ah,0dh
        db  '                                 ( .@.@ )                                             ',0ah,0dh
        db  '                +-----------oOOo-----(_)-----oOOo-------------+                         ',0ah,0dh
        db  '                +               ASM   ASSIGNMENT              +                         ',0ah,0dh
        db  '                +               ELECTRONIC CLOCK              +                         ',0ah,0dh
        db  '                +             Design by Kevin & Ray           +                         ',0ah,0dh
        db  '                +                                 version:1.0 +                         ',0ah,0dh
        db  '                +                                             +                         ',0ah,0dh
        db  '                +                                             +                         ',0ah,0dh
        db  '                +                    Press ESC button to quit +                         ',0ah,0dh
        db  '                +-------------------------Oooo----------------+                         ','$'
mess2   db  'The time is now:',0ah,0dh,'$'
t_buff  db 20            ;在数据段开辟一时间显示缓冲区
data  ends

stack segment
      db 100 dup(?)
stack ends

code  segment
      assume cs:code,ss:stack,ds:data
main:
      call clear         ;调用清屏子程序

display: ;----------------------------时间显示部分--------------
      mov ax,seg data
      mov ds,ax
      mov bx,offset t_buff      ;送t_buff的偏移地址到BX
      mov ah,2ch                 ;调用DOS时间调用功能,功能号:2cH,小时,分钟,秒数分别保存在CH,CL,DH中
      int 21h
      mov al,ch                ;小时数设定
      mov ah,0
      call bctd                 ;调用进制转换子程序
      push ax
      and al,0f0h                ;选取al高四位
      mov cl,4                   ;设置右循环的次数
      rol al,cl                   ;右循环
      or al,30h                    ;加30h得到ACSII码
      mov [bx],al                 ;将得到的结果送到t_buff缓冲区
      inc bx                       ;BX自加1,指针指向下一个缓冲区的下一个地址
        
        
      pop ax
      and al,0fh                 ;选取低四位,道理同上
      or al,30h
      mov [bx],al                 ;将转换后的低四位值送入缓冲区的第二个地址
      inc bx
  ;----------------------------------------------------------
      mov al,':' ;显示分号
      mov [bx],al
      inc bx
   ;-------------------------------------------------------
      mov ah,2ch
      int 21h
        
      mov al,cl                ;分钟数设定
      mov ah,0
      call bctd
      push ax
      and al,0f0h
      mov cl,4
      rol al,cl
      or al,30h

      mov [bx],al
      inc bx
      pop ax
      and al,0fh
      or al,30h
      mov [bx],al
      inc bx
  ;-------------------------------------------------------------------------
      mov al,':'                    ;显示;号
      mov [bx],al
      inc bx
  ;-------------------------------------------------------------------------
        
      mov ah,2ch                    ;秒设定
      int 21h
      mov al,dh
      mov ah,0
      call bctd
      push ax
      and al,0f0h
      mov cl,4
      rol al,cl
      or al,30h

      mov [bx],al
      inc bx
      pop ax
      and al,0fh
      or al,30h
      mov [bx],al
      inc bx
  ;----------------------------------------------------------------------
      mov al,'$'      ;将字符串的结束位送至显示缓冲区的最后一位
      mov [bx],al
   ;------------------------------------------------------------------------
      push  bx      ;置光标位置 ,AH=2,BH=0,DH跟DL分别为行号与列号,并入栈保护BX
      mov ah,2
      mov bh,0
      mov dh,17
      mov dl,41
      int 10h
      pop bx
      lea dx,t_buff  ;送t_buff偏移地址到DX,并调用DOS显示功能,功能号为9
      mov ah,9
      int 21h

      push  bx      ;置光标位置
      mov ah,2
      mov bh,0
      mov dh,0
      mov dl,0
      int 10h
      pop bx
      lea dx,mess1
      mov ah,9
      int 21h
        
      push  bx      ;置光标位置
      mov ah,2
      mov bh,0
      mov dh,17
      mov dl,21
      int 10h
      pop bx

      lea dx,mess2
      mov ah,9
      int 21h
        
 ;-----------------------------
      call delay1
      mov ah,1              ;按任意键结束,调用键盘I/O中断功能号1,获取键值到AL
      int 16h
      cmp al,1bh
      jz   quit          ;是ESC键的话就跳转
      jmp   display
      
quit:
     mov ah,4ch
     int 21h
     ret
      

;-------------------------------
bctd proc near;二进制转BCD码子程序
;AX输入参数
;AX输出参数,存放调整过的BCD码
;
      mov   dx,ax
      mov   ax,0
      mov   cx,16        ;设循环次数
bctd1:
      clc               ;清进位标志C
      rcl   dx,1        ;通过进位的循环右移
      adc   al,al       ;带进位加法
      daa               ;加法的十进制调整
      xchg  al,ah       ;交换高,低八位
      adc   al,al
      daa
      xchg  al,ah
      loop  bctd1        ;循环,次数保存在CX里
      ret
bctd   endp
;-------------------------------------------
clear proc near
      push  ax     ;入栈保护现场
      push  bx
      push  cx
      push  dx
      mov ax,0600h;ah=06(滚动)al=00(全屏空白)
      mov bh,3fh  ;背景颜色(3),白色前景(f)
      sub cx,cx
      mov dx,5f5fh
      int 10h
      pop dx        ;出栈恢复现场
      pop cx
      pop bx
      pop ax
      ret
clear endp



;-----------------------------------------
delay1 PROC ;精确延迟时间子程序

	MOV DX,04ffh    ;循环次数
up:	XOR CX,CX
a:	NOP
	LOOP a
	DEC DX
	JNZ up
	RET
delay1 ENDP
;----------------------------
code  ends
      end main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -