东南大学微机实验报告2带流程图.docx
《东南大学微机实验报告2带流程图.docx》由会员分享,可在线阅读,更多相关《东南大学微机实验报告2带流程图.docx(20页珍藏版)》请在冰豆网上搜索。
东南大学微机实验报告2带流程图
《微机实验及课程设计》
实验报告
实验二汇编语言程序设计
姓名:
谢雨蒙学号:
22011209
专业:
仪器科学与工程学院实验室:
金智楼416
实验时间:
2013年04月24日报告时间:
2013年04月24日
评定成绩:
审阅教师:
一、实验目的
1、近一步熟悉汇编语言的编辑、宏汇编、链接和运行的基本概念
2、熟练掌握动态调试程序TD/DEBUG的常用指令和窗口功能,学会用TD/DEBUG调试程序,修改数据和寄存器环境
3、熟悉掌握汇编语言程序的典型数据结构设计、典型程序控制方法,了解DOS/BIOS功能调用的基本方法
二、实验内容
1、必做内容
(1)从键盘输入任意字符串后,存入自定义存储单元,判断处理后将字符串中小写字母转换为大写字母(其它字符不变),并按原顺序将这些字符在屏幕上显示出来(参考程序P36),并显示字符串“ThetotalnumberisXXXXX”。
(2)从键盘输入一个0~255之间的十进制数,将其转换为16进制数,并在屏幕上显示变换前后的数据(参考程序P38)。
2、选做内容
(1)从键盘输入5个十六进制带符号数(范围为-128~+127),请将它们按从大到小排序,并将排序前后的数据显示在屏幕上。
三、实验原理
1、实验基本步骤
(1)用任意一种文本编辑器(EDIT、NOTEPAD、UltraEDIT等)建立编辑汇编源程序,并将其保存为文件名.asm文件,将其放入带汇编工具的文件夹中(d:
\tasm)。
注:
文件名不要起的过长,在连接时可能会出现can’tfindfile的问题。
(2)开始菜单,点运行条目,打入cmd命令进入DOS调试环境。
(3)进入该文件夹(cdd:
\tasm),键入如下命令开始编辑程序:
d:
\zxj>edit文件名.asm
(4)将程序保存后返回DOS进行汇编,键入如下命令:
d:
\zxj>tasm文件名.asm
如果汇编通过,进行下一步,如果出现error,返回3步骤,根据错误的行数进行修改,然后重新汇编,直到不产生error为止。
此时若出现warning可不予理会。
(5)将程序进行连接,键入如下命令:
d:
\zxj>link文件名.obj
如果连接正确,进行下一步,如果错误返回3步骤进行修改,然后重新编译和连接。
(6)执行程序,键入如下命令:
d:
\zxj>文件名.exe
如果执行正确,则应该显示正确结果;如果执行错误,返回步骤3,重新编译连接和执行。
(7)如果不能直接从程序中找出错误,可以应用Debug程序进行调试,键入如下命令:
d:
\zxj>td文件名.exe
在找出错误后,重新返回3步骤,重新编译连接和执行。
2、实验相关操作界面
(1)TD操作界面
四、实验源程序和流程图:
1、实验1:
流程图:
源代码:
DATASEGMENT
INPUTDB100,100DUP(0)
STRING1DB0DH,0AH,'PLEASEINPUTYOURSTRING',0DH,0AH,'$'
STRING2DB0DH,0AH,'THESTRINGYOUINPUTIS:
',0DH,0AH,'$'
STRING3DB0DH,0AH,'DOYOUWANTTOCONTINUE(Y/N):
',0DH,0AH,'$'
STRING4DB0DH,0AH,'THETOTALNUMBERIS:
',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:
MOVDX,OFFSETSTRING1
MOVAH,09H
INT21H
MOVDX,OFFSETINPUT
MOVAH,0AH
INT21H
MOVDX,OFFSETSTRING2
MOVAH,09H
INT21H
CALLDISP
MOVDX,OFFSETSTRING4
MOVAH,09H
INT21H
ADDBL,30H
MOVDL,BL
MOVAH,02H
INT21H
MOVDX,OFFSETSTRING3
MOVAH,09H
INT21H
MOVAH,01H
INT21H
CMPAL,'Y'
JZLOOP1
MOVAH,4CH
INT21H
MAINENDP
DISPPROCNEAR
XORCX,CX
MOVCL,INPUT[1]
MOVBL,INPUT[1]
MOVSI,2
AGAIN:
MOVDL,INPUT[SI]
CMPDL,61H
JBNEXT
CMPDL,7AH
JANEXT
SUBDL,20H
NEXT:
MOVAH,02H
INT21H
INCSI
LOOPAGAIN
RET
DISPENDP
CODEENDS
ENDSTART
2、实验2:
流程图:
源代码:
DATASEGMENT
INPUTDB100,100DUP(0)
STRING1DB0DH,0AH,'PLEASEINPUTYOURSTRING',0DH,0AH,'$'
STRING2DB0DH,0AH,'THESTRINGYOUINPUTIS:
',0DH,0AH,'$'
STRING3DB0DH,0AH,'DOYOUWANTTOCONTINUE(Y/N):
',0DH,0AH,'$'
STRING4DB0DH,0AH,'THETOTALNUMBERIS:
',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:
MOVDX,OFFSETSTRING1
MOVAH,09H
INT21H
MOVDX,OFFSETINPUT
MOVAH,0AH
INT21H
MOVDX,OFFSETSTRING2
MOVAH,09H
INT21H
CALLDISP
MOVDX,OFFSETSTRING4
MOVAH,09H
INT21H
ADDBL,30H
MOVDL,BL
MOVAH,02H
INT21H
MOVDX,OFFSETSTRING3
MOVAH,09H
INT21H
MOVAH,01H
INT21H
CMPAL,'Y'
JZLOOP1
MOVAH,4CH
INT21H
MAINENDP
DISPPROCNEAR
XORCX,CX
MOVCL,INPUT[1]
MOVBL,INPUT[1]
MOVSI,2
AGAIN:
MOVDL,INPUT[SI]
CMPDL,61H
JBNEXT
CMPDL,7AH
JANEXT
SUBDL,20H
NEXT:
MOVAH,02H
INT21H
INCSI
LOOPAGAIN
RET
DISPENDP
CODEENDS
ENDSTART
3、实验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
loopQ:
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:
jmploopQ;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
cmpal,'Y'
jzloop1
movah,4ch
int21h
mainendp
showinprocnear
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、实验1:
2、实验2:
3、实验3:
六、遇到的问题及解决办法
1、在写代码的过程中遇到过很多问题
(1)在编程时忘记了add的两个操作数要同时为十六位符号数或八位符号数这个规则,因此在编译的时候出现了问题
(2)三个程序代码都是自己先写,然后再跟书上或网上的demo进行比较修改,在这个过程中发现熟悉一些指令可以让代码简单很多,譬如说lodsb、stosb、xor等等,在自己写的时候很难想到去用,因此对各种指令有一定的熟悉程度还是很必要的。