彙編語言 課程設計2 之時間設置改進篇

1.在之前的時間設置上改進了時間設置的處理.

assume cs:code
code segment
start:		
;-----------------------------------------------------將程序寫入軟盤
	;把安裝程序寫入到軟盤0面0道1扇區
	mov ax,install
	;call mfs

	mov es,ax
	mov bx,0	;es:bx 指向讀寫內存
	 
	mov al,1	;寫入扇區數
	mov ch,0	;磁道號
	mov cl,1	;扇區號
	mov dl,0	;驅動器號  0爲軟盤A
	mov dh,0	;磁面號
	
	mov ah,3	;調用int 13h寫功能
	int 13h



	;把執行程序寫入到軟盤0面0道2扇區至16扇區
	mov ax,mainseg
	mov es,ax
	mov bx,0

	mov al,14	;寫入扇區數
	mov ch,0	;磁道號
	mov cl,2	;扇區號
	mov dl,0	;驅動器號  0爲軟盤A
	mov dh,0	;磁面號
	
	mov ah,3	;調用int 13h寫功能
	int 13h

	mov ax,4c00h
	int 21h

;-----------------------------------------------------將程序寫入軟盤

;-----------------------------------------安裝執行主程序
install segment
assume cs:install
installm:
	mov ax,2000h  ;軟盤數據讀取到2000:0
	mov es,ax
	mov bx,0
	 
	mov al,14  ;讀取的扇區數
	mov ch,0  ;0磁道
	mov cl,2  ;2扇區
	mov dl,0  ;0號驅動器
	mov dh,0  ;0面
	 
	mov ah,2	;調用int 13h從磁盤讀取數據至  es:bx
	int 13h
;以下功能是將cs:ip指向 2000:0處執行
	mov ax,2000h	
	push ax
	mov ax,0
	push ax
	retf

install ends 

;-----------------------------------------安裝執行主程序

;-------------------------------------------------------------------------主程序
mainseg segment
assume cs:mainseg

mfs:	

	call show_menu	;顯示目錄
	call doit	;調用按鍵選擇功能
	jmp mfs

;------------------------------選項操作----------------------------------
;輸入選項進行操作
;按下鍵 1,重新啓動計算機
;按下鍵 2,引導現有操作系統
;按下鍵 3,顯示動態時間  格式: 年/月/日/ 時:分:秒
;按下鍵 4,修改時間
doit:	
	push ax
	
	jmp doitm
	doa: db 'press ESC return menu!',0
	dob: db 'press F1 change color!',0
	doc: db 'reset pc,y or n?',0
	dod: db 'start system,y or n?',0
	doe: db 'press ESC to shutdown!',0
	dof: db 'Please input time like "yy/mm/dd hh:mm:ss"',0
	dog: db  'Set clock successful! Press any key return...',0
	doh: db 'Set clock error! press any key return menu!',0
	
doitm:
	mov ah,0
	int 16h
	call cls
	cmp al,'1'
	je do1f
	cmp al,'2'
	je do2f
	cmp al,'3'
	je do3f
	cmp al,'4'
	je do4f
	jmp short doitmret

do1f:	call do1
	jmp doitmret
do2f:	call do2
	jmp doitmret
do3f:	call do3
	jmp doitmret
do4f:	call do4
	jmp doitmret
doitmret:
	pop ax
	ret
;------------------------------選項1---------------------
do1:	
	push ax
	push dx
	push si
	push ds

d01m:
	call cls
	mov ax,cs
	mov ds,ax
	mov dl,1
	mov dh,1
	mov ah,0
	mov si,offset doc
	call show_str
	mov ah,0
	int 16h
	cmp al,'y'
	je do1d
	cmp al,'n'
	je do1ret
	jmp short d01m

	
	
do1ret:
	call cls
	pop ds
	pop si
	pop dx
	pop ax
	ret
	;重新啓動計算機
do1d:
	mov ax,0ffffh
	push ax
	mov ax,0
	push ax
	retf
	
;------------------------------選項1---------------------
;------------------------------選項2---------------------
do2:	
	push ax
	push dx
	push si
	push ds

do2m:
	call cls
	mov ax,cs
	mov ds,ax
	mov dl,1
	mov dh,1
	mov ah,0
	mov si,offset dod
	call show_str
	mov ah,0
	int 16h
	cmp al,'y'
	je do2s
	cmp al,'n'
	je do2ret
	jmp short do2m

	
do2ret:
	call cls
	pop ds
	pop si
	pop dx
	pop ax
	ret
	;啓動計算機原操作系統
