王爽 汇编语言第二版 课程设计2

本文详细介绍了王爽汇编语言课程设计2的完整过程,包括设计要求、实现步骤、核心代码实现、运行环境及调试方法。通过此设计,读者能深入理解16位汇编语言,掌握8086汇编,了解计算机启动原理,学会自行启动计算机的程序编写。
摘要由CSDN通过智能技术生成

王爽汇编语言 课程设计2

  • 掌握一门编程语言最重要的就是实践,王爽老师的课程设计2,如果完整写出来要400行至800行代码,独立完成这个课程设计,会使你熟练16位汇编,掌握8086汇编精髓。这个课程设计不方便调试,独立完成的话要费一点时间,也许你会认为汇编已经过时了,没有必要浪费时间认真学,但是学习汇编语言,是解理计算机原理的捷径,汇编语言是万国语言的基础。如果只懂高级语言,那么只能做人家设计好东西,只能用API已经给功能,躺在巨人的怀里,不下去摸摸脚根你永远不会独立行走。掌握汇编理解原理再学编程你会感觉“道”在心中,长剑在手,有种世间任你挥撒豪情与欲望,不会再因为某种语言有没有什么功能限制你的想像与构思。学了汇编,你会知道C语言一个hello world有多么可爱,完成王爽教授的课程设计2,对于面向对象概念你会不学而解,因为在敲那几百行乱七八糟的代码过程中,你会感觉你迫切迫切需要的一个东西,那就是“面向对象”。完成了课程设计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 ”后,执行动态现实当前日期,时间的程序。
现实格式如下:年 / 月 / 日 时:分:秒

1、显示主菜单

在这里插入图片描述

2、显示并秒刷新时钟

在这里插入图片描述

3、设置时钟,左右箭头调整光标,esc退出,enter保存

在这里插入图片描述

二、实现步骤

1、写入引导区
	将引导程序512字节写入A盘第1扇区,大多数电脑已经没软驱动,用vmware虚拟机来实现。

第511字节要以0aa55h结尾,这是引导标志。

写A盘引导区代码
data segment
bootdata db 510 dup(0)
         dw 0aa55h
data ends
		;先把引导程写入512字节内存块
		mov ax,cs
		mov ds,ax    ;ds:si是安装源
		mov si,offset boot

		mov ax,data
		mov es,ax
		mov di,offset bootdata
		mov cx,offset endboot-offset boot
		cld
		rep movsb

		;再把512字节内存块中引导程序写入软盘引导扇区
        mov ax,data
		mov es,ax
		mov bx,offset bootdata;es:bx内存数据。

		mov dl,0;0软区
		mov dh,0;0(磁头)
		mov ch,0;磁道号
		mov cl,1;扇区号
		mov al,1;扇区数量
		mov ah,3;写扇区
		int 13h      
;====================================================================

引导扇区是磁盘0道0面第1扇区是512字,并且是以0aa55h结尾,上面的这些代码不可能正好510字节,所以先写一块大小为512字节并且以0aa55h结尾的内存区。

2、开机加载的引导代码

开机之后CPU会将引导驱的0面0道第1扇区自动加载到内存的7c00h处,加载完成后,cs:ip会指向0:7c00h。

要写入0面0道第1扇区的代码

这段代码也是开机自动被加载到内存7c00h处的代。

;=========================下面是A盘1扇区内容=============================
boot:                 
		mov ax,0      
		mov es,ax     
		mov bx,7e00h;es:bx内存数据。        

		mov dl,0;0软区
		mov dh,0;0(磁头)                  
		mov ch,0;磁道号                     
		mov cl,2;扇区号                     
		mov al,3;扇区数量                   
		mov ah,2;读扇区                     
		int 13h       

		mov bx,offset s7e00-offset boot+7c00h                     
		jmp dword ptr cs:[bx]               
		s7e00 dw 7e00h,0                    
endboot:nop           
;====================================================================
	
3、引导代码boot实现的两个功能
1、把磁盘上剩余的引导代码加载到内存。
mov ax,0      
		mov es,ax     
		mov bx,7e00h;es:bx内存数据。        

		mov dl,0;0软区
		mov dh,0;0(磁头)                  
		mov ch,0;磁道号                     
		mov cl,2;扇区号                     
		mov al,3;扇区数量                   
		mov ah,2;读扇区                     
		int 13h       
