北邮微原软件实验.docx

上传人:b****4 文档编号:4382048 上传时间:2022-12-01 格式:DOCX 页数:26 大小:554.72KB
下载 相关 举报
北邮微原软件实验.docx_第1页
第1页 / 共26页
北邮微原软件实验.docx_第2页
第2页 / 共26页
北邮微原软件实验.docx_第3页
第3页 / 共26页
北邮微原软件实验.docx_第4页
第4页 / 共26页
北邮微原软件实验.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

北邮微原软件实验.docx

《北邮微原软件实验.docx》由会员分享,可在线阅读,更多相关《北邮微原软件实验.docx(26页珍藏版)》请在冰豆网上搜索。

北邮微原软件实验.docx

北邮微原软件实验

 

微机原理软件实验报告

 

 

学院:

信息与通信工程学院

班级:

学生姓名:

学号:

实验一DEBUG的使用

实验目的

1.掌握汇编程序的编辑,编译,连接和执行的全过程;

2.学习和掌握用DEBUG调试程序的方法.

实验任务及内容及对应操作

1.用编辑软件,输入以下汇编语言源程序:

DATSEGMENT

ADB20;(自定)

BDB15;(自定)

YDB3DUP(0)

ZDB0,0

DATENDS

STASEGMENTSTACK