do2s:

	call cls
	 
	mov ax,0h  ;硬盤數據讀取到0:7c00
	mov es,ax
	mov bx,7c00h
	 
	mov al,1  ;讀取的扇區數
	mov ch,0  ;0磁道
	mov cl,1  ;1扇區
	mov dl,80h  ;c盤
	mov dh,0  ;0面
	 
	mov ah,2
	int 13h
	
	mov ax,0h
	push ax
	mov ax,7c00h
	push ax
	retf

;------------------------------選項2---------------------
;------------------------------選項3---------------------
do3:	
	push ax
	push dx
	push si
	push ds
	
	
	mov dh,1
	mov dl,1
	mov ax,cs
	mov ds,ax
	mov si,offset doa
	call show_str
	inc dh
	mov si,offset dob
	call show_str
	mov al,1
	push ax
	;顯示時間
do3m:	call delay	;延時
	call show_time	;時間讀取顯示模塊
	in al,60h	;按鍵檢測
	mov bl,al
	cmp bl,3bh
	jne do3j
	pop ax
	call color_ch	;改變字體顏色
	add al,1
	push ax
	jmp short do3m
do3j:	cmp bl,1
	je do3ret
	jmp short do3m

do3ret:	
	pop ax
	pop ds
	pop si
	pop dx
	pop ax
	ret
;------------------------------選項3---------------------
;------------------------------選項4---------------------
do4:	
	jmp do4m
	do4data segment
		db 32 dup(0)
	do4data ends

do4m:	
	call cls	
	call do4_ts	;顯示提示信息
	call show_time
	call copy
	mov dl,19
	call setI
	call do4_press	;按鍵輸入處理

do4m_ret:
	ret
;------------------------------------------複製
copy:	push ax
	push cx
	push si
	push ds
	push es

	mov ax,do4data
	mov ds,ax
	mov si,0
	mov ax,cs
	mov es,ax
	mov di,offset dbt
copys:
	mov cl,es:[di]  ;------------------
	jcxz cret
	mov ds:[si],cl
	inc si
	inc di
	loop copys
cret:	pop es
	pop ds
	pop si
	pop cx
	pop ax
	ret
;------------------------------------------複製
;---------------------------------------顯示提示信息
do4_ts:
	push ax
	push dx
	push si
	push ds
	
	call cls

	mov dl,1
	mov dh,1
	mov ax,cs
	mov ds,ax
	mov si,offset dof	
	call show_str
	inc dh
	mov si,offset doa
	call show_str
	
	pop ds
	pop si
	pop dx
	pop ax
	ret
;---------------------------------------顯示提示信息

;---------------------------------------檢測案件的按下請款
;dl  爲光標位置
do4_press:
	push ax
	push bx
	push si
	push di
	push ds

	mov di,0
	
do4_pm:
	mov ah,0
	int 16h
	mov bl,al
	mov bh,ah
	cmp bh,1	;Esc鍵按下後返回目錄
	je do4_pret

	cmp bh,1ch	;enter鍵按下後設置時間
	je do4_pent	;檢測輸入格式是否正確
	
	cmp bh,4dh	;右鍵按下後
	je do4_pr

	cmp bh,4bh	;左鍵按下後
	je do4_pl

;	cmp bh,0eh	;退格鍵按下後
;	je do4_pdel

	cmp bh,0bh	;按下0-9處理
	ja do4_pm
	jmp do4_pchin

;do4_pnext:

;	cmp bh,0ch
;	jb do4_pchin
;	jmp do4_pm

	;call do4_chin	;輸入字符處理

;	call do4_shin

;	jmp do4_pm

do4_pchin:		;按下0-9處理
	call do4_chin	;輸入字符處理
	call do4_shin
	call setI
	jmp do4_pm

do4_pent:		;按下enter鍵後的處理
	call do4_ent
	jmp do4_pret
;do4_pdel:		;按下退格鍵後的處理
;	call do4_del
;	call cls
;	call do4_shin
;	jmp do4_pm
do4_pr:			;右鍵按下後
	cmp dl,35
	je do4_pm
	inc dl
	call setI
	jmp do4_pm
do4_pl:			;左鍵按下後
	cmp dl,19
	je do4_pm
	dec dl
	call SetI
	jmp do4_pm
do4_pret:
	mov ax,do4data
	mov ds,ax
	mov si,0
	mov cx,32
	cmpes:		;返回時清空數據段內容
		mov byte ptr ds:[si],0
		inc si
	loop cmpes
	call cls
	pop ds
	pop di
	pop si
	pop bx
	pop ax	
	ret

