王爽 <<汇编语言>> 课程设计2

这本书我看得有点慢,尤其是最后一个课程设计2,非常非常慢.

慢的原因各各种各样.上班事情比较多,到家比较累,有时候也会偷偷懒看看别的东西.

当然,也有自己智商平平,天赋有限的原因.等等等等

 

为了做这个课程设计2,参考了一些资料.

主要是关于如何将软盘其他扇区拷贝到机器上,并且让机器执行这方面的.

 

这个程序最大的困难,是程序在开机之前运行,没法Debug,纠错只能用肉眼调试.

 

比较大的缺陷有2个

1是第二次察看时间后,新的中断可能因为flag的原因,没有安装上

2是设置时间的界面是在不太友好 .

 

作这个题目之前总觉得做完这个课程设计2,会有许多总结想说.拖拖拉拉了这么长时间,

也懒得多说什么了.

直接上代码把!

 

代码很乱,没有什么参考价值,纯属作个纪念.

 

课程设计2做完了,终于可以向32位汇编进发了!继续努力!

 

assume cs:setupsg
;	setupsg 
;	copy launchsg to floppy's fan 1,others copy to fan 2
setupsg segment
start:
			;	write launchsg to floppy fan 1
			mov ax,launchsg
			mov es,ax
			mov bx,0
			
			mov al,1
			mov dl,0
			mov dh,0
			mov ch,0
			mov cl,1
			mov ah,3
			int 13H
			
			;	write funcssg to floppy after fan2
			mov ax,funcssg
			mov es,ax
			mov al,15
			mov cl,2
			mov ah,3
			int 13H
			
			mov ax,4c00H
			int 21H
			
setupsg ends

;	copy floppy fan 2 to 2000H:0,jmp 2000H:0
launchsg segment
assume cs:launchsg
			call loadsys
			;	jump to 2000H:0
			mov ax,2000H
			push ax
			mov ax,0
			push ax
			retf
			
			;	copy after fan 2 to 2000H:0
loadsys:	
			mov ax,2000H
			mov es,ax
			mov bx,0
			
			mov al,15
			mov dl,0
			mov dh,0
			mov ch,0
			mov cl,2
			mov ah,2
			int 13H
			ret

launchsg ends

funcssg segment
assume cs:funcssg			;	This sentence is very important for table

allsrc:	
			;	test ,for FLAG of INT 9
			mov cx,0
			
			jmp short sysbegin
			functab dw offset func1,offset func2,offset func3,offset func4
sysbegin:
			call show_mm
			
			mov ah,0		;	wait for user input
			int 16H	
			
			cmp al,49		;	compare with 1's ASCII
			jb sysbegin
			cmp al,52		;	compare with 4's ASCII
			ja sysbegin
			
			sub al,49		; jump to sub function
			mov bl,al
			mov bh,0
			add bx,bx
			call word ptr functab[bx]
			
			
			jmp short sysbegin			;	menu loop	it's very important
			
;--------------------------------------------			
;		show main menu
;--------------------------------------------
show_mm:	push ax
			push ds
			push si
			push bx
			
			jmp short smm_start
		mmstr1 db '1.reset pc',0
		mmstr2 db '2.start system',0
		mmstr3 db '3.clock',0
		mmstr4 db '4.set clock',0
		mmtab  dw mmstr1,mmstr2,mmstr3,mmstr4
smm_start:		
			mov ax,0b800H
			mov ds,ax
			mov si,0
			
			mov ah,0
strs:		cmp ah,4
			jnb mmend
			
			mov bl,ah
			mov bh,0
			add bx,bx
			mov bx,mmtab[bx]
			
			push si
item:		
			mov al,cs:[bx]
			cmp al,0
			je itemend
			mov ds:[si],al
			inc si
			mov byte ptr ds:[si],2
			inc si
			inc bx
			jmp item
itemend:	
			pop si
			add si,160
			inc ah
			jmp short strs
mmend:
			pop bx
			pop si
			pop ds
			pop ax
			ret

