汇编语言课程设计2.docx

上传人:b****9 文档编号:24978865 上传时间:2023-06-03 格式:DOCX 页数:19 大小:54.19KB
下载 相关 举报
汇编语言课程设计2.docx_第1页
第1页 / 共19页
汇编语言课程设计2.docx_第2页
第2页 / 共19页
汇编语言课程设计2.docx_第3页
第3页 / 共19页
汇编语言课程设计2.docx_第4页
第4页 / 共19页
汇编语言课程设计2.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

汇编语言课程设计2.docx

《汇编语言课程设计2.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计2.docx(19页珍藏版)》请在冰豆网上搜索。

汇编语言课程设计2.docx

汇编语言课程设计2

汇编语言课程实验报告

实验名称

课程设计2

实验环境

硬件平台:

IntelCorei5-3210M

操作系统:

DOSBoxinWindows

软件工具:

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,rightsreserved.",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.虚拟机启动后显示如下画面:

说明此程序脱离操作系统环境运行成功。

实验总结

本次实验需要运用到的新知识较多,包含了之前所学的几乎所有的汇编语言相关知识,同时还需要对计算机的启动管理机制有一个较好的了解。

除了编辑程序代码外,本次实验还需要花费较长时间来安装虚拟软驱、虚拟机等。

可以说,这一次的实验对一个计算机学生来说是一次莫大的锻炼。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1