汇编语言 王爽 课程设计二

1.课设要求

2程序源代码

assume cs:code
code segment
start:		
;-----------------------------------------------------将程序写入软盘
	;把安装程序写入到软盘0面0道1扇区
	mov ax,install
	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 do4_press	;按键输入处理

do4m_ret:
	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
;---------------------------------------显示提示信息

;---------------------------------------检测案件的按下请款
do4_press:
	push ax
	push bx
	push si
	push di
	push ds

	mov di,0
	
d04_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,0eh	;退格键按下后
	je do4_pdel


	call do4_chin	;输入字符处理

	call do4_shin

	jmp d04_pm

do4_pent:		;按下enter键后的处理
	call do4_ent
	jmp do4_pret
do4_pdel:		;按下退格键后的处理
	call do4_del
	call cls
	call do4_shin
	jmp d04_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 ds
	;将字符写入数据段中
	mov ax,do4data
	mov ds,ax
	mov ds:[di],bl
	inc di

	pop ds
	pop ax
	ret

;---------------------------------------按下字符键后处理
;---------------------------------------显示输入字符串
do4_shin:
	push ax
	push dx
	push si
	push ds

	call cls
	call do4_ts	;显示提示信息

	mov dh,3
	mov dl,1
	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
	dbt db '00/00/00 00:00:00',0	
	dbd db 9,8,7,4,2,0
	

ts:	mov si,0
	mov di,0
	mov cx,6

t:	push cx	
	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 dbt[di],ah
	inc di
	and al,00001111b
	add al,30h
	mov byte ptr dbt[di],al
	add di,2
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 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 bx,0b800h
	mov es,bx
	mov bx,1
	mov cx,2000

	sub2s:
		mov byte ptr es:[bx],al
		add bx,2
	loop sub2s
	
	pop es
	pop cx
	pop bx
	pop ax
	ret
;-------------------改变颜色-----------------------

;----------------------------------
;显示一个字符串
;参数:
;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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值