汇编语言王爽课程设计二

本文介绍了汇编语言课程设计的内容,涉及CPU启动流程、BIOS的初始化程序以及操作系统引导过程。设计了一个程序,提供四个功能:重新启动计算机、引导现有操作系统、动态显示当前时间和设置时间。用户通过键盘输入选择功能,如输入1进行重启,输入2引导操作系统,输入3和4则与时间相关。程序利用CMOS读取时间,并在虚拟机环境下运行。
摘要由CSDN通过智能技术生成

前言:本文涉及两种代码,未安装虚拟机的参照第一种代码实现三四功能即可,

阅读下面的材料
开机后,CPU自动进入到FFFF:0单元处执行,此处有一条跳转指令。CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。
初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。
硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。
如果设为从软盘启动操作系统,则int 19h将主要完成以下工作。

控制0号软驱,读取软盘0道0面1扇区的内容到0:7c00;
将CS:IP指向0:7c00。
软盘的0道0面1扇区中装有操作系统引导程序。int 19h将其装到0:7c00处后,设置CPU从0:7c00开始执行此处的引导程序,操作系统被激活,控制计算机。
如果在0号软驱中没有软盘,或发生软盘I/O错误,则int 19h将主要完成以下工作。

读取硬盘C的0道0面1扇区的内容到0:7c00;
将CS:IP指向0:7c00。

该程序的功能如下:

(1)列出功能选项,让用户通过键盘进行选择,界面如下:

        1)reset pc                        ;重新启动计算机

        2)start system                 ;引导现有的操作系统

        3)clock                             ;进入始终程序

        4)set clock                        ;设置时间

(2)用户输入“1”后重新启动计算机(提示:考虑ffff:0单元)

(3)用户输入“2”后引导现有的操作系统(提示:考虑硬盘C的0道0面1扇区)

(4)用户输入“3”后,执行动态显示当前日期,时间的程序

显示格式如下:年/月/日/ 时/分/秒

进入此项功能后,一直动态显示当前的时间,在屏幕上将出现时间按秒变化的效果(提示:循环读取CMOS)。

当按下F1键后,改变显示颜色:按下ESC键后,返回到主选单(提示:利用键盘中断)。

(5)用户输入“4”后可更改当前的日期,时间,更改后返回到主选单(提示:输入字符串)

以下内容进实现 3 4号功能  

assume cs:code,ds:data,ss:stack

data segment

BEGIN		db	 512 dup(0)				;因为一个扇区字节大小为512

BEGIN_BOOT	db       512 dup(0)				;2号扇区	ds:[si]->es:[di]
		db  	 512 dup(0)				;3
		db  	 512 dup(0)				;4

data ends

stack segment 
	db 128 dup(0)
stack ends

code segment
	start:	mov ax,stack
		mov ss,ax
		mov sp,128(0)

;		mov bx,OFFSET Boot_end - OFFSET Boot

;		call cpy_boot_toDiskA	;把上述代码复制到软盘中

		call cpy_Boot
		call sav_old_int9	;因为要编写新的int9

		mov bx,0
		push bx
		mov bx,7e00h
		push bx
		retf		;相当于执行 pop ip pop cs  返还到保存在0:7e00h中的 Boot代码
				;ret 相当于 pop ip

		mov ax,4c00h
		int 21h

;int 19h 的内容: 将软盘0面0道1扇区(512)-》写入 0:7c00h  cs:ip=0:7c00h 
;将0面0到2扇区开始的 3个扇区中的内容 复制 到 0:7e00h 	cs:ip-07e00h
;先将 OFFSET Boot_end -OFFSET Boot 复制到 0面0道2扇区开始的3个扇区
;es:[bx]->复制到 1 2 3 4扇区
;==========================================================
Boot:		jmp BOOT_START

;*******************************************************************
;*******************************************************************
;*******************************************************************
									;数据区
OPTION_1		db	'1) restart pc ',0		;地址两个字节????
OPTION_2		db	'2) start system ',0	
OPTION_3		db	'3) show clock ',0	
OPTION_4		db	'4) set clock ',0	

ADDRESS_OPTION		dw 	OFFSET OPTION_1 - OFFSET Boot + 7e00h		;ADDRESS_OPTION[0]     可以不加OFFSET的!!!
			dw	OFFSET OPTION_2 - OFFSET Boot + 7e00h
			dw	OFFSET OPTION_3 - OFFSET Boot + 7e00h
			dw	OFFSET OPTION_4 - OFFSET Boot + 7e00h

TIME_CMOS		db  	9,8,7,4,2,0			;CMOS RAM中存储的时间信息	详情看实验16
TIME_STYLE		db	'YY/MM/DD HH:MM:SS',0		

STRING_STACK            db	12 dup('0'),0			;time_style 中12个字节型数据

;*******************************************************************
;*******************************************************************
;*******************************************************************



BOOT_START:	call init_reg			;寄存器 对es ds赋值 es 0b800 ds 0
		call clear_screen		;清屏
		call show_option		

		jmp choose_option

		mov ax,4c00h
		int 21h
;==========================================================
choose_option:	call clear_buff			;调用了int 16h 来处理键盘缓冲区中已经输入数据		详情看实验十七

		mov ah,0			;从数据缓存区中读取数据
		int 16h				; ah 扫描码 al ASCII码

		cmp al,'1'
		je isChooseOne
		cmp al,'2'
		je isChooseTwo
		cmp al,'3'
		je isChooseThree
		cmp al,'4'
		je isChooseFour


		jmp choose_option	;不用管ret

;==========================================================
isChooseOne:	mov di,160*3
		mov byte ptr es:[di],'1'	;es是0b800h  将写入的数据 显示到屏幕上	
		jmp choose_option

isChooseTwo:	mov di,160*3
		mov byte ptr es:[di],'2'	;es是0b800h
		jmp choose_option

isChooseThree:	mov di,160*3
		mov byte ptr es:[di],'3'	;es是0b800h
		call show_clock			;功能3:执行动态显示当前日期,时间的程序!!!
		jmp BOOT_START

isChooseFour:	mov di,160*3
		mov byte ptr es:[di],'4'	;es是0b800h
		call set_clock
		jmp choose_option

;======================================================================
set_clock:	call clear_string_stack
		call show_string_stack
		call get_string
		call set_time			;修改cmos中的时间


		ret

;=======================================================
set_time:	
		mov bx,OFFSET TIME_CMOS -Boot+7e00h
		mov si,OFFSET STRING_STACK - OFFSET Boot + 7e00h
		mov cx,6

setTime:	mov dx,ds:[si]			;换位 bcd码
		sub dh,30h			;ds:[si] ='12'
		sub dl,30h			; dh ='2' dl= '1'
		shl dl,1
		shl dl,1
		shl dl,1
		shl dl,1
		and dh,00001111b
		or dl,dh

		mov al,ds:[bx]			;传递给cmos
		out 70h,al
		mov al,dl
		out 71h,al

		add si,2
		inc bx

		loop setTime

		ret

;=========================================================
get_string:	mov si,OFFSET STRING_STACK -OFFSET Boot +7e00h
		mov bx,0			;当作栈顶
		
getString:	call clear_buff

		mov ah,0
		int 1
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
阅读下面的材料 : 开机后, 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 扇区中的程序就必须负责将其他扇区中的内容读入内存。 这个程序较为复杂,它用到了我们所学到的所有技术,需要进行仔细地分析和耐心地调试。这个程序对于我们的整个学习过程是具有总结性的,希望读者能够尽力完成。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值