东南大学微机实验报告二.docx
- 文档编号:13199415
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:22
- 大小:201.61KB
东南大学微机实验报告二.docx
《东南大学微机实验报告二.docx》由会员分享,可在线阅读,更多相关《东南大学微机实验报告二.docx(22页珍藏版)》请在冰点文库上搜索。
东南大学微机实验报告二
东南大学
《微机实验及课程设计》
实验报告
实验二、汇编语言程序设计
姓名:
学号:
专业:
实验室
评定成绩:
审阅教师:
实验目的:
进一步熟悉汇编语言的编辑、宏汇编、链接和运行的基本概念
熟练掌握动态调试程序TD/DEBUG的常用指令和窗口功能,学会用TD/DEBUG调试程序,修改数据和寄存器环境
熟悉掌握汇编语言程序的典型数据结构设计、典型程序控制方法,了解DOS/BIOS功能调用的基本方法
实验内容:
基本操作内容:
(1)、掌握进入全屏命令行方式、修改环境的方法启动开始菜单里的运行选项,键入cmd,即可启动命令行方式,在其属性栏中选择全屏即可进入全屏命令行方式。
(2)、确定源程序的存放目录,构建个人实验环境。
(3)、建立、编辑汇编源程序
选择程序样本,构建典型的汇编程序框架,包括基本的数据段、堆栈段和代码段,编写程序实现如下功能:
必做:
2-1.从键盘输入任意字符串后,存入自定义存储单元,判断处理后将字符串中小写字母转换为大写字母(其它字符不变),并按原顺序将这些字符在屏幕上显示出来(参考程序P36),并显示字符串“ThetotalnumberisXXXXX”。
2-2.从键盘输入一个0~255之间的十进制数,将其转换为16进制数,并在屏幕上显示变换前后的数据(参考程序P38)。
选作:
2-3、从键盘输入5个十六进制带符号数(范围为-128~+127),请将它们按从大到小排序,并将排序前后的数据显示在屏幕上。
(4)、用汇编工具(MASM/TASM.EXE)汇编源程序产生OBJ目标文件,将所要变异的源程序文件(文件名.asm)放到带汇编工具的文件夹中,在全屏命令行模式下,进入该文件夹,输入tasm文件名.asm,回车后即可编译产生OBJ目标文件。
(5)、用链接程序(LINK/TLINK.EXE)产生EXE可执行文件,产生OBJ目标文件后,继续输入:
tlink文件名.obj,回车后即可产生EXE可执行文件。
(6)、用调试工具软件(TD.EXE/D)调试执行程序
在Windows中启动TD
a、仅启动TD而不载入要调试的程序
双击TD.EXE文件名,Windows就会打开一个DOS窗口并启动TD。
启动TD后会显示一个版权对话框,这时按回车键即可关掉该对话框。
b、启动TD并同时载入要调试的程序
把要调试的可执行文件拖到TD.EXE文件名上,Windows就会打开一个DOS窗口并启动TD,然后TD会把该可执行文件自动载入内存供用户调试。
若建立可执行文件时未生成符号名表,TD启动后会显示“Programhasnosymboltable”的提示窗口,这是按回车键即可关掉该窗口。
观察CPU寄存器、存储器环境
TD启动后呈现的是一个具有窗口形式的用户界面,称为CPU窗口。
单步、断点运行,观察中间结果,完成正常执行。
TD功能键F7为跟踪进入(对CALL指令将跟踪进入子程序),F8为单步跟踪(对CALL指令将执行完子程序返回后才停下),F2为在当前光标处设置、清除断点。
通过单步、断点运行中观察数据区、各个寄存器值的变化,以验证程序运行是否正确。
修改当前运行环境,直接编写程序片段,验证指令功能。
a、修改寄存器(AX、BX、CX、DX、SI、DI、BP、SP),并观察修改段寄存器。
b、修改存储器,并指定不同存储段。
c、修改CS:
IP,单步运行制定指令(F7或F8),观察指令运行结果。
d、将光标放置在TD窗口的代码区右击,可显示代码区的局部菜单,选择相应功能进行操作。
重点解决段存储结构和数据变量的定义和访问。
访问数据段中具体位置的值时,可将光标放置在数据区,右击产生数据区菜单。
实验原理:
实验源程序(主要部分)和流程图:
2-1:
datasegment
inputdb100,100dup(0)
string1db0dh,0ah,'pleaseinputyourstrings',0dh,0ah,'$'
string2db0dh,0ah,'thestringsyouinputare:
',0dh,0ah,'$'
string3db0dh,0ah,'doyouwanttocontinue(y/n):
',0dh,0ah,'$'
string4db0dh,0ah,'thetotalnumeris:
',0dh,0ah,'$'
numberdb00h
dataends
stackssegmentstack
db256dup(0)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
mainprocfar
start:
movax,data
movds,ax
loop1:
movdx,offsetstring1
movah,09h
int21h
movdx,offsetinput
movah,0ah
int21h
movdx,offsetstring2
movah,09h
int21h
moval,input[1]
movnumber,al
calldisp
movdx,offsetstring4
movah,09h
int21h
callshow
movdx,offsetstring3
movah,09h
int21h
movah,01h
int21h
cmpal,'y'
jzloop1
movah,4ch
int21h
mainendp
dispprocnear
xorcx,cx
movcl,input[1]
movsi,2
again:
movdl,input[si]
cmpdl,61h
jbnext
cmpdl,7ah
janext
subdl,20h
next:
movah,02h
int21h
incsi
loopagain
ret
dispendp
showprocnear
moval,number
movah,0h
movcl,0ah
divcl
addal,30h
addah,30h
movch,ah
movdl,al
movah,02h
int21h
movdl,ch
movah,02h
int21h
ret
showendp
codeends
endstart
2-2:
datasegment
rightdb1
inputdb4,5dup(0)
outputdb00h
tendb0ah
string1db0dh,0ah,'pleaseinputyournumber(0~255)',0dh,0ah,'$'
string2db0dh,0ah,'thenumberyouinputis(00h~ffh):
',0dh,0ah,'$'
string3db0dh,0ah,'doyouwanttocontinue(y/n):
',0dh,0ah,'$'
string4db0dh,0ah,'thenumberyouinputisnotfrom0~255',0dh,0ah,'$'
string5db0dh,0ah,'thenumberyouinputis(0~255):
',0dh,0ah,'$'
dataends
stackssegmentstack
db256dup(0)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
mainprocfar
start:
movax,data
movds,ax
movax,stacks
movss,ax
loop1:
movoutput,00h
movdx,offsetstring1
movah,09h
int21h
movdx,offsetinput
movah,0ah
int21h
movright,1
movdx,offsetstring5
movah,09h
int21h
callshowin
callchange
cmpright,0
jzerror
movdx,offsetstring2
movah,09h
int21h
movah,output
movdl,ah
movcl,4
shrdl,cl
calldisp
movdl,ah
anddl,0fh
calldisp
movdl,48h
movah,02h
int21h
jmpgo
error:
movdx,offsetstring4
movah,09h
int21h
go:
movdx,offsetstring3
movah,09h
int21h
movah,1
int21h
cmpal,'y'
jzloop1
cmpal,'Y'
jzloop1
movah,4ch
int21h
mainendp
changeprocnear
clc
xorax,ax
xorbx,bx
xordx,dx
movcl,input[1]
movsi,2
again:
movbl,input[si]
cmpbl,30h
jberror1
cmpbl,39h
jaerror1
subbl,30h
deccl
cmpcl,0
jzover
movax,1
pushcx
loop2:
multen
looploop2
popcx
mulbx
addoutput,al
jcerror
incsi
jmpagain
over:
addoutput,bl
jncover1
error1:
movright,0
over1:
ret
changeendp
dispprocnear
pushdx
pushax
cmpdl,9
jbenum
adddl,7
num:
adddl,30h
movah,02h
int21h
popax
popdx
ret
dispendp
showinprocnear
clc
xorax,ax
xorbx,bx
xordx,dx
movcl,input[1]
movsi,2
again1:
movdl,input[si]
cmpdl,30h
jberror2
cmpdl,39h
jaerror2
movah,02h
int21h
incsi
deccl
cmpcl,0
jnzagain1
jmpover2
error2:
movright,0
over2:
ret
showinendp
codeends
endstart
2-3:
datasegment
input1db4,5dup(0)
input2db4,5dup(0)
input3db4,5dup(0)
input4db4,5dup(0)
input5db4,5dup(0)
tempdb00h,00h
tempoutdb00h
outputdb00h,00h,00h,00h,00h
string1db0dh,0ah,'pleaseinputyournumber(00h~ffh):
',0dh,0ah,'$'
string2db0dh,0ah,'thenumberyouinputis(00h~ffh):
',0dh,0ah,'$'
string3db0dh,0ah,'thenumberafterorderingis(00h~ffh):
',0dh,0ah,'$'
string4db0dh,0ah,'doyouwanttocontinue(y/n):
',0dh,0ah,'$'
dataends
stackssegmentstack
db256dup(0)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
mainprocfar
start:
movax,data
movds,ax
movax,stacks
movss,ax
loop:
movdx,offsetstring1
movah,09h
int21h
movdx,offsetinput1
movah,0ah
int21h
movdx,offsetstring1
movah,09h
int21h
movdx,offsetinput2
movah,0ah
int21h
movdx,offsetstring1
movah,09h
int21h
movdx,offsetinput3
movah,0ah
int21h
movdx,offsetstring1
movah,09h
int21h
movdx,offsetinput4
movah,0ah
int21h
movdx,offsetstring1
movah,09h
int21h
movdx,offsetinput5
movah,0ah
int21h
callshowin
moval,input1[2]
movtemp[0],al
moval,input1[3]
movtemp[1],al
callchange
moval,tempout
movoutput[0],al
moval,input2[2]
movtemp[0],al
moval,input2[3]
movtemp[1],al
callchange
moval,tempout
movoutput[1],al
moval,input3[2]
movtemp[0],al
moval,input3[3]
movtemp[1],al
callchange
moval,tempout
movoutput[2],al
moval,input4[2]
movtemp[0],al
moval,input4[3]
movtemp[1],al
callchange
moval,tempout
movoutput[3],al
jmploop2
loop1:
jmploop;77
loop2:
moval,input5[2]
movtemp[0],al
moval,input5[3]
movtemp[1],al
callchange
moval,tempout
movoutput[4],al
callorder;85
movdx,offsetstring3
movah,09h
int21h
movsi,0
circle:
movah,output[si]
movdl,ah
movcl,4
shrdl,cl
calldisp
movdl,ah
anddl,0fh
calldisp
movdl,48h
movah,02h
int21h
movdl,0h
movah,02h
int21h
incsi
cmpsi,5
jnzcircle
movdx,offsetstring4
movah,09h
int21h
movah,1
int21h
cmpal,'y'
jzloop1;110
cmpal,'Y'
jzloop1;112
movah,4ch
int21h
mainendp
showinprocnear
movdx,offsetstring2
movah,09h
int21h
movsi,2
circle1:
movdl,input1[si]
movah,02h
int21h
incsi
cmpsi,5
jnzcircle1
movdl,0h
movah,02h
int21h
movsi,2
circle2:
movdl,input2[si]
movah,02h
int21h
incsi
cmpsi,5
jnzcircle2
movdl,0h
movah,02h
int21h
movsi,2
circle3:
movdl,input3[si]
movah,02h
int21h
incsi
cmpsi,5
jnzcircle3
movdl,0h
movah,02h
int21h
movsi,2
circle4:
movdl,input4[si]
movah,02h
int21h
incsi
cmpsi,5
jnzcircle4
movdl,0h
movah,02h
int21h
movsi,2
circle5:
movdl,input5[si]
movah,02h
int21h
incsi
cmpsi,5
jnzcircle5
ret
showinendp
changeprocnear
xorax,ax
xorbx,bx
xordx,dx
movbl,temp[0]
cmpbl,40h
jbnext1
subbl,37h
jmpnext
next1:
subbl,30h
next:
movtemp[0],bl
movbl,temp[1]
cmpbl,40h
jbnext2
subbl,37h
jmpnext3
next2:
subbl,30h
next3:
moval,temp[0]
movcl,10h
mulcl
addal,bl
movtempout,al
ret
changeendp
orderprocnear
XORAL,AL
XORBL,BL
movsi,0h
movdi,1h
order1:
moval,output[si]
order2:
cmpal,output[di]
jnlnet
movbl,output[di]
movoutput[si],bl
movoutput[di],al
moval,output[si]
net:
incdi
cmpdi,5
jnzorder2
incsi
movdi,si
incdi
cmpsi,4
jnzorder1
ret
orderendp
dispprocnear
pushdx
pushax
cmpdl,9
jbenum
adddl,7
num:
adddl,30h
movah,02h
int21h
popax
popdx
ret
dispendp
codeends
endstart
实验结果以及遇到的问题和解决办法:
1.得出结果为:
2。
输出结果为:
3.输出结果为:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东南大学 微机 实验 报告