DW50DUP(?

STAENDS

CODSEGMENT

ASSUMECS:

COD,DS:

DAT

STARPROCFAR

PUSHDS

XORAX,AX

PUSHAX

MOVAX,DAT

MOVDS,AX

MOVAX,STA

MOVSS,AX

MOVAL,A

MOVZ,AL

MOVZ+1,AL

CALLSUB1

MOVAL,B

MOVZ,AL

MOVZ+1,AL

CALLSUB1

MOVAL,A

MOVZ,AL

MOVAL,B

MOVZ+1,AL

CALLSUB1

ADDWORDPTRY,AX

ADCBYTEPTR[Y+2],0

RET

STARENDP

SUB1PROC

MOVAL,Z

MOVAH,Z+1

MULAH

ADDWORDPTRY,AX

ADCBYTEPTR[Y+2],0

RET

SUB1ENDP

CODENDS

ENDSTAR

2.通过编译,连接形成可执行文件.

3.用DEBUG将可执行文件调入,并进行调试.

(1)用D命令观察数据区在内存中的具体内容,记录单元A和B的具体地址.

(2)用U命令对目标代码反汇编,观察反汇编后的结果.注意发现源程序的起始

位置,并记录这个起始地址.

可见:

A和B的具体地址为:

076A:

0000和076A:

0001

源程序的其实地址为:

0772:

0000

(3)用T命令作单步跟踪调试.比较每条指令执行后的结果和原来的理解是否

一致.得出程序运行的结果:

它们是写在什么单元,具体内容是什么;并判断结果是

否正确.

(4)在子程序SUB1的入口处设一断点,用G命令执行程序.在断点处观察堆

栈的内容,比较堆栈的内容和程序返回地址是否一致.

(5)用E命令修改单元A,B的内容,重新执行程序,并记录结果.

(6)用M命令和A命令对程序进行修改:

将主程序中最后两条指令(ADD和

ADC)修改为一条CALLSUB1指令,重新执行程序.

将ADD和ADC两条语句替换为CALL语句,通过A命令可以直接修改程序指令,通过插入NOP指令使CPU空闲。

(7)退出DEBUG.

4.重新使用编辑软件,把源程序最后一句中的STAR去掉.再次生成可执行文件,

并用DEBUG调入内存.当使用U命令时,显示的结果与前一次(未加STAR)的结果

有何不同?

重新使用编辑软件,把源程序最后一句中的STAR去掉。

再次生成可执行文件。

再次DEBUG。

当使用U命令时,结果如下图所示。

可以看到,程序直接从数据段开始译码,后续译码全部紊乱。

所以说ENDSTAR的作用是指示编译器程序结束,同时告诉编译器程序执行时代码段的入口地址。

回答预习题

1.熟悉常用的DEBUG命令.

2.?

帮助

3.r查看寄存器内容

4.rxx(xx:

寄存器名称),修改寄存器内容

5.dxx:

偏移地址(xx为csdssses)查看内存单元的内容

6.u地址反汇编

7.t=开始地址[结束地址]跟踪执行

8.p跳过子程序单步运行

9.g=开始地址[断点地址]执行到断点处

10.g全速运行

11.exx:

偏移地址(xx为csdssses)修改内存单元的内容

12.a偏移地址汇编,录入程序或可修改语句

13.mxx:

块开始地址块结束地址xx:

新块开始地址块搬移:

又相当于复制命令

(xx为csdssses)

14.q退出debug

阅读并分析程序的功能.

答:

程序完成的功能是计算两个数的完全平方和,即计算

3.若SS=2000H,SP=FFFFH,向堆栈中压入4字节数据后,如何用D命令显示压

入堆栈的内容?

答:

使用的命令是:

-D2000:

FFFB,即使用段基址加偏移量查看。

实验总结

实验一,是这次微原软件实验的基础,我主要学习了代码的链接及可执行文件的生成也学习并熟悉了DEBUG的使用,尝试使用的其中的部分指令。

通过DEBUG时查看程序内部运行的情况,我对课本上学习到的微原知识有了更深刻的理解。

实验二分支,循环程序设计

一、实验目的

1.开始独立进行汇编语言程序设计;

2.掌握基本分支,循环程序设计;

3.掌握最简单的DOS功能调用.

二、实验任务及内容

1.安排一个数据区,内存有若干个正数,负数和零。

每类数的个数都不超过9。

2.编写一个程序统计数据区中正数,负数和零的个数。

3.将统计结果在屏幕上显示。

4.(扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。

三、程序流程图

四、源程序

DATSEGMENT

NUMDW1,-1,3,0,-6,-5,-4,3,-6,8,0,-8,-1,9,-7,0,9;设定的一组数据,其中3个0,6个正数,8个负数,符合题目要求

NDW($-NUM)/2;该组数据的个数

ZDW0;数据中0的个数

ADW0;数据中大于0的个数

BDW0;数据中小于0的个数

TYPE0DB0DH,0AH,'Numberofzeros:

$'

TYPE1DB0DH,0AH,'Numberofgreaterthan0:

$'

TYPE2DB0DH,0AH,'Numberoflessthan0:

$'

LOCATEDWTYPE0,TYPE1,TYPE2

DATENDS

STASEGMENTSTACK

DW128DUP(?

STAENDS

CODSEGMENT

ASSUMEDS:

DAT,SS:

STA,CS:

COD

STAR:

MOVAX,DAT

MOVDS,AX

MOVAX,STA

MOVSS,AX;初始化DS、SS指向STA

MOVBX,OFFSETNUM;将NUM中第一个数字的地址送入BX

MOVCX,N;将NUM中数字个数送入CX

TEST:

MOVAX,[BX];取出NUM中的第一个数字

CMPAX,0

JZIFZ;判断结果为是0,跳转到IFZ处继续执行

SALAX,1

JCIFL;判断结果是小于0,跳转到IFL

INCWORDPTRA;否则,A自加,然后继续执行程序

JMPCONTINUE

IFL:

INCWORDPTRB;B自加

JMPCONTINUE

IFZ:

INCZ;Z自加

CONTINUE:

ADDBX,2;继续送入下一数字

LOOPTEST;循环CX次判断

MOVCX,3;共显示3句话

XORBX,BX

SHOW:

MOVDX,LOCATE[BX];显示一句话

MOVAH,09H

INT21H

MOVDX,Z[BX]

ADDDX,'0'

MOVAH,02H

INT21H;加上ASCII码,显示Z、A、B的值

ADDBX,2

LOOPSHOW

MOVAX,4C00H

INT21H;返回DOS系统

CODENDS

ENDSTAR

五、程序运行结果

显示有3个0、6个大于0的数、8个小于0的数,与预期结果符合

六、预习题

1.十进制数0--9所对应的ASCII码是什么?

如何将十进制数0-9在屏幕上显示出来?

答:

0--9对应的ASCII码是30H~39H,即对应的数值加上30H即可得到其对应的ASCII码。

要显示时将对应的ASCII码赋给DX,之后用2号功能调用即可。

2.如何检验一个数为正,为负或为零?

你能举出多少种不同的方法?

答:

先检验其ZF位,再检验其SF位,即直接检验该数字。

将待判断的数与0比较,同样先检验ZF,再检验CF位。

七、实验总结、建议要求、心得体会

本次试验中,主要用到运用的是分支、循环结构,所以程序中存在很多条件跳转语句。

所以需要在最初设计时就考虑好各种分支情况,这是程序流程图的重要作用就显现出来了。

在刚开始编这个程序的时候,我只是凭借自己的抽象思维来想象这个过程,导致过程特别混乱。

我意识到这一点之后,经过仔细的思考,在画好程序流程图之后,程序的编写工作变得简单了很多,简化了编写代码过程中的思考过程。

我个人觉得,这说明程序流程图在汇编语言编写过程中的作用比别的高级语言显得更加重要。

实验三代码转换程序设计

一、实验目的

1.掌握几种最基本的代码转换方法;

2.运用子程序进行程序设计.

二、实验任务及内容

1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.

2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.

3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.

4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.

三、程序流程图

四、源程序

DATASEGMENT

REMINDDB0DH,0AH,'Pleaseinputthenumberstobecomparednow.',0DH,0AH,'ThenumbersshouldbedevidedwithSPACEandendedwithENTER',0DH,0AH,'$'

ERRORDB0DH,0AH,'INPUTERROR',0DH,0AH,'$'

STRDB0DH,0AH,'comparedresult:

theminimumis:

',0DH,0AH,'$'

MINDB'9','9'

DATAENDS;设置最初输入提醒、错误提示、结果输出、初始化最小值为99。

STACKSEGMENTSTACK'STACK'

DB100DUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

INPUTPROCNEAR;控制输入的子程序

MOVAH,01H;非法输入则将AL=0后返回

INT21H

CMPAL,'0'

JBFLAG

CMPAL,'9'

JAFLAG

RET

FLAG:

MOVAL,0

RET

INPUTENDP

START:

MOVAX,DATA

MOVDS,AX;初始化数据段DS

LOOP1:

MOVAH,09H

MOVDX,OFFSETREMIND;显示输入提示的字符串

INT21H

LOOP2:

CALLINPUT;调用输入子程序,输入十位数

CMPAL,0;错误则输出提醒

JZERR

MOVDH,AL

CALLINPUT;调用输入子程序,输入个位数

CMPAL,0;错误则输出提醒

JZERR

MOVDL,AL

MOVAH,1

INT21H

CMPAL,0DH

JZEXIT;判断是结束符“.”则跳转

CMPAL,20H;判断是分隔符才继续

JNZERR

CMPDX,WORDPTRMIN;比较较小值,是则跳转并刷新最小值

JBSWAP

JMPLOOP2

EXIT:

MOVAH,09H;显示最小值的那句话,即显示字符串

MOVDX,OFFSETSTR

INT21H

MOVAH,02H

MOVDL,MIN+1;显示最小值的十位

INT21H

MOVAH,02H

MOVDL,MIN;显示最小值的个位

INT21H

MOVAX,4C00H;返回DOS系统

INT21H

SWAP:

MOVWORDPTRMIN,DX;刷新最小值

JMPLOOP2

ERR:

MOVDX,OFFSETERROR;输入错误时跳至此处,输出提示,即显示对应字符串

MOVAH,09H

INT21H

JMPLOOP1

CODEENDS

ENDSTART

注:

本程序中,中断字符为空格键,结束字符为回车键。

五、程序运行结果

六、预习题

1.如何将输入的两个字符(0~9)变为十进制或二进制数?

答:

输入的字符0~9是ASCII码表示的,对应于30H~39H,通过减去30H,可以转换为相应的计算机数,即转换成功。

2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?

答:

可以按对应的ASCII码转换为数字即可,规律如1所示。

在本次试验中可以采用输入时把ASCII码转换为数字,然后比较数字的大小再输出,但是这一天的话输出时还需要把数字再次转换为ASCII码。

很显然这样会造成代码的冗余,所以在我的代码中直接读入并存储数字的ASCII码,再直接比较其大小,然后直接输出ASCII码。

这样的话,虽然在程序中没有出现对应的十六进制或十进制数字,但是输入及显示输出的内容是正确的,对程序结果并无影响。

3.你觉得采用二进制运算还是十进制运算更适合于这个实验?

答:

如果在这两种禁止里进行选择的话,我觉得二进制(十六进制)更好一些,因为这样更符合机器语言,有利于程序的编写。

但是采用二进制或者十进制都需要进行ASCII码到数字的转换和其反向转换,换用新的思路可以大大简化编程负担。

所以我选择了直接使用数字对应的ASCII比较,分别比较十位和个位,最后直接输出字符即可。

七、实验总结、建议要求、心得体会

这个实验主要涉及到代码转换的程序,编程过程中遇到的主要的问题就是关于ASCII码转换的问题,由于不熟悉出现了很多不该犯的错误。

另外,这次的程序依然用了很多的跳转,导致程序有点乱,由于实验4就是关于这个的,所有就没有对其进行改进,在实验4中,这方面有了比较大的进步。

 

实验四子程序设计

一、实验目的

1.进一步掌握子程序设计方法;

2.进一步掌握基本的DOS功能调用.

二、实验任务及内容

1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.

2.统计检查每个学生的名次.

3.将统计结果在屏幕上显示.

4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.

5.输入要有检错手段.

三、程序流程图

结束

合理

输出子程序

调用输出子程序

调用排序子程序

检验子程序

调用检验子程序

四、源程序

DATASEGMENT

BUFFERDB100

DB?

DB10DUP(?

STR1DB'pleaseinputthescoreofthestudentsdevidedwithspace:

',0DH,0AH,'$'

STR2DB'error,pleaseinputthescoreagain:

',0DH,0AH,'$'

STR3DB'numrankscor',0DH,0AH,'$';定义各提示语句的字符串

VAR1DW?

VAR2DW?

CKDB?

TABDB100DUP(?

DATAENDS

STACKSEGMENTSTACK'stack'

DB100DUP('s')

STACKENDS

CODESEGMENTPARA'code'

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

STAPROCFAR

PUSHDS

XORAX,AX

PUSHAX

MOVAX,DATA

MOVDS,AX

LEADX,STR1

MOVAH,09H

INT21H;显示输入提示语句,即送显STR1字符串

INPUT:

LEADX,BUFFER;开始扫描输入并进行存储

MOVAH,0AH

INT21H

LEADI,TAB

XORCX,CX

MOVAH,30H

MOVDH,31H

LEABX,BUFFER+2

CALLCHECK;调用检验子程序

CMPCK,1

JZINPUT

CALLCOM;调用排序子程序

MOVDL,0DH

MOVAH,02H

INT21H

MOVDL,0AH

MOVAH,02H

INT21H

LEADX,STR3

MOVAH,09H

INT21H

CALLDISPY;调用子程序送显程序结果

RET

STAENDP

CHECKPROC;检验子程序

NEXT1:

MOVCK,0

MOV[DI],AH

INCDI

MOV[DI],DH

INCDI

CMPDH,39H

JZL1

INCDH

JMPL2

L1:

MOVDH,30H

INCAH

L2:

MOVAL,[BX]

CMPAL,30H

JBERROR

CMPAL,39H

JAERROR

MOV[DI],AL

INCDI

INCBX

MOVAL,[BX]

CMPAL,30H

JBERROR

CMPAL,39H

JAERROR

MOV[DI],AL

INCDI

INCBX

INCCX

MOVAL,[BX]

CMPAL,0DH

JZFINISH1

INCBX

JMPNEXT1

ERROR:

LEADX,STR2

MOVAH,9

INT21H

MOVCK,1

FINISH1:

RET

CHECKENDP

COMPROC;调用排序子程序

COMP1:

PUSHCX

MOVVAR1,CX

SHLCX,1

SHLCX,1

SUBCX,4

MOVVAR2,CX

POPCX

DECDI

DECDI

JMPCOTI

COMP2:

ADDDI,VAR2

COTI:

MOVBL,0

MOVCX,VAR1

DECCX

AGAN:

MOVAL,[DI]

CMPAL,[DI-4]

JAGOON1

JBGOON3

INCDI

MOVAL,[DI]

CMPAL,[DI-4]

PUSHF

DECDI

POPF

JAGOON1

JBEGOON3

GOON1:

MOVBL,-1

PUSHCX

MOVCX,4

DECDI

DECDI

GOON2:

MOVAL,[DI]

XCHGAL,[DI-4]

MOV[DI],AL

INCDI

LOOPGOON2

POPCX

DECDI

DECDI

GOON3:

DECDI

DECDI

DECDI

DECDI

LOOPAGAN

CMPBL,0

JNZCOMP2

DECDI

DECDI

MOVCX,VAR1

MOVBH,30H

MOVBL,31H

RET

COMENDP

DISPYPROC;送显子程序

DISPY1:

MOVDL,BH

MOVAH,02H

INT21H

MOVDL,BL

MOVAH,02H

INT21H

MOVDL,''

MOVAH,02H

INT21H

INT21H

INT21H

MOVDL,[DI]

MOVAH,02H

INT21H

INCDI

MOVDL,[DI]

MOVAH,02H

INT21H

INCDI

MOVDL,''

MOVAH,02H

INT21H

INT21H

INT21H

MOVDL,[DI]

MOVAH,02H

INT21H

INCDI

MOVDL,[DI]

MOVAH,02H

INT21H

INCDI

MOVDL,0DH

MOVAH,02H

INT21H

MOVDL,0AH

MOVAH,02H

INT21H

CMPBL,39H

JZL3

INCBL

JMPNEXT2

L3:

MOVBL,30H

INCBH

NEXT2:

LOOPDISPY1

RET

DISPYENDP

CODEENDS

ENDSTA

五、程序运行结果

六、预习题

1.如何确定一个学生在这门科目中的名次?

答:

根据输入成绩进行排序,完成后看最后这个学生的位置来确定其名次

2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?

答:

冒泡排序法

3.准备好模块层次图.

4.给出输出显示的形式.

答:

输出形式以列表形式给出。

序号、名次、分数各一列。

如结果图所示。

七、实验总结、建议要求、心得体会

本次实验主要涉及到的是子程序的调用,从这次实验中我体会到了子程序调用对程序的的简洁与清晰有巨大的作用,不像前面靠各种JMP来实现跳转进,是整个程序显得很杂乱。

在此次实验完成之后,我的编程能力以及对汇编语言的了解都获得了加深,对于微机原理课程的学习以及之前所学的知识的巩固都有很大的左右。

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

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

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

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