汇编语言实验教案文档格式.docx
《汇编语言实验教案文档格式.docx》由会员分享,可在线阅读,更多相关《汇编语言实验教案文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
start:
pushds
subax,ax
pushax
movax,datarea
movds,ax
moves,ax
leasi,string1
leadi,string2
cld
movcx,25
repzcmpsb
jzmatch
leadx,mess2
jmpshortdisp
match:
leadx,mess1
disp:
movah,09
int21h
ret
mainendp
prognamends
endstart
2.对源文件汇编产生目标文件obj
D:
\masm文件名。
3.用连接程序link产生执行文件exe
\link文件名。
Obj
4.执行程序
\文件名
5.使用debug程序调试程序的方法。
d>
debug文件名.exe
_
1.用G命令运行程序
2.用U命令显示程序
3.学会设置断点。
4.学会查看数据段的内容情况
5.用E命令修改数据区的字符串。
6.用A命令把数据区的内容恢复原状
7.T命令逐条跟踪程序的执行。
8.学会使用F命令、R命令、Q命令等等。
六、选作题目:
将以buf1为起始地址的字节存储区中的内容传送到以buf2为起始地址的字节存储区中
七、重点和难点:
(1)用汇编语言设计、编写、调试和运行程序的方法,熟练掌握与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。
(2)程序的理解,系统功能的调用。
八、注意事项:
i.编辑源程序时,扩展名(asm)一定要写上。
ii.汇编源程序时,源程序一定要是汇编程序,用连接程序link连接的是目标程序(obj),连接成功后,产生可执行文件。
iii.学会找数据段地址。
iv.如果用U命令时,代码段地址不断增加,如要从头显示,可用U00(00为偏移地址)。
v.E2929为偏移地址
vi.F29l9‘forward.’2029为偏移地址.L为要修改的长度。
20是空格的asc||码。
实验二循环程序设计1
一.实验目的:
学会用循环结构进行程序编程。
二.实验题目:
用表格形式显示ASC||字符SMASC||
三.实验要求:
按15行*16列的表格形式显示ASC||码为10H----100H的所有字符,即以行为主的顺序及ASC||码递增的次序依次显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符(ASC||为0)隔开。
四.方法说明:
(1)显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下:
movah,02h
movdl,0ah
int21h
本题中可把dl初始化为10H,然后不断使其加1(用INC指令)以取得下一个字符的ASC||码。
(2)显示空白符时,用其ASC||码0置入dl寄存器,每行结束时,用显示回车(ASC||为0dh)和换行符(ASC||为oah)来结束本行并开始下一行。
(3)由于逐个显示相继的ASC||字符时,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用dl寄存器,为此可使用堆栈来保存相继的ASC||字符。
具体用法是:
在显示空白或回车,换行符前用指令
pushdx把dl的内容保存到堆栈中去。
在显示空白或回车,换行符后用指令
popdx恢复dl寄存器的原始内容。
五.选作题目:
设有50个从1开始连续的数,编程序统计它们的偶数和,最后将结果放在名字为sum的字存储单中。
六、重点和难点:
1.程序编程用到双重循环,显示一行字符是内循环;
最后结果显示15行,显示15行用到外循环。
2.显示回车(asc||为0dh)和换行符(asc||为0ah),最好先回车(asc||为0dh)再换行符(asc||为0ah)不然在显示第二个字符串时可能会把第一个字符串覆盖。
七.程序清单:
codesegment
assumecs:
code
start:
pushds;
压栈
subax,ax;
清零
pushax
movbl,00h;
空白符
movcx,100
movdl,10h;
初始输出10h
movah,02h
int21h;
显示输出第一个
incbl;
空白
incdl;
设置下一个元素
pushdx;
推入堆栈
movdl,20h
显示输出
popdx
cmpbl,10h;
比较确定是否已经输出15行元素
jeline;
若还未完成输出,则跳转至line,继续进行下一行元素的输出
loopdisp
jmpshortexit
line:
pushdx
movdl,0dh;
回车
movdl,0ah;
换行
jmpshortdisp
exit:
ret
codeends
八.注意:
1.系统功能的调用
2.空白符的显示,每行结束时,显示回车(ASC||为0dh)和换行符(ASC||为oah)来结束本行并开始下一行。
实验三循环程序设计2
学会用循环程序设计进行程序编程。
查找匹配字符串SEARCH
三.问题要求:
程序接收用户键入的一个关键字以及一个句子。
如果句子中不包含关键字则显示’nomatch’;
如果句子中包含关键字则显示‘match’,且把该字在句子中的位置用十六进制数显示出来,要求程序的执行过程如下:
enterkeyword:
abc
entersentence:
wearestudyingabc
matchatlocation:
11Hofthesentence
entersentence:
xyz,ok?
nomatch
^c
四.方法说明:
程序可由三部分组成:
(1)输入关键字和一个句子,分别存入相应的缓冲区中,可用功能调用0AH。
(2)在句子中查找关键字。
1.关键字和一个句子中相应字段的比较可使用串比较指令,为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于串指令的使用,这样,相应的寄存器内容也有了确定的含义,如下:
SI寄存器为关键字的指针
DI寄存器为句子中正相比较的字段的指针
CX寄存器存放关键字的字母个数(长度)
2.整个句子和关键字的比较过程可以用一个循环结构来完成。
循环次数为:
(句子长度--关键字长度)+1在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“nomatch”,循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。
(3)输出信息:
用功能调用09h分“找到”或“找不到”两种情况分别显示不同的信息。
在“找到”时,还要求显示出匹配字符串在句子中的位置,在“找到”时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1即是所要的匹配字符串在句子中的位置,可将位置转换为十六进制数从屏幕上显示出来。
00010001
00000001
五.选作题目:
已知在数据区中DATA1和DATA2开始分别存放N个字节数据,请编写一个程序检查两数据块中的数据是否相同,若完全一致,则将标志单元EAG置FFH,否则置0.
六.重点和难点:
(1)输入关键字和一个句子,分别存入相应的缓冲区中
(2)在句子中查找关键字的位置
(3)该关键字在句子中的位置用十六进制数显示出来
七.程序清单:
datasegment
str1db80,?
80dup(?
)
str2db80,?
hlo1db13,10,'
enterketword:
$'
hlo2db13,10,'
entersentence:
mes1db13,10,'
matchatlocation:
mes2db13,10,'
nomatch!
mes3db'
hofthesentence,$'
tabdb'
0123456789abcdef'
dataends
progsegment
prog,ds:
data,es:
data
movax,0
movax,data
movds,ax
moves,ax
next:
leadx,hlo1
movah,9
leadx,str1
movah,10;
803abc===========
leadx,hlo2
leadx,str2
806weare
moval,str2+1
subal,str1+1
incal
movbl,al
movbh,1
leasi,str2+2
movdx,si
cld
movah,1
find:
movsi,dx
leadi,str1+2
movcl,str1+1
repzcmpsb
jzmath
incdx
incbh
decbl
jnzfind
nmth:
leadx,mes2
jmpnext
ret
math:
leadx,mes1
moval,bh
andal,0f0h
movcl,4
shral,cl
movah,0
movsi,ax
movdl,tab[si]
movah,2
moval,bh
andal,0fh
leadx,mes3
progends
1.功能调用0AH的使用。
(句子长度--关键字长度)+1
3.在“找到”时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1即是所要的匹配字符串在句子中的位置,
实验四分支程序设计
在实际应用的程序中,通常遇到根据某一条件是否成立来进行逻辑判断,以便确定程序的下一步执行,这就形成了分支结构程序,在汇编语言程序设计中,分支结构程序设计是一种很重要的程序设计方法.
学会用分支程序设计进行程序编程。
分类统计字符个数
程序接收用户键入的一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字及其它字符分类计数,然后将结果存入以letter、digit和other为名的存储单元中。
四.方法说明:
程序可采用0AH功能调用把键入字符直接送到缓冲区中,然后再逐个取出分类计数,也可采用01H功能调用在接收字符后先分类计数然后再存入缓冲区中。
程序需进入debug运行并查看计数结果。
五.选作题目:
设在变量ADR为起始地址的字节存储单元中存放一组有符号数据,编写程序分别统计
1.正数的个数
2.负数的个数
3.0的个数
(1)按字母、数字及其它字符分类计数
(2)将结果存入以letter、digit和other为名的存储单元中
letterdb0
digitdb0
otherdb0
code,ds:
movletter,0
movdigit,0
movother,0
input:
movah,01h
cmpal,0dh
jzexit
cmpal,'
a'
jbok
z'
jaoth
dkh:
incletter
jmpinput
ok:
cmpal,'
A'
jbhello
Z'
jbdkh
hello:
0'
jboth
9'
incdigit
oth:
incother
exit:
movah,4ch
mainendp
codeends
1.程序如采用0AH功能调用把键入字符直接送到缓冲区中,应逐个取出分类计数
2.如采用01H功能调用,在接收字符后先分类计数然后再存入缓冲区中
3.如程序没有输出,需进入debug运行并查看计数结果
实验五子程序设计
子程序(过程)是程序设计中常用的方法.子程序结构是模块化程序设计的重要工具。
设计子程序主要考虑参数传递的方法,参数传递是主程序和子程序之间的接口。
学会用子程序设计进行程序编程。
查找电话号码phone
三.实验要求:
i.要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分;
ii.程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中;
iii.凡有新的输入后,程序应按人名对电话号码表重新排序;
iv.程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。
nametel
********
四.实验提示:
程序采用子程序结构,主程序的主要部分如下:
.显示提示符‘inputname:
’;
.调用子程序input_name接收人名;
.调用子程序stor_name把人名存入电话号码表tel_tab中;
.显示提示符‘inputatelephonenumber:
.调用子程序inphone接收电话号码,并把它存入电话号码表tel_tab中;
.如输入已结束则调用name_sort子程序对电话号码表按人名排序;
.显示提示符‘DOyouwantatelephonenumber?
(y/n)’;
.回答N则退出程序;
.回答Y则再显示提示符‘name?
.调用子程序input_name接收人名;
.调用子程序name_search在电话号码表中查找所要的电话号码;
.调用子程序printline按要求格式显示人名及电话号码;
.重复查号提示符直至用户不再要求查号为止。
五.选作题目:
编制一程序,要求接收从键盘输入的一个班的学生成绩,并存放于50字的grade数组中,其中grade+i保存学号为i+1的学生的成绩.然后根据grade中的学生成绩,把学生名次填入50字的rank数组中,其中rank+I的内容是学号为I+1学生的名次,再按学号顺序把名次从终端上显示出来.
(1)程序可建立一个存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分;
(2)程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中;
(3)凡有新的输入后,程序应按人名对电话号码表重新排序;
(4)程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上显示出来。
bufnamedb40,?
38dup(0),13,10,'
buftabdb20,?
20dup(0)
hello1db13,10,'
pleaseinputname:
hello2db13,10,'
pleaseinputatlephonenumber:
hello3db13,10,'
[(i..inputdata)\\(f..findtel.)\\(e..exit)]'
'
hellddb13,10,'
nametelphone'
13,10,'
tboverdb13,10,'
tablealreadyover'
tbtopdb?
tbnumdb?
tabledb50dup(20dup(0),8dup(0))
pushds
movtbtop,0
begin:
leadx,hello3
movah,09h
movah,01h
i'
jnzdisp
input:
moval,tbtop
cmpal,50
jnctabov
callinname
callintele
callstore
jmpshortbegin
disp:
f'
jnznext
callfind
e'
tabov:
leadx,tbover
innameprocnear
leadx,hello1
leadx,bufname
movah,10
innameendp
inteleprocnear
leadx,hello2
leadx,buftab
inteleendp
storeprocnear
pushcx
pushsi
pushdi
movah,tbtop
moval,28
mulah
leadi,table
adddi,ax
leasi,bufname+2
movcl,bufname+1
movch,0
repmovsb
popdi
adddi,20
leasi,buftab+2
movcl,buftab+1
inctbtop
popsi
popcx
storeendp
findprocnear
pushbx
movtbnum,al
leasi,table
movbx,si
finds:
leadi,bufname+2
movsi,bx
jzfinde
addbx,28
jmpfinds
finde:
leadx,helld
movcx,28
leadx,bufname+2
findx:
po