?? dzz.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 ;在數(shù)據(jù)段開辟一時間顯示緩沖區(qū)
data ends
stack segment
db 100 dup(?)
stack ends
code segment
assume cs:code,ss:stack,ds:data
main:
call clear ;調(diào)用清屏子程序
display: ;----------------------------時間顯示部分--------------
mov ax,seg data
mov ds,ax
mov bx,offset t_buff ;送t_buff的偏移地址到BX
mov ah,2ch ;調(diào)用DOS時間調(diào)用功能,功能號:2cH,小時,分鐘,秒數(shù)分別保存在CH,CL,DH中
int 21h
mov al,ch ;小時數(shù)設定
mov ah,0
call bctd ;調(diào)用進制轉(zhuǎn)換子程序
push ax
and al,0f0h ;選取al高四位
mov cl,4 ;設置右循環(huán)的次數(shù)
rol al,cl ;右循環(huán)
or al,30h ;加30h得到ACSII碼
mov [bx],al ;將得到的結(jié)果送到t_buff緩沖區(qū)
inc bx ;BX自加1,指針指向下一個緩沖區(qū)的下一個地址
pop ax
and al,0fh ;選取低四位,道理同上
or al,30h
mov [bx],al ;將轉(zhuǎn)換后的低四位值送入緩沖區(qū)的第二個地址
inc bx
;----------------------------------------------------------
mov al,':' ;顯示分號
mov [bx],al
inc bx
;-------------------------------------------------------
mov ah,2ch
int 21h
mov al,cl ;分鐘數(shù)設定
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,'$' ;將字符串的結(jié)束位送至顯示緩沖區(qū)的最后一位
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,并調(diào)用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 ;按任意鍵結(jié)束,調(diào)用鍵盤I/O中斷功能號1,獲取鍵值到AL
int 16h
cmp al,1bh
jz quit ;是ESC鍵的話就跳轉(zhuǎn)
jmp display
quit:
mov ah,4ch
int 21h
ret
;-------------------------------
bctd proc near;二進制轉(zhuǎn)BCD碼子程序
;AX輸入?yún)?shù)
;AX輸出參數(shù),存放調(diào)整過的BCD碼
;
mov dx,ax
mov ax,0
mov cx,16 ;設循環(huán)次數(shù)
bctd1:
clc ;清進位標志C
rcl dx,1 ;通過進位的循環(huán)右移
adc al,al ;帶進位加法
daa ;加法的十進制調(diào)整
xchg al,ah ;交換高,低八位
adc al,al
daa
xchg al,ah
loop bctd1 ;循環(huán),次數(shù)保存在CX里
ret
bctd endp
;-------------------------------------------
clear proc near
push ax ;入棧保護現(xiàn)場
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 ;出?;謴同F(xiàn)場
pop cx
pop bx
pop ax
ret
clear endp
;-----------------------------------------
delay1 PROC ;精確延遲時間子程序
MOV DX,04ffh ;循環(huán)次數(shù)
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 + -