北邮微原软件实验.docx
《北邮微原软件实验.docx》由会员分享,可在线阅读,更多相关《北邮微原软件实验.docx(26页珍藏版)》请在冰豆网上搜索。
![北邮微原软件实验.docx](https://file1.bdocx.com/fileroot1/2022-11/30/10ee4c9b-3738-4bd3-aba9-61979f9a0acc/10ee4c9b-3738-4bd3-aba9-61979f9a0acc1.gif)
北邮微原软件实验
微机原理软件实验报告
学院:
信息与通信工程学院
班级:
学生姓名:
学号:
实验一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来实现跳转进,是整个程序显得很杂乱。
在此次实验完成之后,我的编程能力以及对汇编语言的了解都获得了加深,对于微机原理课程的学习以及之前所学的知识的巩固都有很大的左右。