;---------------------------------------檢測案件的按下請款
;---------------------------------------按下enter鍵後處理
do4_ent:
	push ax
	push cx
	push dx
	push di
	push si
	push ds

	mov ax,cs
	mov ds,ax
	call cls
	mov dh,1
	mov dl,1

	call do4_cmp	;檢測字符合格性
	cmp ch,1	;ch=1表示格式正確
	jne do4_eerro	
	
;===============設置時間
do4_eset:
	mov ax,do4data
	mov es,ax
	mov si,0	;set date
	mov di,9
	mov cx,3

do4_edin:	;設置日期
	push cx
	mov ah,es:[si][0]
	mov al,es:[si][1]
	sub ah,30h
	sub al,30h
	mov cl,4
	shl ah,cl
	or al,ah
	mov cl,al
	mov ax,di ;8,7
	out 70h,al
	mov al,cl
	out 71h,al
	dec di
	add si,3
	pop cx
	loop do4_edin

	mov si,9
	mov cx,3
	mov di,4
do4_etin:	;設置時間
	push cx
	mov ah,es:[si][0]
	mov al,es:[si][1]
	sub ah,30h
	sub al,30h
	mov cl,4
	shl ah,cl
	or al,ah
	mov cl,al
	mov ax,di ;2,0
	out 70h,al
	mov al,cl
	out 71h,al
	sub di,2
	add si,3
	pop cx
	loop do4_etin


	mov si,offset dog
	call show_str
	mov ah,0
	int 16h
	jmp do4_eret

do4_eerro:	;格式錯誤的處理
	mov si,offset doh
	call show_str
	mov ah,0
	int 16h
	jmp do4_eret

do4_eret:	;返回
	pop ds
	pop si
	pop di
	pop dx
	pop cx
	pop ax
	ret

;---------------------------------------按下enter鍵後處理

;---------------------------------------按下字符鍵後處理
;bl爲輸入字符
;di爲文字所在位置
do4_chin:
	push ax
	push dx
	push ds
	;將字符寫入數據段中
	mov dh,0
	sub dx,19
	mov di,dx
	mov ax,do4data
	mov ds,ax
	mov ds:[di],bl
	;inc di

	pop ds
	pop dx
	pop ax
	ret

;---------------------------------------按下字符鍵後處理
;---------------------------------------顯示輸入字符串
do4_shin:
	push ax
	push dx
	push si
	push ds

	call cls
	call do4_ts	;顯示提示信息

	mov dh,10
	mov dl,20
	mov ax,do4data
	mov ds,ax
	mov si,0	
	call show_str
	
	pop ds
	pop si
	pop dx
	pop ax
	ret
;---------------------------------------顯示輸入字符串

;---------------------------------------按下backspace鍵後處理
;di傳遞位置
;do4_del:
;	push ax
;	push ds

;	mov ax,do4data
;	mov ds,ax
	
;	cmp di,0
;	je do4_dret

;	mov byte ptr ds:[di-1],0
;	dec di
;do4_dret:
;	pop ds
;	pop ax
;	ret
;---------------------------------------按下backspace鍵後處理

;---------------------------------------檢測字符合格性
;返回值ch 0 爲不合格 1 爲合格
do4_cmp:
	push ax
	push ds

	mov ch,0
	mov ax,do4data
	mov ds,ax
	mov cl,ds:[5]
	cmp cl,'/'
	jne do4_cret
	cmp ds:[2],cl
	jne do4_cret
	mov cl,ds:[11]
	cmp cl,':'
	jne do4_cret
	cmp ds:[14],cl
	jne do4_cret
	mov ch,1

do4_cret:
	pop ds
	pop ax
	ret

;---------------------------------------檢測字符合格性
;------------------------------選項4---------------------
;------------------------------選項操作----------------------------------

;-----------------顯示目錄---------------------
;顯示字符串
;dh=行號
;dl=列號
show_menu:
	
	jmp short show_menu_s
	table dw a,b,c,d,e

	a db '1)reset pc',0
	b db '2)start system',0
	c db '3)clock',0
	d db '4)set clock',0
	e db 'by PrinceKinXuan@2014/03/31',0

show_menu_s:
	push ax
	push bx
	push cx
	push dx
	push si
	push ds

	mov ax,cs
	mov ds,ax
	mov di,0

	mov dh,2	;----------------------------------選項顯示位置  行
	mov dl,2	;----------------------------------選項顯示位置  列
	mov cx,5
	ms:
		mov si,table[di]
		call show_str
		inc dh
		add di,2
	loop ms

	inc dh
	mov ah,2
	mov bh,0
	int 10h

	pop ds
	pop si
	pop dx
	pop cx
	pop bx
	pop ax
	ret
