当前位置:文档之家› 汇编语言-课程设计2

汇编语言-课程设计2

汇编语言课程实验报告实验名称课程设计2实验环境硬件平台:Intel Core i5-3210M操作系统:DOSBox in Windows软件工具:MASM, VFloopy, Microsoft Virtual PC 2007实验内容编写一个可以自动启动计算机,不需要在现有操作系统环境中运行的程序。

该程序功能如下:(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)。

实验步骤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.程序的汇编代码如下:assume cs:setupsg;安装程序;将引导所需的程序写入到软盘setupsg segmentassume cs:setupsgsetup:;主引导程序安装到第一扇区mov ax,initsgmov es,axmov bx,0mov al,1mov ch,0mov cl,1mov dl,0mov dh,0mov ah,3int 13h;子程序安装到从第2扇区开始的扇区mov ax,syssgmov es,axmov al,15mov cl,2mov ah,3int 13h;安装结束,返回mov ax,4c00hint 21hsetupsg ends;主引导程序;包含所有子程序的直接定址表,扇区加载程序,菜单initsg segmentassume cs:initsginit:call loadsysmov ax,2000hpush axmov ax,0push axretfloadsys:mov ax,2000h ;软盘数据读取到2000:0mov es,axmov bx,0mov al,15 ;读取的扇区数mov ch,0 ;0磁道mov cl,2 ;2扇区mov dl,0 ;0号驱动器mov dh,0 ;0面mov ah,2int 13hretinitsg ends;子程序;包含所有菜单需要调用的子过程syssg segmentassume cs:syssg;菜单显示功能menu:jmp near ptr menushowmenudata dw offset md0,offset md1,offset md2,offset md3,offset md4,offset md5md0 db "------ Welcome ------",0md1 db "1) reset pc",0md2 db "2) start system",0md3 db "3) clock",0md4 db "4) set clock",0md5 db "Copyright @ 2010 Haoran, rights reserved.",0systable dw sys_restart,sys_disksys,sys_showclock,sys_setclock menushow:mov dh,5mov dl,30mov bp,0mov ax,csmov ds,axmov cx,5menushow_s:push cxmov si,menudata[bp]mov cl,02hcall sys_showstradd bp,2add dh,2pop cxloop menushow_smov si,offset md5mov dh,23mov cl,02hcall sys_showstr;处理用户输入sys_input:mov ah,0int 16hmov bx,0mov bl,almov al,30hsub bl,al ;ascii转换为序列号sub bl,1 ;1-4转换为0-3cmp bx,0jb cyclecmp bx,3ja cycleadd bx,bxcall word ptr systable[bx] ;调用菜单功能cycle:jmp short sys_input;重启计算机sys_restart:mov ax,0ffffhmov ax,0hpush axretf;从硬盘引导sys_disksys:call clsmov ax,0h ;硬盘数据读取到0:7c00 mov es,axmov bx,7c00hmov al,1 ;读取的扇区数mov ch,0 ;0磁道mov cl,1 ;1扇区mov dl,80h ;c盘mov dh,0 ;0面mov ah,2int 13hmov ax,0hpush axmov ax,7c00hpush axretfsys_showclock:call clsjmp short clockreadclockdata:clockstr dw offset cl1,offset cl2,offset cl3clockcolor db 02hcl1 db '00/00/00 00:00:00',0cl2 db 'press ESC return menu!',0cl3 db 'press F1 change color!',0cltable db 9,8,7,4,2,0clockread:mov si,0 ;si指向'yy/mm/dd hh:mm:ss'的首地址 mov di,0 ;di指向9,8,7,4,2,0的首地址mov cx,6 ;循环次数clockread_s:push cxmov al,cltable[di] ;从CMOS中读出年份的BCD码 out 70h,alin al,71hmov ah,al ;al中位读出的数据mov cl,4shr ah,cl ;ah中为年份的十位数and al,00001111b ;al中为年份的个位数add ah,30h ;把数值转换为对应的ASCII码add al,30h ;同上mov byte ptr cl1[si],ah ;把读出的时间写入mov byte ptr cl1[si+1],aladd si,3inc dipop cxloop clockread_sclockprint:mov dh,6mov dl,30mov bp,0mov ax,csmov ds,axmov cx,3clockprint_s:push cxmov si,clockstr[bp]mov cl,clockcolor[0] ;将颜色值赋值给clcall sys_showstradd bp,2add dh,2pop cxloop clockprint_smov ah,1 ;调用16h中断的1号功能(非阻塞) int 16hcmp al,1bh ;判断是否为ESCje clockreturn ;若是ESC,回到菜单cmp ah,3bh ;判断是否为F1je changecolorjmp short clockreadclockreturn:call clsmov ah,0 ;16h中断的1号功能不会清除键盘缓冲区,下次读取还会读出 int 16h ;调用0号功能清除一次jmp near ptr menuchangecolor:inc clockcolormov ah,0 ;16h中断的1号功能不会清除键盘缓冲区,下次读取还会读出 int 16h ;调用0号功能清除一次jmp near ptr clockread;设置时钟sys_setclock:jmp short setclocksetclockdata db 'Please input time like "yy/mm/dd hh:mm:ss"',0setsuccess db 'Set clock successful! Press any key return...',0 setclock:call clsmov dh,6mov dl,20mov cl,02hmov ax,csmov ds,axmov si,offset setclockdatacall sys_showstrcall getstrcall settimemov dh,10mov dl,20mov cl,02hmov ax,csmov ds,axmov si,offset setsuccesscall sys_showstrmov ah,0int 16hcall clsjmp near ptr menu;ds:si指向时间字符串settime:jmp short setingsettable db 9,8,7,4,2,0 seting:mov bx,0mov cx,6settime_s:mov dh,ds:[si]inc simov dl,ds:[si]add si,2sub dl,alsub dh,alshl dh,1shl dh,1shl dh,1shl dh,1or dl,dhmov al,settable[bx]out 70h,almov al,dlout 71h,alinc bxloop settime_sret;子程序:接收字符串getstr:push axgetstrs:mov ah,0int 16hcmp al,20hjb nocharmov ah,0call charstackmov ah,2mov dl,25call charstackjmp getstrsnochar:cmp ah,0ehje backspacecmp ah,1chje enterjmp getstrsbackspace:mov ah,1call charstackmov ah,2call charstackjmp getstrsenter:mov al,0mov ah,0call charstackmov ah,2call charstackpop axret;子程序:字符串入栈,出栈和显示;参数:(ah)=功能号,0入栈,1出栈,2显示; ds:si指向字符栈空间,对于0号功能,(al)表示入栈字符; 1号功能,(al)返回的字符,对于2号功能,(dh)(dl)字符串在屏幕显示的行列位置charstack:jmp short charstarttable dw charpush,charpop,charshowtop dw 0charstart:push bxpush dxpush dipush escmp ah,2ja sretmov bl,ahmov bh,0add bx,bxjmp word ptr table[bx]charpush:mov bx,topmov [si][bx],alinc topjmp sretcharpop:cmp top,0je sretdec topmov bx,topmov al,[si][bx]jmp sretcharshow:mov bx,0b800hmov es,bxmov al,160mov ah,0mul dhmov di,axadd dl,dlmov dh,0add di,dxmov bx,0charshows:cmp bx,topjne noemptymov byte ptr es:[di],' 'mov byte ptr es:[di+1],02h jmp sretnoempty:mov al,[si][bx]mov es:[di],almov byte ptr es:[di+2],' ' mov byte ptr es:[di+1],02h inc bxadd di,2sret:pop espop dipop dxpop bxret;显示0结尾的字符串;参数:dh=行号,dl=列号,cl=颜色,ds:si指向字符串首地址sys_showstr:push axpush cxpush dxpush sipush bppush esmov ax,0b800hmov es,axmov al,80*2 ;80*2*行号mul dhmov dh,0add dx,dx ;列号*2add ax,dxmov bp,axshowstr_s:cmp ch,0je showstr_returnmov es:[bp],chinc bpmov es:[bp],clinc bpinc sijmp short showstr_s showstr_return:pop espop bppop sipop dxpop cxpop axret;清屏cls:mov ax,0b800hmov ds,axmov bx,0mov cx,24*80*2cls_s:mov byte ptr ds:[bx],0add bx,2loop cls_smov bx,1resetcol:mov byte ptr ds:[bx],07hadd bx,2loop resetcolretsyssg ends;安装过程的第一行指令end setup6.由于此程序涉及底层硬件的操作,而我们目前电脑的底层硬件及启动机制比实验内容要复杂得多。

相关主题