;--------------------------------------------			
;		clsscr, fill screen with ' '
;--------------------------------------------			
clsscr:		
			push ax
			push ds
			push si
			push cx
			
			mov ax,0b800H
			mov ds,ax
			mov si,0
			
			mov cx,160*25
			
cs_lp:		mov byte ptr ds:[si],' '
			inc si
			;mov byte ptr ds:[si],01100110B
			mov byte ptr ds:[si],2
			inc si
			loop cs_lp
			
			pop cx
			pop si
			pop ds
			pop ax
			ret
;--------------------------------------------			
;		func1,reset computer
;--------------------------------------------
func1:		
			;call clsscr		;	call clsscr is useless for restart pc
			mov ax,0ffffH
			push ax
			mov ax,0
			push ax
			retf

;--------------------------------------------			
;		func2,start system
;--------------------------------------------			
func2:		;	read disk C:\'s data to 0:7c00H
			mov ax,0
			mov es,ax
			mov bx,07c00H
			
			mov al,1
			mov ch,0
			mov cl,1
			mov dl,80H			;	disk C:
			mov dh,0
			mov ah,2
			int 13H
			
			;	jump to 0:7c00H
			mov ax,0
			push ax
			mov ax,07c00H
			push ax
			retf


			
;--------------------------------------------			
;		func3,show clock
;--------------------------------------------			
func3:	
		jmp short func3_start
		dis_time db '20??/??/?? ??:??:??',0			; year/month/day hour:minute:second
		time_num db 9,8,7,4,2,0
		
		ori9ip	dw 0
		ori9cs	dw 0								;	save original int 9's entry
		
func3_start:

				call clsscr
				cmp cx,0				; use flag
				jne time_lp
				mov cx,1
				call seti9
				
time_lp:		call showtime
				jmp short time_lp					;	loop for update time 
		
		;mov ax,4c00H				; cut!!
		;int 21H
		
seti9:			
				;-------------------------------------------
				;	over write a new int 9 prog
				;	写在这里,会不会导致第二次有问题?找不到 原INT9 入口?
				;-------------------------------------------	
				push ds
				push ax
				push es
				push si
				
				;	save original int 9's entry
				push cs
				pop ds
				mov ax,0
				mov es,ax
				push es:[9*4]
				mov si,offset ori9ip
				pop ds:[si]
				push es:[9*4+2]
				pop ds:[si+2]
				
				mov word ptr es:[9*4],offset int9
				mov es:[9*4+2],cs
				
				pop si
				pop es
				pop ax
				pop ds
				ret
		
int9:	
				;-------------------------------------------
				;	define new int 9
				;-------------------------------------------	
				push ax
				push ds
				push si
				push cx
				
int9te:			
				pushf						; call original int9
				mov si,offset ori9ip
				call dword ptr ds:[si]
				
				mov ax,0b800H
				mov ds,ax
				
				
				in al,60H
				cmp al,3bH					;	F1
				je changecl
				cmp al,1					;	ESC
				je gomm
				jmp short int9ret
				
changecl:		mov cx,19					; length of '20??/??/?? ??:??:??'==19
				mov si,160*10+1
i9lp:			inc byte ptr ds:[si]
				add si,2
				loop i9lp
				jmp short int9ret
				

gomm:			
				;------------------------
				;	restore original int 9
				;------------------------
				mov ax,0
				mov es,ax
				push cs
				pop ds
				mov si,offset ori9ip
				mov ax,ds:[si]					; cs 16 bit ,ip 16 bit
				mov es:[9*4],ax
				mov ax,ds:[si+2]
				mov es:[9*4+2],ax
				
				;call show_mm			;	back to main menu
				pop cx
				pop si
				pop ds
				pop ax
				mov cx,0				;	after restore int 9,set FLAG of int9 as FALSE (0),but useless.............
				jmp sysbegin				;	back to main menu
				
int9ret:		pop cx
				pop si
				pop ds
				pop ax
				iret
				
;--------------------------------------------			
;		middle helper
;--------------------------------------------			
jmphlp:		call clsscr
			jmp sysbegin						

		
showtime:	
			push ds
			push si
			push es
			push di
			push ax
			push cx
			
			;---------------------------------
			;	save time to time area
			;---------------------------------
			mov ax,cs
			mov ds,ax
			mov si,offset dis_time
			mov di,offset time_num
			
			push si
			add si,2
			
			mov cx,6