;-----------------顯示目錄---------------------
;-----------------顯示時間---------------------1
show_time:
	push ax
	push bx
	push cx
	push dx
	push di
	push si
	push ds
	push es

	jmp short ts
	;dataw dw offset dbt,offset
	dbt db '00/00/00 00:00:00',0
	dbd db 9,8,7,4,2,0
	

ts:	;mov ax,offset dbd
	;mov es,ax
	mov si,0

	;mov bx,offset dbt
	;mov ds,bx
	mov di,0

	mov cx,6

t:	push cx
	;mov al,es:[si]
	mov al,dbd[si]
	out 70h,al
	in al,71h
	mov ah,al
	mov cl,4
	shr ah,cl
	add ah,30h
	;mov byte ptr ds:[di],ah
	mov byte ptr dbt[di],ah
	;add di,2
	inc di
	and al,00001111b
	add al,30h
	mov byte ptr dbt[di],al
	;add di,2
	add di,2
	;cmp si,2
	;jb td	;日期隔開符
	;je tb	;中間空格
	;ja tt	;時間隔開符
tj:	inc si
	pop cx
	loop t
	
	mov ax,cs
	mov ds,ax
	mov si,offset dbt
	mov dl,20
	mov dh,10
	call show_str
	pop es
	pop ds
	pop si
	pop di
	pop dx
	pop cx
	pop bx
	pop ax
	ret

;-----------------顯示時間---------------------1

;-----------------顯示時間gai---------------------co
;al,color
color_ch:
	;push ax
	push bx
	push cx
	push di
	push es

	mov bx,0b800h
	mov es,bx
	mov di,1
	mov cx,2000
	and al,00000111b

	color_ch_s:
		mov byte ptr es:[di],al
		add di,2
	loop color_ch_s
	
	pop es
	pop di
	pop cx
	pop bx
	ret
		
;-----------------顯示時間---------------------co

;-------------------延時-----------------------
delay:	
	push bx
	push dx
	mov dx,0ffffh	;---------------------------時間長度調整
	mov bx,01h
	
	delays:
		sub dx,1
		cmp dx,0
	jne delays
	sub bx,1
	cmp bx,0
	mov dx,0ffffh
	jne delays

	pop dx
	pop bx
	ret
;-------------------延時-----------------------
;-------------------清屏-----------------------
cls:	
	push ax
	push cx
	push si
	push es

	mov si,0
	mov ax,0b800h
	mov es,ax

	mov cx,2000
clss:	mov byte ptr es:[si],' '
	add si,2
	loop clss
	
	pop es
	pop si
	pop cx
	pop ax
	ret
;-------------------清屏-----------------------
;-------------------改變顏色-----------------------
;子程序2 設置前景色
;al爲顏色
ch_color:
	push ax
	push bx
	push cx
	push es
	;mov dx,ax

	mov bx,0b800h
	mov es,bx
	mov bx,1
	mov cx,2000

	sub2s:
		;and byte ptr es:[bx],11111000b
		;or byte ptr es:[bx],al
		mov byte ptr es:[bx],al
		add bx,2
	loop sub2s
	
	pop es
	pop cx
	pop bx
	pop ax
	ret
;-------------------改變顏色-----------------------
;--------------------------setI
;dl  爲列數
setI:	
	push ax
	push bx
	push dx
	mov ah,2
	mov bh,0
	mov dh,10
	int 10h
	pop dx
	pop bx
	pop ax
	ret
;--------------------------setI
;----------------------------------
;顯示一個字符串
;參數:
;dh--行   dl--列  ds:si  字符串位置
show_str:
	push ax
	push bx
	push cx
	push dx
	push es
	push si

	mov al,0ah	;指定行
	mul dh
	add ax,0b800h
	mov es,ax
	
	mov bl,dl	;指定列
	mov bh,0
	dec bx
	add bx,bx
	
	mov al,cl

show_str_s:	
	mov cl,ds:[si]	;將字符顯示到指定的位置
	mov ch,0
	jcxz show_str_ret
	mov ch,al
	mov es:[bx],cl
	inc si
	add bx,2
	jmp short show_str_s
show_str_ret:
	pop si
	pop es
	pop dx
	pop cx
	pop bx
	pop ax
	ret
;------------------------------------------------------
mainseg ends
;--------------------------------------------------------主
code ends
end start


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章