汇编语言课程设计2.docx
《汇编语言课程设计2.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计2.docx(19页珍藏版)》请在冰豆网上搜索。
汇编语言课程设计2
汇编语言课程实验报告
实验名称
课程设计2
实验环境
硬件平台:
IntelCorei5-3210M
操作系统:
DOSBox0.74inWindows8.1
软件工具:
MASM,VFloopy,MicrosoftVirtualPC2007
实验内容
编写一个可以自动启动计算机,不需要在现有操作系统环境中运行的程序。
该程序功能如下:
(1)列出功能选项,让用户通过键盘进行选择,界面如下:
1)resetpc;重新启动计算机
2)startsystem;引导现有的操作系统
3)clock;进入时钟程序
4)setclock;设置时间
(2)用户输入“1”后重新启动计算机(提示:
考虑ffff:
0单元)。
(3)用户输入“2”后引导现有的操作系统(提示:
考虑硬盘C的0道0面1扇区)。
(4)用户输入“3”后,执行动态显示当前日期、时间的程序。
显示格式如下:
年/月/日时:
分:
秒
进入此项功能后,一直动态显示当前的时间,在屏幕上将出现时间按秒变化的效果(提示:
循环读取CMOS)。
实验步骤
1.系统启动初始化完成后最终调用19h,该中断读取软盘的第一扇区或硬盘的第一扇区到0:
7c00开始的512个字节的内存空间中,并将cs:
ip指向0:
7c00执行。
2.第一个段为安装程序,负责将第二个段写入第一扇区,第三个段写入2-17扇区。
3.第二个段是主引导程序,存在于软盘第一扇区,由BIOS的19h中断读取到0:
7c00开始的内存单元中,并执行0:
7c00的第一行代码。
这一段的任务是将软盘2-17扇区的数据读入内存,并执行。
(这里读入到了2000:
0开始的内存中)。
4.第三个段是系统程序,存放所有引导所需的程序和子程序。
5.程序的汇编代码如下:
assumecs:
setupsg
;安装程序
;将引导所需的程序写入到软盘
setupsgsegment
assumecs:
setupsg
setup:
;主引导程序安装到第一扇区
movax,initsg
moves,ax
movbx,0
moval,1
movch,0
movcl,1
movdl,0
movdh,0
movah,3
int13h
;子程序安装到从第2扇区开始的扇区
movax,syssg
moves,ax
moval,15
movcl,2
movah,3
int13h
;安装结束,返回
movax,4c00h
int21h
setupsgends
;主引导程序
;包含所有子程序的直接定址表,扇区加载程序,菜单
initsgsegment
assumecs:
initsg
init:
callloadsys
movax,2000h
pushax
movax,0
pushax
retf
loadsys:
movax,2000h;软盘数据读取到2000:
0
moves,ax
movbx,0
moval,15;读取的扇区数
movch,0;0磁道
movcl,2;2扇区
movdl,0;0号驱动器
movdh,0;0面
movah,2
int13h
ret
initsgends
;子程序
;包含所有菜单需要调用的子过程
syssgsegment
assumecs:
syssg
;菜单显示功能
menu:
jmpnearptrmenushow
menudatadwoffsetmd0,offsetmd1,offsetmd2,offsetmd3,offsetmd4,offsetmd5
md0db"------Welcome------",0
md1db"1)resetpc",0
md2db"2)startsystem",0
md3db"3)clock",0
md4db"4)setclock",0
md5db"Copyright@2010Haoran,Inc.Allrightsreserved.",0
systabledwsys_restart,sys_disksys,sys_showclock,sys_setclock
menushow:
movdh,5
movdl,30
movbp,0
movax,cs
movds,ax
movcx,5
menushow_s:
pushcx
movsi,menudata[bp]
movcl,02h
callsys_showstr
addbp,2
adddh,2
popcx
loopmenushow_s
movsi,offsetmd5
movdh,23
movdl,28
movcl,02h
callsys_showstr
;处理用户输入
sys_input:
movah,0
int16h
movbx,0
movbl,al
moval,30h
subbl,al;ascii转换为序列号
subbl,1;1-4转换为0-3
cmpbx,0
jbcycle
cmpbx,3
jacycle
addbx,bx
callwordptrsystable[bx];调用菜单功能
cycle:
jmpshortsys_input
;重启计算机
sys_restart:
movax,0ffffh
pushax
movax,0h
pushax
retf
;从硬盘引导
sys_disksys:
callcls
movax,0h;硬盘数据读取到0:
7c00
moves,ax
movbx,7c00h
moval,1;读取的扇区数
movch,0;0磁道
movcl,1;1扇区
movdl,80h;c盘
movdh,0;0面
movah,2
int13h
movax,0h
pushax
movax,7c00h
pushax
retf
;显示时钟
sys_showclock:
callcls
jmpshortclockread
clockdata:
clockstrdwoffsetcl1,offsetcl2,offsetcl3
clockcolordb02h
cl1db'00/00/0000:
00:
00',0
cl2db'pressESCreturnmenu!
',0
cl3db'pressF1changecolor!
',0
cltabledb9,8,7,4,2,0
clockread:
movsi,0;si指向'yy/mm/ddhh:
mm:
ss'的首地址
movdi,0;di指向9,8,7,4,2,0的首地址
movcx,6;循环次数
clockread_s:
pushcx
moval,cltable[di];从CMOS中读出年份的BCD码
out70h,al
inal,71h
movah,al;al中位读出的数据
movcl,4
shrah,cl;ah中为年份的十位数
andal,00001111b;al中为年份的个位数
addah,30h;把数值转换为对应的ASCII码
addal,30h;同上
movbyteptrcl1[si],ah;把读出的时间写入
movbyteptrcl1[si+1],al
addsi,3
incdi
popcx
loopclockread_s
clockprint:
movdh,6
movdl,30
movbp,0
movax,cs
movds,ax
movcx,3
clockprint_s:
pushcx
movsi,clockstr[bp]
movcl,clockcolor[0];将颜色值赋值给cl
callsys_showstr
addbp,2
adddh,2
popcx
loopclockprint_s
movah,1;调用16h中断的1号功能(非阻塞)
int16h
cmpal,1bh;判断是否为ESC
jeclockreturn;若是ESC,回到菜单
cmpah,3bh;判断是否为F1
jechangecolor
jmpshortclockread
clockreturn:
callcls
movah,0;16h中断的1号功能不会清除键盘缓冲区,下次读取还会读出
int16h;调用0号功能清除一次
jmpnearptrmenu
changecolor:
incclockcolor
movah,0;16h中断的1号功能不会清除键盘缓冲区,下次读取还会读出
int16h;调用0号功能清除一次
jmpnearptrclockread
;设置时钟
sys_setclock:
jmpshortsetclock
setclockdatadb'Pleaseinputtimelike"yy/mm/ddhh:
mm:
ss"',0
setsuccessdb'Setclocksuccessful!
Pressanykeyreturn...',0
setclock:
callcls
movdh,6
movdl,20
movcl,02h
movax,cs
movds,ax
movsi,offsetsetclockdata
callsys_showstr
callgetstr
callsettime
movdh,10
movdl,20
movcl,02h
movax,cs
movds,ax
movsi,offsetsetsuccess
callsys_showstr
movah,0
int16h
callcls
jmpnearptrmenu
;ds:
si指向时间字符串
settime:
jmpshortseting
settabledb9,8,7,4,2,0
seting:
movbx,0
movcx,6
settime_s:
movdh,ds:
[si]
incsi
movdl,ds:
[si]
addsi,2
moval,30h
subdl,al
subdh,al
shldh,1
shldh,1
shldh,1
shldh,1
ordl,dh
moval,settable[bx]
out70h,al
moval,dl
out71h,al
incbx
loopsettime_s
ret
;子程序:
接收字符串
getstr:
pushax
getstrs:
movah,0
int16h
cmpal,20h
jbnochar
movah,0
callcharstack
movah,2
movdh,8
movdl,25
callcharstack
jmpgetstrs
nochar:
cmpah,0eh
jebackspace
cmpah,1ch
jeenter
jmpgetstrs
backspace:
movah,1
callcharstack
movah,2
callcharstack
jmpgetstrs
enter:
moval,0
movah,0
callcharstack
movah,2
callcharstack
popax
ret
;子程序:
字符串入栈,出栈和显示
;参数:
(ah)=功能号,0入栈,1出栈,2显示
;ds:
si指向字符栈空间,对于0号功能,(al)表示入栈字符
;1号功能,(al)返回的字符,对于2号功能,(dh)(dl)字符串在屏幕显示的行列位置
charstack:
jmpshortcharstart
tabledwcharpush,charpop,charshow
topdw0
charstart:
pushbx
pushdx
pushdi
pushes
cmpah,2
jasret
movbl,ah
movbh,0
addbx,bx
jmpwordptrtable[bx]
charpush:
movbx,top
mov[si][bx],al
inctop
jmpsret
charpop:
cmptop,0
jesret
dectop
movbx,top
moval,[si][bx]
jmpsret
charshow:
movbx,0b800h
moves,bx
moval,160
movah,0
muldh
movdi,ax
adddl,dl
movdh,0
adddi,dx
movbx,0
charshows:
cmpbx,top
jnenoempty
movbyteptres:
[di],''
movbyteptres:
[di+1],02h
jmpsret
noempty:
moval,[si][bx]
moves:
[di],al
movbyteptres:
[di+2],''
movbyteptres:
[di+1],02h
incbx
adddi,2
jmpcharshows
sret:
popes
popdi
popdx
popbx
ret
;显示0结尾的字符串
;参数:
dh=行号,dl=列号,cl=颜色,ds:
si指向字符串首地址
sys_showstr:
pushax
pushcx
pushdx
pushsi
pushbp
pushes
movax,0b800h
moves,ax
moval,80*2;80*2*行号
muldh
movdh,0
adddx,dx;列号*2
addax,dx
movbp,ax
showstr_s:
movch,ds:
[si]
cmpch,0
jeshowstr_return
moves:
[bp],ch
incbp
moves:
[bp],cl
incbp
incsi
jmpshortshowstr_s
showstr_return:
popes
popbp
popsi
popdx
popcx
popax
ret
;清屏
cls:
movax,0b800h
movds,ax
movbx,0
movcx,24*80*2
cls_s:
movbyteptrds:
[bx],0
addbx,2
loopcls_s
movbx,1
resetcol:
movbyteptrds:
[bx],07h
addbx,2
loopresetcol
ret
syssgends
;安装过程的第一行指令
endsetup
6.由于此程序涉及底层硬件的操作,而我们目前电脑的底层硬件及启动机制比实验内容要复杂得多。
因此我们将其放在相对简单的虚拟机中运行。
7.首先我们需要用一个名为VFloopy的软件来建立一个虚拟软驱,并使其盘符为A,这样我们的程序就能将其内容安装到虚拟软驱里。
8.然后我们还需要建立一个虚拟机来模拟电脑的启动,我们使用MicrosoftVirtualPC这个虚拟机软件。
9.编译链接我们的程序,运行后代码写入到虚拟软盘中。
10.新建一个虚拟机,使用软盘A引导,启动虚拟机。
11.虚拟机启动后显示如下画面:
说明此程序脱离操作系统环境运行成功。
实验总结
本次实验需要运用到的新知识较多,包含了之前所学的几乎所有的汇编语言相关知识,同时还需要对计算机的启动管理机制有一个较好的了解。
除了编辑程序代码外,本次实验还需要花费较长时间来安装虚拟软驱、虚拟机等。
可以说,这一次的实验对一个计算机学生来说是一次莫大的锻炼。