bcdlp:		

			mov al,ds:[di]				; get data from CMOS RAM
			out 70H,al
			in al,71H
			
			push cx
			mov ah,al
			mov cl,4
			shr ah,cl
			and al,00001111B
			add ah,30H
			add al,30H
			
			mov ds:[si],ah
			mov ds:[si+1],al
			add si,3
			inc di
			pop cx
			loop bcdlp
			
			pop si
			
			;---------------------------------
			;	display time area
			;---------------------------------
			
			mov ax,0b800H
			mov es,ax
			mov di,160*10
			
st_lp:		mov al,ds:[si]
			cmp al,0
			je st_ok
			mov es:[di],al
			inc di
			inc di
			inc si
			jmp short st_lp
		
st_ok:		
			
			pop cx
			pop ax
			pop di
			pop es
			pop si
			pop ds
			
			ret
			nop
			
;--------------------------------------------			
;		func4,set clock
;--------------------------------------------			
func4:		
			call clsscr
			call dissettime				;	test display set time....
			
			;	for test
			;call mod_time				;	mod time correct!
			;jmp sysbegin
			
			mov bx,0					;	inpos[down_flag]'s down_flag
			
func4_start:		
				cmp bx,12				;	 length of inpos[]
				jnb func4_fix
				
				call time_input
				inc bx
				jmp short func4_start
				
				
			;	position of time
			;	This area only to save data!!!
			timetip db '2000/01/01 00:00:00',0				;	default time
			inpos	db 4,6,10,12,16,18,22,24,28,30,34,36	;	length is 12
			mt_pos  db 2,3,5,6,8,9,11,12,14,15,17,18			;	yy/mm/dd hh:mm:ss
func4_fix:
				dec bx
				jmp short func4_start

;------------------------------------------				
;			jmphlp helper
;------------------------------------------
jmphlphlp:
			jmp jmphlp
;------------------------------------------
;	after modify time,go here
;------------------------------------------
aft_mt:	
			call mod_time
			jmp sysbegin
;------------------------------
;		solve input
; 				params:		bx--- inpos[]'s down_flag
;------------------------------			
time_input:
					push ax
					push bx
					push ds
					push si
					push di
					
					mov ax,0b800H				;	ds:[si]	WHERE SHOW INPUT TIME
					mov ds,ax
					mov si,0
					
					mov di,bx
					mov bl,inpos[bx]
					;add bl,bl
				
ti_st:				mov ah,0
					int 16H
												;	ESC ascii:1BH	ENTER ascii:0D
					cmp al,1bH					;	ESC
					je jmphlphlp
					cmp al,0dH					;	enter
					je aft_mt
					cmp al,30H					;	not number
					jb ti_st
					cmp al,39H
					ja ti_st
				
					mov ds:[si+bx],al			;	ASCII to display
					mov bl,mt_pos[di]			;	ASCII to modify time_tip
					mov bh,0
					mov timetip[bx],al
					
					pop di
					pop si
					pop ds
					pop bx
					pop ax
					ret
;------------------------------
;				display set time
;------------------------------
dissettime:	
				push ds
				push bx
				push si
				push ax
				push es
				push di
				
				push cs
				pop ds
				mov bx,offset timetip
				mov si,0
				
				mov ax,0b800H
				mov es,ax
				mov di,0
				
				mov ah,0
dstlp:			mov al,ds:[bx+si]
				cmp ax,0
				je dstend
				mov es:[di],al
				inc si
				add di,2
				jmp short dstlp
				
dstend:
				pop di
				pop es
				pop ax
				pop si
				pop bx
				pop ds
				ret
				
;------------------------------
;			set time by input area
;------------------------------
			;time_num db 9,8,7,4,2,0		
			;timetip db '2000/01/01 00:00:00',0				;	default time
			;inpos	db 4,6,10,12,16,18,22,24,28,30,34,36	;	length is 12
mod_time:
			jmp mt_start
			;mt_pos db 2,3,5,6,8,9,11,12,14,15,17,18			;	yy/mm/dd hh:mm:ss
