武大微机原理实验报告汇总 4000字word版本 25页.docx

上传人:b****4 文档编号:5440495 上传时间:2022-12-16 格式:DOCX 页数:20 大小:24.27KB
下载 相关 举报
武大微机原理实验报告汇总 4000字word版本 25页.docx_第1页
第1页 / 共20页
武大微机原理实验报告汇总 4000字word版本 25页.docx_第2页
第2页 / 共20页
武大微机原理实验报告汇总 4000字word版本 25页.docx_第3页
第3页 / 共20页
武大微机原理实验报告汇总 4000字word版本 25页.docx_第4页
第4页 / 共20页
武大微机原理实验报告汇总 4000字word版本 25页.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

武大微机原理实验报告汇总 4000字word版本 25页.docx

《武大微机原理实验报告汇总 4000字word版本 25页.docx》由会员分享,可在线阅读,更多相关《武大微机原理实验报告汇总 4000字word版本 25页.docx(20页珍藏版)》请在冰豆网上搜索。

武大微机原理实验报告汇总 4000字word版本 25页.docx

武大微机原理实验报告汇总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,

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

当前位置:首页 > 解决方案 > 学习计划

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

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