微机原理实验报告Word格式文档下载.docx
《微机原理实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告Word格式文档下载.docx(36页珍藏版)》请在冰豆网上搜索。
MOVCX,0004H;
根据转换个数设定循环次数
(两字节十六进制数如6B2C对应有四个用十六进制表示的ASCII码表示,即四个字节)
MOVDI,3500H;
指向该两字节十六进制数起始地址,此时在调试窗口修改内存字节
MOVDX,[DI];
将地址3500H中的内容(6B2C)给DX
A1:
MOVAX,DX;
第一次时DX=6B2C,
;
因为想顺序取C、2、6、B,所以需要一个中间变量
ANDAX,000FH;
取低四位,第一次取到C,
CMPAL,0AH;
判断AL属于0~9,还是A~F
JBA2;
如果是0~9,则跳转到A2
ADDAL,07H;
若属于A~F,再加上07H后也是再加上30H即得到转换。
A2:
ADDAL,30H;
0~9的ASCII码对应的十六进制比其
本身(注意:
亦是十六进制)大30H
MOV[DI+0AH],AL;
将转码后的C,即43H给350A
INCDI;
将DI指向下一字节,用于存储转码后的值,第一次自增后要存‘2’
PUSHCX;
功能是接下来要用到CX作为一个中间变量,
;
而刚才已经使用并且接下来还会用到CX的值,
也可以不用CX,用其他不用的寄存器或者直接立即数形式的。
MOVCL,04H;
若直接用立即数,可能不稳定,(原因不详)用一个中间变量。
SHRDX,CL;
右移四位,如第一次转码后,DX=6B2C,
为下一次取低四位的2做好前提,将0010b移到低四位
POPCX;
执行完后,CX又用于计数
LOOPA1;
每一次转码后,执行完此句后,CX的值都要变化,
分别是3,2,1,0;
正好四次。
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
1.3实验过程与心得
1.3.1编程要点
1.数据在内存空间中的存储情况要清晰;
图1-1-2图1-1-3
如上图所示图1-2为处理前的存储情况,通过调试中的内存修改来实现并检查,图1-3为最后期待的转码结果,通过查询内存来检查。
2.基本功能的实现:
分两种情况去转码。
中间涉及到比较选择语句,可以通过标志位来理解学习JB的实现条件是由于标志位的变化。
3.取与存两个“指针”的变化
(1)取时通过一个中间变量取经过右移四位后的低字节来依次选择C、2、B、6;
使用软件时,看AX经过“ANDAX,000FH”后是否取到了这些数。
(2)每一次转码后存储时将指针在存储空间305A不断移动。
每次存储后,可查询内存。
(3)每一次循环过后,CX都要变化,也可同时学习PUSH、POP功能。
1.3.2软件使用简介
1.WAVE软件
它可以将内存的变化及寄存器的变化实时展示出来,红色数据是新变化的值。
查找内存时可通过右键转到地址即可,但需要输入物理地址。
如此时偏移地址为3500H,而通过观察DI赋值前一状态ds为20H,则通过计算可知在3700H输入2C,3701H输入6B即可,双击修改。
可以与硬件连接做接口实验,但没有人机对话功能。
在使用之前需要建立新项目。
过程简介如下:
选择8086仿真--右击模块文件--新建项目--假如已编ASM文件(最好一个文件夹中)--保存项目--全部编译--单步执行(F8)--观查内存变化。
2.MASM软件
它可以通过DEBUG调试窗口来进行观察,但需要有不同的命令输入去修改内存,查询内存,并且更新情况也不如WAVE直白,若有其他未考虑的某值变化,不宜观测。
单步跟踪(“t”)是先执行上一条语句,并显示执行后的状态,即显示上一语句执行后的状态。
而末尾的命令语句还未执行。
它不需要计算物理地址。
如找3500H时,直接输入“dds:
3500”即可查询。
另外,标志位的查询尽管每次单步跟踪都显示,但是需要先记住各个符号代表的意思。
修改内存较WAVE繁琐,需要输入e3500,然后会提示修改,但一次只能改一个字节的内容。
其余命令可以在左侧DEBUG调试里双击在右侧得到。
另外,状态的显示没有记录。
MASM有人机对话功能,但在使用时,无法调试查看内存变化。
过程简介:
编程--保存(.asm)--编译成目标文件--生成可执行文件--DEBUG调试。
1.3.3使用过程
1.将二字节十六进制数存放于起始地址为3500H的内存单元中
图1-1-4
2.查看内存的变化--注意DX的变化
图1-1-5
3.
(1)注意AX的变化,已取低四位
(2)标志位的变化:
0CH比0AH大,NC表示CF=0,不执行JB后的命令,即继续执行+07H。
图1-1-6
4.
(1)结合图1-7和1-8观察确定内存变化的时刻,了解调试指令t的运行情况;
(2)DI的变化
图1-1-7
图1-1-8
5.
(1)结合图1-8和图1-9观察DX的变化;
(2)在调试过程中发现AX有非预期的变化,而原先也是有的,只是没注意到。
这个对于代码段的思路学习是没太大关系的。
图1-1-9
6.
(1)注意CX的变化;
7.
(2)标志位CF由NC变成了CY,判断为JB成立,执行A2
图1-1-10
7.
(1)存储顺序的检查,确定指针指在350B,即确定可以往后存储;
(2)压栈的变量(CX)变化时间,PUSH后并没有改变CX的值;
图1-1-11
8.
(1)出栈的变量(CX)变化,出栈后CX的值还原。
(在这里才提到是因为第一次循环中CX都是0004H,看不出变化)
(2)g命令的使用,它可以全部运行,方便查看最后的结果。
因为至此关于编程的几个要点已全部明确。
图1-1-12
9.
(1)检查执行结果,存储结果与预期相符。
(2)检查CX是否为预期的0,应用跟踪执行指令(‘t’),发现g只是一个断点,用于显示验证。
但内存已发生了改变。
图1-1-13
10.由于内存已变化,无法确定后续命令是否对内存产生效果,虽从内存上不知350C是否再一次得到赋值,但AX的变化也可知。
但更改350D的值,观察350D的变化也可以明显确定,形成对比。
11.通过图1-14和图1-15可知,LOOP指令CX的计数方式。
图1-1-14
图1-1-15
2.程序设计:
将十进制的ASCII码转换为BCD
设从键盘输入的五位十进制数的ASCII码存放在2000H起始的内存单元内。
若输入的不是十进制数的ASCII码,则对应存放结果的单元内容为“FF”。
完成相应程序的编制,进行调试并验证结果。
2.1程序流程图
2.2程序
CODESSEGMENTASSUMECS:
MOVCX,05h
MOVBX,2000H;
存十进制数的ASCII码的起始位置
GET:
MOVAH,01H;
键入十进制数
INT21H
;
moval,31h
MOV[BX],AL;
比较输入的所对应的ASCII码是否在0~9内
CMPAL,30H
JBerror
CMPAL,39H
JAerror
JMPcrec;
不经过error
error:
不是十进制数时,将FFH存入对应内存。
pushcx
movcx,0ffh
MOV[BX+1000H],cx
popcx
MOVDL,[BX+1000H];
直接将FF做为ASCII码所对应的符号显示出来,用以检验
MOVAH,02H
JMPendd
crec:
SUBAL,30H;
如若属于0~9,则-30H即可得到对应的十进制数于内存中
MOV[BX+1000H],AL;
将每一次翻过来的值放到3000H,3001H...3004H中
显示用以检查验证
adddl,30h
endd:
INCBX
LOOPGET;
这种显示是一次输入对应两个地方的存储并分别显示。
MOVAH,4CH
2.3程序运行结果
若为0~9,则输入一个数显示一个数;
若是除此之外的,则显示FFH做为ASCII所对应的字符,如图2-2所示。
另外,这种演示的前提是确定显示语句是正确的。
图2-2
实验二数据处理实验
(1)进一步掌握在PC机上建立、汇编、链接和运行8086/88汇编语言程序的过程。
(2)通过阅读并调试数据处理的示例程序,完成程序设计题,掌握简单程序的结构。
1.寻找最大数和最小数的程序
设在内存缓冲区BUF+1单元开始,存放8个单字节数,其数据长度在BUF单元,要求找出最大数送MAX单元,最小输送MIN单元。
假如第一个数是最大数,并送到MAX单元中,依次把余下的数送到MAX单元中,否则取下一个数,最后MAX单元中即为最大数。
同理可求出最小数。
1.1参考程序
ORG100H;
定义偏移首地址,方便寻找内存
BUFdb8,22,33,12,-1,-50,-32,97,127
MAXdb?
MINdb?
MOVAX,DATAS
MOVDS,AX1.2实验流程图
MOVCH,0
MOVCL,BUF;
存个数数
DECCX;
后面要循环比较七(8-1)次,先变成七
MOVAL,BUF+1;
拿出第一个数放到最大数和最小数中,用于比较和更新
MOVMAX,AL;
放到最大数
MOVMIN,AL
MOVBX,OFFSETBUF+2;
拿第二个数与现有的最大最小值比较
LAST:
MOVAL,[BX];
AL作为暂时存储的寄存器代表新来的要比较的值
CMPAL,MAX;
判断是否更大
JGGREAT;
若大(用于有符号比较),则跳转
CMPAL,MIN;
判断是否更小,也可将相等的情况视作小于,则可省去,直接跳转至LESS即可
JLLESS;
若小,也相应跳转
JMPNEXT;
若相等,则直接跳过
GREAT:
MOVMAX,AL;
大数更新
JMPNEXT
LESS:
MOVMIN,AL;
小数更新
NEXT:
INCBX;
BX取的是第二个数(用于排序)的地址,现在要指向下一个,即要判断下一个
LOOPLAST;
第一次循环后,执行此句前cx为7,然后自减,判断是否继续。
(第二个数已判断完)
第七次循环后,执行此句前cx为1,然后自减,cx=0,结束。
(第八个数已判断完)此时,最大最小值已经放好
MOVAH,4CH
INT21H
ENDSTART
2.程序设计1
设在内存缓冲区BUF+1单元开始,存放若干个单字节数,其数据长度在BUF单元,要求在这些数据中查找某个特定数据,若有则把存放在该字符的地址送AX,否则把FF送入AX。
2.1流程图2.2程序
DATASSEGMENT;
BUFDB8,2,33,10110111B,-5,65,30H,45H,20H
ASSUMECS:
MOVAX,0;
将要查找的数存起来,可以是AX,也可以是其他变量。
MOVBX,AX
MOVSI,OFFSETBUF;
取地址
MOVCX,0;
对整个CX清一下零
MOVCL,[SI];
数据个数
A1:
INCSI;
指向第一个数
CMPBL,[SI];
是否是
JECREC;
是的话
JMPERROR
CREC:
MOVAX,SI;
将地址给AX
JMPEND1;
完成退出
ERROR:
LOOPA1;
不是的话,继续比较,;
八次比较后,不再执行,进入下一语句
MOVAX,0FFH
END1:
INT21H
ENDSTART
实验三排序程序设计
通过阅读并调试示例程序,完成程序设计题,掌握循环程序设计的方法。
1.数的排序
在数据块BUF区存放10个无符号数,要求设计程序将这些数由小到大排序,排序后的数仍放在该区域中。
1.1设计思想
(1)从最后一个数据(或第一个数)开始,一次把相邻的两个数进行比较,即第N个数和第N-1个数比较,第N-1个数与第N-2个数比较等等;
若第二个数大于第N个数则两者交换,否则不交换,直到N个数的相邻两个数都比较完为止。
此时,N个数的最小数将被排在N个数的最前列。
(2)对剩下的N-1个数重复上述步骤,找到N-1个数中的最小数。
(3)重复第二步,直到N个数全部排好为止。
(4)本程序的主体思想是冒泡法,通过从后往前每相邻两位的比较将最小数放到最前面,这样循环进行N-1回一定可以将N个数排好序。
但为了提高效率,引进另一种方法,如若在某回循环中,每一次相邻两数都是理想顺序,既不需要互换,则可以终止循环。
另外,注意有符号数和无符号数的比较命令。
1.2实验流程图1.3实验参考程序
BUFDB6,23,41,24,-3,-45,12,2,98,43
STACKSENDSCODESSEGMENT
ASSUME
CS:
movSI,OFFSETBUF+0AH;
指针指到末尾数据的后一个字
MOVCX,0AH;
设置第一次的比较次数以及总的循环回数
MOVBL,0FFH;
设定交换标志
CMPBL,0FFH;
每回向左移动最小数后,检查标志是否有改变,即是否有调整
JNZA4;
若某回每两个相比都不存在交换,即该回每次都跳到A3,
最后返到A1,这时bl还是00,而没被赋为ff,即顺序已排好,则退出
MOVBL,00H;
起始设置,用以比较
DECCX;
记录回数;
如第一次只需要比较9次;
JZA4;
最多比较9次就可以把顺序排好,第一次把最小的放在数据首位,
第二次相当于对9个数排序;
直至第九次对两个数排序
PUSHSI
PUSHCX;
保存cx现有的值用以记录回数;
每回的比较次数也保留了下来,用以每回的使用
A2:
DECSI;
用以使每回的第一次指针指到末尾;
由于SI需要增加,即指针需要左移,
MOVAL,[SI];
将高侧(接近尾侧)地址(1回是10)的内容暂时放在AL中
指向上一个地址(1回1次时是地址9)
CMPAL,[SI];
(1回1次10和9比较)
JNCA3;
10若不大于9,则不交换,直接进行该回下一次
XCHGAL,[SI];
若10更小,需交换,把9内的值给AL,AL即10内的值放地址9中
MOV[SI+01H],AL;
9的值给10
交换标志
A3:
由于SI指到了9,又限于A2开始有decsi,故需要增到需处理位的下一位;
;
所以去掉“38”“29”更改“15”的0A-->
09亦可
LOOPA2;
每回的循环次数
POPCX;
此时释放是因为记录回数
POPSI;
从尾端再次开始
JMPA1;
进行下一回的比较,
A4:
最后跳出结果:
一是回数够了能保证顺序调整好,另一个是为了提高效率。
2.比较相等关系
bufX、bufY和bufZ是3个有符号十六进制数,编写一个比较相等关系的程序:
(1)如果这三个数都不相等,则显示0;
(2)如果这三个数中有两个数相等,则显示1;
(3)如果这三个数都相等,则显示2;
2.1程序流程图2.2程序
ORG50h
bufXdb?
bufYdb?
bufZdb?
showdb"
"
"
$"
show1db"
pleaseinputthreekeys"
show2db"
theresultis"
--------------------------------------------
movah,09h;
提醒输入
movdx,offsetshow1
int21h
movah,09h
movdx,offsetshow
movah,01h;
数据采集
movbufX,al
movdx,offsetshow;
blank
movah,01h
movbufY,al
movdx,offsetshow;
blank
movbufZ,al
movdx,offsetshow2
remebertooutput
-------------------------------------------
MOVDL,30H
MOVBL,bufX
MOVCL,bufZ
CMPBL,bufY
JNEA2
INCDL
CMPBL,CL
JNEA3
CMPDL,32H
JEEND1
CMPbufY,CL
JNEEND1
INCDL
END1:
2.3程序结果
1.三个数都不相等时
图3-2-2
2.三个数有两个相等时
图3-2-3
3.三个数都相等时
图3-2-4
实验四系统中断调用实验
通过阅读并调试示例程序,完成程序设计题,掌握利用DOS中断的调用来实现人机对话的编程方法。
1.人机会话程序
通过人机会话可以获取程序运行所需要的数据,本程序应用的DOS中断功能,涉及到了1、2、9、0AH四个功能的调用。
1.1设计思路
首先计算机询问用户姓名,等到用户输入姓名的汉语拼音,然后将它显示在屏幕上,请用户认可,用户键入“Y”程序结束,否则再次询问用户姓名。
DATASSEGMENT
此处输入数据段代码
MESG1DB0DH,0AH,'
Whatisyourname?
$'
MESG2DB'
?
(Y/N)$'
BUFDB30;
大接收字节数
DB?
输入的总字节数
DB30DUP(?
);
从这开始存要输入的数据
CODES,DS