mt_start:
			push di
			push ax
			push ds
			push si
			push bx
			push cx
			
			mov di,0
			push cs
			pop ds
			mov bx,offset timetip
			mov si,0
			
mt_lp:		
			cmp di,5
			ja mt_ret
			
			mov bl,mt_pos[si]
			mov bh,0
			
			mov al,time_num[di]
			out 70H,al
			
			mov cl,4						
			mov al,timetip[bx]
			sub al,30H
			shl al,cl
			
			inc si
			mov bl,mt_pos[si]
			mov bh,0
			
			mov bl,timetip[bx]
			sub bl,30H
			or al,bl
			inc si
			
			; mov al,24
			out 71H,al
			
			inc di
			jmp short mt_lp
			
mt_ret:		pop cx
			pop bx
			pop si
			pop ds
			pop ax
			pop di
			
			ret
			
funcssg ends

end start


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阅读下面的材料 : 开机后, CPU 自动进入到 FFF0:0 单元处执行,此处有一条跳转指令。 CPU 执行该指令后,转去执行 BIOS 中的硬件系统检测和初始化程序。 初始化程序将建立 BIOS 所支持的中断向量,即将 BIOS 提供的中断历程的入口地址登记在中断向量表中。 硬件系统检测和初始化完成后,调用 INT 19H 进行操作系统的引导。 如果设为从软盘启动操作系统,则 INT 19H 将主要完成一下工作: ( 1 )控制 0 号软驱,读取软盘 0 道 0 面 1 扇区的内容到 0 : 7C 00 。 ( 2 )将 CS:IP 指向 0 : 7C 00 。 软盘的 0 道 0 面 1 扇区中装有操作系统引导程序。 INT 19H 将其装到 0 : 7C 00 处后,设置 CPU 从 0 : 7C 00 开始执行此处的引导程序,操作系统被激活,控制计算机。 如果在 0 号软驱中没有软盘,或发生软盘 I/O 错误,则 INT 19H 将主要完成以下工作 ; (1) 读取硬盘 C 的 0 道 0 面 1 扇区的内容到 0 : 7C 00 ; (2) 将 CS:IP 指向 0 : 7C 00 。 这次课程设计的任务是编写一个可以自行启动计算机,不需要在现有操作系统环境中运行的程序。 改程序的功能如下: ( 1 )列出功能选项,让用户通过键盘进行选择,界面如下: 1 ) reset pc ; 重新启动计算机 2 ) Start system ; 引导现有的操作系统 3 ) Clock ; 进入时钟程序 4 ) Srt clock ; 设置时间 ( 2 )用户输入“ 1 ”后重新启动计算机。(提示:考虑 FFFF:0 ) ( 3 )用户输入“ 2 ” 后引导现有的操作系统。(提示:考虑硬盘 C 的 0 道 0 面 1 扇区) ( 4 )用户输入“ 3 ”后,执行动态现实当前日期,时间的程序。 现实格式如下:年 / 月 / 日 时:分:秒 进入此项功能后,一直动态现实当前的时间,在屏幕上将出现时间按秒变化的效果。(提示:循环读取 CMOS ) 当按下 F1 键后,改变现实颜色;按下 ESC 键后,返回到主选单。(提示:利用键盘中断) ( 5 )用户输入“ 4 ”后可更改当前的日期,时间,更改后返回到主选单。(提示:输入字符串) 下面给出的几点建议: ( 1 )在 DOS 下编写安装程序,在按转程序中包含任务程序; ( 2 )运行安装程序,将任务程序写到软盘上; ( 3 )若要任务程序可以在开机后自行执行,要将它写到软盘的 0 道 0 面 1 扇区上。如果程序长度大于 512B ,则需要用多个扇区存放,这种情况下,处于软盘 0 道 0 面 1 扇区中的程序就必须负责将其他扇区中的内容读入内存。 这个程序较为复杂,它用到了我们所学到的所有技术,需要进行仔细地分析和耐心地调试。这个程序对于我们的整个学习过程是具有总结性的,希望读者能够尽力完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值