2、把控制权交给剩余的引导代码
mov bx,offset s7e00-offset boot+7c00h                     
		jmp dword ptr cs:[bx]               
		s7e00 dw 7e00h,0      

三、核心代码的实现

1、设计一个循环内核

因为按设计要求要有3个界面
1)显示菜单
2)显示并刷新的时钟界面
3)时钟设置界面
共有5个功能:显示菜单、重新启动、重新从C盘引导、显示时钟、设置时钟
为了实这5个功能,设计中一个单字节数字sign来标记
1)显示菜单 sign=1 esc的扫描码是1,所以用int 9h捕获到描扫码为1时,设置sign=1
2)重新启动 sign=2 数字键1的扫描码是2,所以用int 9h捕获到描扫码为2时,设置sign=2
3)重新从C盘引导 sign=3 扫描码3时,设置sign=3
4)显示时钟 sign=4 扫描码是4时,设置sign=4
5)设置钟 sign=5 扫描码是5时,设置sign=5
键盘捕获不调用复杂的算法,具体功由循环内核检测sign的值,并调用具体的模块,sign=1就一直刷新显示菜单,sign=2时重启,sign=3启新引导,sign=4一直刷新显示时钟,sign=5就设置时钟。
循环代码

color        db 4
functionlist dw offset endloopcore-offset do0+7e00h
			 dw offset showmenu   -offset do0+7e00h
			 dw offset reset      -offset do0+7e00h
			 dw offset startsys   -offset do0+7e00h
			 dw offset showclock  -offset do0+7e00h
			 dw offset setclock	  -offset do0+7e00h
sign         db 5      ;设为0时退出,1,显示菜单,4、时显示时钟 5、设置时钟
;这几行程序一直在循环,相当于微内核================================
;sign=1时显示菜单,    
;sign=2时调用reset     
;sign=3时调用硬盘第一扇区                    
;sign=4时显示时钟      
;sign=5时设置时钟      
;这几行程序一直在循环,相当于微内核================================
loopcore:              
        mov bx,offset sign        -offset sysboot+7e00h            
		mov bl,cs:[bx];  取出菜单选择的数字值
		mov bh,0       
		               
		cmp bl,dl ; 检测选择键是否改变       
		je loopcore1   
		call clear     
		               
		loopcore1:     
		mov dl,bl; 暂存用于下次比较          
		mov di,offset functionlist-offset sysboot+7e00h            
		add bl,bl ;functionlist 每个函数的地址是 2 字节。          
		add di,bx      
		call word ptr cs:[di]                
		jmp loopcore   
ret                    
;=======================这几行程序一直在循环,相当于微内核=================
2、键盘捕获

要分三种状态捕获
1)sgin=1时,是菜单状态,捕获数字1、2、3、4键。
比如显示菜单的时候按键1时,扫描码为2,即捕获到扫描码为2时,就把设置sgin=2,键盘捕获模块只设置sign的值,不调用其他函数,int 9如果调用复杂的函数会现意外的错误。sign的值改变之后,loopcore就会调用对应的函数showclock。
2)sgin=4时,是时钟显示状态,只捕获esc键,并设置sgin=1
3)sgin=5时,1、要捕获数0至9数字键设置时钟。2、左右箭头键调整光标位置。3、ese键退出。4、Enter保存时钟。
键盘捕获代码

color        db 4
sign         db 5      ;设为0时退出,1,显示菜单,4、时显示时钟 5、设置时钟
keycheck:
		push ax
		push bx
		push dx
		push di
		
		
		mov bx, offset sign-offset do0+7e00h
		mov ah,cs:[bx]
		
		cmp al,3bh; F1 改变颜色
		jne keyF2
			mov bx, offset color-offset do0+7e00h
			inc byte ptr cs:[bx]
			jmp quitkeycheck
			
			
		
		keyF2: 
		cmp al,3ch ; 接F2时设置sign=0,退出循环。
		jne keymenu
			mov byte ptr cs:
  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
阅读下面的材料 : 开机后, 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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值