武大微机原理实验报告汇总 4000字word版本 25页.docx
- 文档编号:5440495
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:20
- 大小:24.27KB
武大微机原理实验报告汇总 4000字word版本 25页.docx
《武大微机原理实验报告汇总 4000字word版本 25页.docx》由会员分享,可在线阅读,更多相关《武大微机原理实验报告汇总 4000字word版本 25页.docx(20页珍藏版)》请在冰豆网上搜索。
武大微机原理实验报告汇总4000字word版本25页
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!
==本文为word格式,下载后可方便编辑和修改!
==
武大微机原理实验报告汇总(4000字)
微型计算机原理与接口技术
实验报告
【实验名称】汇编语言程序的编辑与调试【实验目的】
学习汇编源程序的编辑、编译、链接、执行全过程。
学习编辑文件、TASM、TLINK的使用方法以及汇编语言的语法规则。
学习使用TD对程序进行调试的方法。
【实验步骤】
1、将程序1输入并存储为hello.asm文件2、编译与链接
首先对源代码进行编译,指令为:
C:
>TASMHELLO/zi生成HELLO.OBJ编译如果报错,需要回到编辑窗口修改源代码,存盘后重新编译编译成功后,链接生成可执行文件
C:
>TLINKHELLO/v/3生成HELLO.EXE3、启动调试工具TD(TurboDebugger)
键入:
C:
>TDHELLO
成功启动TD之后,TD进入MODULE显示模式,屏幕上显示HELLO-ASM源程序,一个三角形符号指示出了标号为BEG的那条指令是启动指令。
4、动态调试(按照以下的步骤学习掌握TD的用法)
(1)连续执行程序
按F9键(即Run|Run),即可从BEG开始连续执行程序。
(2)查看执行结果
按Alt+F5键(即Window|Userscreen),临时切换到DOS屏幕,可查看程序的执行结果,即5行HELLO。
注意:
Alt键要多按一会儿,直到快捷键提示区更换提示内容之后再按F5键。
按任意键可以恢复MODULE窗口内容。
(3)使光标重新指向启动指令
当程序运行结束(三角形光标消失),按Ctr1+F2(Run|Programrest)可以重新装入程序并使光标指向启动指令。
(4)程序的单步执行
单步操作一次仅执行了一条指令,有3个单步操作命令,它们的区别仅在于"跟踪"的情况不同。
①F8(Run|Stepover)单步操作。
执行CALL和INTn指令的时候,"不跟踪"相关的子
程序。
"不眼踪"的含义是指在进入相关子程序后,自动地连续执行子程序指令直到返回。
所以,宏观上看不到跟踪的效果。
②F7(Run|Traceinto)单步操作。
执行CALL指令能够跟踪子程序,随即暂停,等待用
户的下一步操作。
但是在遇到INTn指令时与F8一样,进入服务程序后立即自动地连续执行服务程序直到返回。
③Alt+F7(Run|Instructiontrace)单步操作。
真正意义上的单步操作,执行CALL和INTn
指令进入相关子程序之后立即停止,等待用户的下一步操作。
实践证明:
用Alt+F7跟进服务程序以后,如果再执行单步操作,很容易使系统瘫痪。
因此,请读者慎用。
编者认为:
Alt+F7的用途在于跟进中断服务程序以后,可以了解服务程序的结构,如果服务程序是系统设计的(如INT21H,INT10H等),应当用F8操作。
(5)断点的设置和取消
按↑、↓键,使光标指向欲设置断点的指令,再按F2键(Breakpoints|Toggle),则红色光条覆盖光标处的指令,表示断点设置成功,重复上述操作,可以设置多个断点。
将光标移到红色光条覆盖的指令,再次按下F2键,红色光条消失,表明此处断点撤销。
设置断点的目的是使程序执行到断点指令时暂停,以便检查执行结果。
(6)检查单步执行结果
指令执行后一定会使目标寄存器和状态标志发生变化,欲查看执行效果,怎么办?
①在CPU窗口调试时
因为窗口中有寄存器、标志寄存器显示窗口,所以,当前指令执行后,可以从相关的显示窗口中看到结果。
②在MODULE窗口调试时
选中View|Registers可弹出寄存器和标志寄存器显示窗口,就可以查看执行结果。
(7)检查内存数据区的内容
如果被调试程序要对数据段或附加段进行操作,怎样检查结果?
关键问题是要找出用户程序的数据段或附加段。
以例题1为例,说明这一操作的实现过程。
①如果调试是在MODULE窗口进行
首先选择View|Dump,弹出内存数据显示窗口,接着再按Ctrl+S弹出一个对话框,
用户键入’HELLO’—--用单引号括起来的这一字符串是例1用户数据段中设置的内容,TD根据用户的提示立即找出并显示用户程序数据区。
做好以上准备工作之后,按F8键单步执行指令,就可以看到用户数据段内容的变化。
例1中的语句①~⑧就是为此项调试而设置的。
②如果调试是在CPU窗口进行
首先按Tab键,使内存数据显示区成为活动区,接下来的工作则与在MODULE窗口的调试是相同的。
5、程序修改
下面的程序采用比较法,将一个8位二进制数转换成十进制数显示,其设计方法拙劣,语法错误很多,希望以它为蓝本,练习源程序的编辑、编译、链接和调试。
同学应照原样编辑源程序,汇编之后,必定给出若干错误信息,再根据错误提示,修改源程序,直到汇编后没有错误时为止,然后进行链接、执行。
正确的执行结果是在屏幕上显示:
100+9=109
【程序流程图】1,程序一
2,程序二
【源程序】1,程序一
DATAMESG
DATACODE
BEG:
LL1:
SEGMENTDB‘HELLO’DB
0,0,0
;①
ENDSSEGMENT
USE16ASSUMECS:
CODE,DS:
DATA
MOVAX,DATAMOVDS,AXMOVES,AX
;②
MOV
CX,5
MOVMESG+5,0DH
;③MOVMESG+6,0AH;④MOVMESG+7,'$'
;⑤
CALL
DISP
MOVMESG+5,0MOVMESG+6,0MOVMESG+7,0
LOOPLL1MOVAH,4CHINT
21H
DISP
PROCMOVAH,9
MOVDX,OFFSETMESGINT21H
RET
DISPENDPCODE
ENDSEND
BEG
2,程序二
DATASEGMENTN1DW0809H,ABN2DB100
SUNDB?
MESGDB‘100+9='DB30H,30H,30H
DATAENDSCODE
SEGMENT
ASSUMECS:
CODE,DS:
DATA
BEG:
MOVDS,DATA
MOVBX,OFFSETSUM
MOVAH,N1MOVAL,N2
ADDAH,ALMOV[BX],AH
CALL
N2_10MOVAH,9
MOVDX,OFFSETMESGINT21HMOVAH,4CH
INT
21HN2_10PROC
LAST:
CMP[BX],100JC
NEXT1SUB[BX],100
INC
[BX+7]
;⑥;⑦
;⑧
;此处应为N1DB9;输入错误,SUN与后段代码SUM不一致;应加上$以提示信息结束
;MOV指令不允许将立即数直接送给段寄存器
;AH为八位,BX为十六位寄存器,寄存位置不明
;错误同上
;错误同上
;错误同上
JC
[BX],10
;错误同上;错误同上;错误同上;错误同上
NEXT2[BX+8]NEXT1[BX+9],SUM
;源操作数和目的操作数不能同时为存储器
NEXT1:
CMPSUBINCJMP
NEXT2:
N2_10:
CODE
ADDRET
[BX],10
ENDP;此处无需冒号ENDSEND
BEG
【实验结果与分析】
程序二中错误代码出现在第2、4、6、10、15、23、25、26、28、30、31、33、35行。
错误原因已附在各行末尾,修改后的代码如下:
DATAN1N2SUMMESGDATACODEBEG:
SEGMENTDBDBDBDBDBENDSSEGMENT
ASSUMECS:
CODE,DS:
DATAMOVMOVMOVMOVADDMOVCALLMOVMOVINTMOVINT
N2_10LAST:
PROCCMPJC
SUBINCJMP
NEXT1:
CMPJC
AX,DATADS,AXAH,N1AL,N2AH,AL
BYTEPTR[BX],AHN2_10AH,9
DX,OFFSETMESG
21H21H
AH,4CH
;
BX,OFFSETSUM
MOV
9100
?
‘100+9='
30H,30H,30H,’$’
BYTEPTR[BX],100NEXT1
BYTEPTR[BX],100BYTEPTR[BX+7]LAST
BYTEPTR[BX],10NEXT2
INCJMP
NEXT2:
ADDRET
N2_10CODE
ENDPENDSEND
BYTEPTR[BX+8]NEXT1
BYTEPTR[BX+9],AL
MOVAL,SUM
BEG
【实验名称】顺序程序设计
【实验目的】
学习汇编语言基本操作指令和伪指令的应用;了解编程的基本方法。
【实验内容】
【实验1】编写程序,计算(a+b)–2*(aANDb),结果送入S单元。
S单元的内容在TD里面观察,在实验报告附上运行完毕后所有通用寄存器及段寄存器的值。
【实验2】定义一个双字变量VOLUME,从键盘输入长方体的长(a),宽(b)和高(h),计算它的体积,a,b,c均为单字节变量,结果保存在VOLUME中(注意判断溢出)。
要求:
①上述实验中的各变量单元要在数据区定义;②用TD(或debug)调试,运行并修改各变量的值,观察结果存放单元。
【程序框图】
【实验1】【实验2】
【程序代码】
【实验1】
DATASEGMENTADB40BDB50SDB?
DATAENDSCODESEGMENT
ASSUMECS:
CODE,DS:
DATABEG:
MOVAX,DATAMOVDS,AXMOVBL,AADDBL,BMOVBH,0ADCBH,0MOVAL,AANDAL,BMOVCL,2MULCL
SUBBX,AXMOVS,BXMOVAH,4CHINT21HCODEENDS
ENDBEG
【实验2】
DATASEGMENTADB?
BDB?
CDB?
VOLUMEDD?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATABEG:
MOVAX,DATAMOVDS,AXMOVAH,1INT21HSUBAL,30HMOVA,ALMOVAH,1INT21HSUBAL,30HMOVB,AL
MOVAH,1INT21HSUBAL,30HMOVC,ALMOVBL,BMULBLMOVBL,AMOVBH,0MULBX
MOVWORDPTRVOLUME,AXMOVWORDPTRVOLUME+2,DXMOVAH,4CHINT21HCODEENDS
ENDBEG【实验结果】
【实验1】:
程序运行后,运行结果S=26H,与预期相符。
所有通用寄存器即段寄存器的值如下:
AX=1B6FBX=000FCX=0206DX=3002DS=04BACS=0000【实验2】:
程序运行时,取a=4,b=5,c=6,运行后,VOLUME=120,与预期相符所有通用寄存器即段寄存器的值如下:
AX=1B6FBX=000FCX=0206DX=3002DS=04BACS=0000
【实验名称】循环实验的设计
【实验目的】学习并掌握循环程序的设计方法。
【实验内容】
【实验1】用表格形式显示ASCII字符。
实验要求:
按15行×16列的表格形式显示ASCII码为10H-100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。
提示:
(1)显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下:
movah,02h
movdl,输出字符的ASCII码int21h
本题中可把DI初始化为10H,然后不断使其加1(用INC指令)以取得下一个字符时ASCII码。
(2)显示空白符时,用其ASCII码0置入DI寄存器。
每行结束时,用显示回车(ASCII为0dh)和换行符(ASCII为0ah)来结束本行并开始下一行。
(3)由于逐个显示相继的ASCII字符时,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用DI寄存器,为此可使用堆找来保存相继的ASCII字符。
具体用法是:
在显示空白或回车、换行符前用指令
pushdx
把DI的内容保存到堆栈中去。
在显示空白或回车、换行符后用指令
popdx
恢复DI寄存器的原始内容。
【实验2】编程计算:
S=1+2+3+…+N≤100的最大项数N以及对应的和S。
实验要求:
①将最大项数与和数分别存入N和SUM单元,用TD调试,运行程序并检查结果;②将结果在屏幕上以16进制数显示。
显示格式:
MAXN=××HSUM=××H。
【程序框图】
【实验1】【实验2】
【实验1】
【程序代码】
CODESEGMENTMAINPROCFAR
ASSUMECS:
CODEBEG:
MOVAH,02H
MOVDL,10H;设置初始输出为ASCII的10hMOVBL,15;输出显示为15行E:
MOVCX,16;设置循环次数,16,表示输出显示为16列l:
INT21H;显示输出PUSHDX;推入堆栈MOVAH,02HMOVDL,0INT21H
MOVAH,02HMOVDL,0
INT21H;显示空白符
POPDX;将栈顶元素推出INCDL;设置下一个元素
LOOPl;循环输出每行的16个ASCII元素PUSHDX;将下一行的首元素推入堆栈MOVAH,02HMOVDL,0DHINT21H
MOVAH,02HMOVDL,0AH
INT21H;输出换行
POPDX;将栈顶元素推出DECBL
CMPBL,0;比较确定是否已经输出15行元素
JNEE;若还未完成输出,则跳转至e,继续进行下一行元素的输出
JEEXIT;否则退出程序EXIT:
MOVAX,4C00HINT21HMAINENDPCODEENDS
ENDBEG
【实验2】
DATASEGMENT
NDB'?
';开辟一个字节单元SUMDB'?
'
MESG1DB'MAXN=','$'MESG2DB'SUM=','$'DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA;段分配
BEG:
MOVAX,DATA;段基址→DSMOVDS,AX
MOVMOVL1:
INCADDCMPJBESUBMOVMOVMOVMOVINTMOVANDRORCMPJLADDNEXT:
ADDMOVMOVINTMOVANDCMPJLADDNEXT1:
ADDOVMOVINTMOVINTMOVMOVBL,0H;给BL和AL赋初始值0AL,0HBLAL,BLAL,64H
L1;无符号数<=跳转
AL,BL;所得AL大于100,故要减去BL[N],BL;最大项数→N单元[SUM],AL;和数→SUM单元AH,9;9号功能调用,输出字符串DX,OFFSETMESG121H
AL,N;2号功能调用,输出两个空格AL,0F0H;屏蔽低四位AL,4;右移4位AL,10;与10比较NEXT;小于跳转NEXTAL,7;否则加7AL,30H
AH,02HDL,AL21HAL,N
AL,0FH;屏蔽高4位AL,10NEXT1
AL,7AL,30HAH,02HDL,AL21H
DL,'H';显示出H21H
AH,02HDL,0DH
INT21H;回车MOVAH,02HMOVDL,0AH
INT21H;换行
MOVAH,9;9号功能调用,输出字符串MOVDX,OFFSETMESG2INT21H
ANDAL,0F0H;屏蔽低四位RORAL,4;右移4位CMPAL,10JLNEXT2ADDAL,7NEXT2:
ADDAL,30H
MOVAH,02HMOVDL,ALINT21HMOVAL,SUM
ANDAL,0FHJLNEXT3
ADDAL,7NEXT3:
ADDAL,30HMOVAH,02HMOVDL,ALINT21H
MOVDL,'H'INT21H
MOVAH,4CHINT21HCODEENDSENDBEG
【实验1】
实验一运行后显示结果为
;与10比较;小于跳转NEXT;否则加7;屏蔽高4位;显示出H;返回DOS操作系统
【调试结果】
与预期相符【实验2】
实验二运行后结果为“MAX=0DHSUM=5BH”,与预期相符。
【实验名称】分支程序设计
【实验目的】
学习分支程序的结构,掌握具有分支结构程序的设计方法。
【实验内容】
【实验1】分类统计字符个数COUNT_CHAR。
【实验2】显示月份名direct。
试编写一程序,根据用户键入的月份数在屏上显示该月份的英文缩写名
【程序代码及框图】
【实验1】DATASEGMENTSTRINGLABELBYTEMAXDB80ACTDB'?
'
STOKNDB80DUP('?
')DIGITDB0LETTERDB0OTHERDB0
MESS1DB'PLEASEINPUTCHARS:
',0DH,0AH,'$'MESS2DB0DH,0AH,'$'MESS3DB'DIGIT:
',0H,'$'MESS4DB'LETTER:
',0H,'$'MESS5DB
'OTHER:
',0H,'$'
MESS6DB'H',0DH,0AH,'$'NDB3DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATACOUNT_CHARPROCFARPUSHDSSUBAX,AXPUSHAX
MOVAX,DATAMOVDS,AXLEADX,MESS1MOVAH,09INT21H
LEADX,STRINGMOVAH,0AHINT21H
LEADX,MESS2MOVAH,09HINT21H
LEASI,STOKNSUBCH,CHMOVCL,ACTAGAIN:
MOVAL,[SI]CMPAL,30HJLOTHER1CMPAL,3AHJLDIGIT1CMPAL,41HJLOTHER1CMPAL,5BHJLLETTER1CMPAL,61HJLOTHER1CMPAL,7BHJLLETTER1
OTHER1:
INCOTHERINCSI
LOOPAGAINJMPPRINTDIGIT1:
INCDIGITINCSI
LOOPAGAINJMPPRINT
LETTER1:
INCLETTERINCSI
LOOPAGAINPRINT:
MOVCH,2MOVBL,DIGITLEADX,MESS3MOVAH,09INT21HROTATE:
MOVCL,4ROLBL,CLMOVAL,BLANDAL,0FHADDAL,30HCMPAL,3AHJLPRINT1ADDAL,7HPRINT1:
MOVDL,ALMOVAH,2INT21HDECCHJNZROTATELEADX,MESS6MOVAH,09INT21HDECNCMPN,2JZLETTER2CMPN,1JZOTHER2JMPEXIT
LETTER2:
LEADX,MESS4MOVAH,09INT21HMOVCH,2
MOVBL,LETTERJMPROTATEOTHER2:
LEADX,MESS5MOVAH,09INT21HMOVCH,2
MOVBL,OTHERJMPROTATEEXIT:
RET
COUNT_CHARENDPCODEENDS
ENDCOUNT_CHAR
【实验2】DATASEGMENT
MESG1DB'PLEASEINPUTTHENUMBERFORMONTH',0DH,0AH,'$'MESG2DB'ERROR!
',0DH,0AH,'$'
NUMDB3COUNTDB?
STOREDB2DUP(?
)MONTABDB'JAN','FEB','MAR','APR','MAY','JUN'DB'JUL','AUG','SEP','OCT','NOV','DEC'
MONTHDB3DUP(?
),0DH,0AH,'$'DATAENDS
CODESEGMENTASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATA
MOVDS,AXMOVES,AXMOVDX,OFFSETMESG1MOVAH,09HINT21H
MOVDX,OFFSETNUMMOVAH,0AHINT21H
CMP[COUNT],0JZEXITCMP[COUNT],2JZNEXT
MOVAL,[STORE]
XORAL,30HMOVAH,0JMPGOON
NEXT:
MOVAH,[STORE]MOVAL,[STORE+1]
XORAX,3030HCMPAH,0
JZGOONCMPAH,1
JNZLASTSUBAH,AHADDAL,10GOON:
CMPAL,0
JZLASTCMPAL,12JALASTDECALMOVBL,3
MULBLLEASI,MONTABADDSI,AXLEADI,MONTHMOVCX,3
CLDREPMOVSB
DISP:
MOVDX,OFFSETMONTHMOVAH,09HINT21H
JMPSTARTLAST:
MOVDX,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武大微机原理实验报告汇总 4000字word版本 25页 微机 原理 实验 报告 汇总 4000 word 版本 25