您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 汇编语言-课程设计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;安装程序;将引导所需的程序写入到软盘setupsgsegmentassumecs:setupsgsetup:;主引导程序安装到第一扇区movax,initsgmoves,axmovbx,0moval,1movch,0movcl,1movdl,0movdh,0movah,3int13h;子程序安装到从第2扇区开始的扇区movax,syssgmoves,axmoval,15movcl,2movah,3int13h;安装结束,返回movax,4c00hint21hsetupsgends;主引导程序;包含所有子程序的直接定址表,扇区加载程序,菜单initsgsegmentassumecs:initsginit:callloadsysmovax,2000hpushaxmovax,0pushaxretfloadsys:movax,2000h;软盘数据读取到2000:0moves,axmovbx,0moval,15;读取的扇区数movch,0;0磁道movcl,2;2扇区movdl,0;0号驱动器movdh,0;0面movah,2int13hretinitsgends;子程序;包含所有菜单需要调用的子过程syssgsegmentassumecs:syssg;菜单显示功能menu:jmpnearptrmenushowmenudatadwoffsetmd0,offsetmd1,offsetmd2,offsetmd3,offsetmd4,offsetmd5md0db------Welcome------,0md1db1)resetpc,0md2db2)startsystem,0md3db3)clock,0md4db4)setclock,0md5dbCopyright@2010Haoran,Inc.Allrightsreserved.,0systabledwsys_restart,sys_disksys,sys_showclock,sys_setclockmenushow:movdh,5movdl,30movbp,0movax,csmovds,axmovcx,5menushow_s:pushcxmovsi,menudata[bp]movcl,02hcallsys_showstraddbp,2adddh,2popcxloopmenushow_smovsi,offsetmd5movdh,23movdl,28movcl,02hcallsys_showstr;处理用户输入sys_input:movah,0int16hmovbx,0movbl,almoval,30hsubbl,al;ascii转换为序列号subbl,1;1-4转换为0-3cmpbx,0jbcyclecmpbx,3jacycleaddbx,bxcallwordptrsystable[bx];调用菜单功能cycle:jmpshortsys_input;重启计算机sys_restart:movax,0ffffhpushaxmovax,0hpushaxretf;从硬盘引导sys_disksys:callclsmovax,0h;硬盘数据读取到0:7c00moves,axmovbx,7c00hmoval,1;读取的扇区数movch,0;0磁道movcl,1;1扇区movdl,80h;c盘movdh,0;0面movah,2int13hmovax,0hpushaxmovax,7c00hpushaxretf;显示时钟sys_showclock:callclsjmpshortclockreadclockdata:clockstrdwoffsetcl1,offsetcl2,offsetcl3clockcolordb02hcl1db'00/00/0000:00:00',0cl2db'pressESCreturnmenu!',0cl3db'pressF1changecolor!',0cltabledb9,8,7,4,2,0clockread:movsi,0;si指向'yy/mm/ddhh:mm:ss'的首地址movdi,0;di指向9,8,7,4,2,0的首地址movcx,6;循环次数clockread_s:pushcxmoval,cltable[di];从CMOS中读出年份的BCD码out70h,alinal,71hmovah,al;al中位读出的数据movcl,4shrah,cl;ah中为年份的十位数andal,00001111b;al中为年份的个位数addah,30h;把数值转换为对应的ASCII码addal,30h;同上movbyteptrcl1[si],ah;把读出的时间写入movbyteptrcl1[si+1],aladdsi,3incdipopcxloopclockread_sclockprint:movdh,6movdl,30movbp,0movax,csmovds,axmovcx,3clockprint_s:pushcxmovsi,clockstr[bp]movcl,clockcolor[0];将颜色值赋值给clcallsys_showstraddbp,2adddh,2popcxloopclockprint_smovah,1;调用16h中断的1号功能(非阻塞)int16hcmpal,1bh;判断是否为ESCjeclockreturn;若是ESC,回到菜单cmpah,3bh;判断是否为F1jechangecolorjmpshortclockreadclockreturn:callclsmovah,0;16h中断的1号功能不会清除键盘缓冲区,下次读取还会读出int16h;调用0号功能清除一次jmpnearptrmenuchangecolor:incclockcolormovah,0;16h中断的1号功能不会清除键盘缓冲区,下次读取还会读出int16h;调用0号功能清除一次jmpnearptrclockread;设置时钟sys_setclock:jmpshortsetclocksetclockdatadb'Pleaseinputtimelikeyy/mm/ddhh:mm:ss',0setsuccessdb'Setclocksuccessful!Pressanykeyreturn...',0setclock:callclsmovdh,6movdl,20movcl,02hmovax,csmovds,axmovsi,offsetsetclockdatacallsys_showstrcallgetstrcallsettimemovdh,10movdl,20movcl,02hmovax,csmovds,axmovsi,offsetsetsuccesscallsys_showstrmovah,0int16hcallclsjmpnearptrmenu;ds:si指向时间字符串settime:jmpshortsetingsettabledb9,8,7,4,2,0seting:movbx,0movcx,6settime_s:movdh,ds:[si]incsimovdl,ds:[si]addsi,2moval,30hsubdl,alsubdh,alshldh,1shldh,1shldh,1shldh,1ordl,dhmoval,settable[bx]out70h,almoval,dlout71h,alincbxloopsettime_sret;子程序:接收字符串getstr:pushaxgetstrs:movah,0int16hcmpal,20hjbnocharmovah,0callcharstackmovah,2movdh,8movdl,25callcharstackjmpgetstrsnochar:cmpah,0ehjebackspacecmpah,1chjeenterjmpgetstrsbackspace:movah,1callcharstackmovah,2callcharstackjmpgetstrsenter:moval,0movah,0callcharstackmovah,2callcharstackpopaxret;子程序:字符串入栈,出栈和显示;参数:(ah)=功能号,0入栈,1出栈,2显示;ds:si指向字符栈空间,对于0号功能,(al)表示入栈字符;1号功能,(al)返回的字符,对于2号功能,(dh)(dl)字符串在屏幕显示的行列位置charstack:jmpshortcharstarttabledwcharpush,charpop,charshowtopdw0charstart:pushbxpushdxpushdipushescmpah,2jasretmovbl,ahmovbh,0addbx,bxjmpwordptrtable[bx]charpush:movbx,topmov[si][bx],alinctopjmpsretcharpop:cmptop,0jesretdectopmovbx,topmoval,[si][bx]jmpsretcharshow:movbx,0b800hmoves,bxmoval,160movah,0muldhmovdi,axadddl,dlmovdh,0adddi,dxmovbx,0charshows:cmpbx,topjnenoemptymovbyteptres:[di],''movbyteptres:[di+1],02hjmpsretnoempty:moval,[si][bx]moves:[di],almovbyteptres:[di+2],''movbyteptres:[di+1],02hincbxadddi,2jmpcharshowssret:popespopdipopdxpopbxret;显示0结尾的字符串;参数:dh=行号,dl=列号,cl=颜色,ds:si指向字符串首地址sys_showstr:pushaxpushcxpushdxpushsipushbppushesmovax,0b800hmoves,axmoval,80*2;80*2*行号muldhmovdh,0adddx,dx;列号*2addax,dxmovbp,axshowstr_s:movch,ds:[si]cmpch,0jeshowstr_returnmoves:[bp
本文标题:汇编语言-课程设计2
链接地址:https://www.777doc.com/doc-6388075 .html