当前位置:文档之家› 微机原理实验报告

微机原理实验报告

大学科技学院实验报告课程名称:微机原理实验实验一数据转换实验一、实验目的(1)初步掌握在PC机上建立、汇编、链接和运行8086/88汇编语言程序的过程。

(2)通过对两个验证性试验的阅读、调试、掌握不同进制数及编码相互转换的程序设计方法。

(3)完成程序设计题,加深对数码转换的理解,了解简单程序设计方法。

二、实验内容1.十六进制数转换为ASCII码设二字节十六进制数存放于其实地址为3500H的内存单元中,把他们转换成ASCII码后,再分别存入起始地址为350A的四个内存单元中。

从书上ASCII码表中可知十六进制数加30H即可得到0H~9H的ASCII码,而要得到AH~FH 的ASCII码,则需再加7H。

请根据所给流程图理清思路,总结出对应的若干要点。

将流程图与参考程序相互。

根据分析的结果将运行时内存的变化列写出来。

学习并使用MASM或WAVE仿真软件分析程序运行过程中相关寄存器及相应内存的变化情况来验证自己的猜想,以巩固命令的学习,提高编程能力。

图1-1-1DATAS SEGMENT;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV CX,0004H;根据转换个数设定循环次数;(两字节十六进制数如6B2C对应有四个用十六进制表示的ASCII码表示,即四个字节)MOV DI,3500H;指向该两字节十六进制数起始地址,此时在调试窗口修改内存字节MOV DX,[DI];将地址3500H中的内容(6B2C)给DXA1: MOV AX,DX;第一次时DX=6B2C,;因为想顺序取C、2、6、B,所以需要一个中间变量AND AX,000FH;取低四位,第一次取到C,CMP AL,0AH;判断AL属于0~9,还是A~FJB A2;如果是0~9,则跳转到A2ADD AL,07H;若属于A~F,再加上07H后也是再加上30H即得到转换。

A2: ADD AL,30H;0~9的ASCII码对应的十六进制比其;本身(注意:亦是十六进制)大30HMOV [DI+0AH],AL;将转码后的C,即43H给350AINC DI;将DI指向下一字节,用于存储转码后的值,第一次自增后要存‘2’PUSH CX;功能是接下来要用到CX作为一个中间变量,;而刚才已经使用并且接下来还会用到CX的值,;也可以不用CX,用其他不用的寄存器或者直接立即数形式的。

MOV CL,04H;若直接用立即数,可能不稳定,(原因不详)用一个中间变量。

SHR DX,CL;右移四位,如第一次转码后,DX=6B2C,;为下一次取低四位的2做好前提,将0010b移到低四位POP CX;执行完后,CX又用于计数LOOP A1;每一次转码后,执行完此句后,CX的值都要变化,;分别是3,2,1,0;正好四次。

MOV AH,4CHINT 21HCODES ENDSEND START1.3 实验过程与心得1.3.1 编程要点1.数据在内存空间中的存储情况要清晰;图1-1-2 图1-1-3如上图所示图1-2为处理前的存储情况,通过调试中的内存修改来实现并检查,图1-3为最后期待的转码结果,通过查询内存来检查。

2.基本功能的实现:分两种情况去转码。

中间涉及到比较选择语句,可以通过标志位来理解学习JB的实现条件是由于标志位的变化。

3.取与存两个“指针”的变化(1)取时通过一个中间变量取经过右移四位后的低字节来依次选择C、2、B、6;使用软件时,看AX经过“AND AX,000FH”后是否取到了这些数。

(2)每一次转码后存储时将指针在存储空间305A不断移动。

每次存储后,可查询内存。

(3)每一次循环过后,CX都要变化,也可同时学习PUSH、POP 功能。

1.3.2 软件使用简介1.W A VE软件它可以将内存的变化及寄存器的变化实时展示出来,红色数据是新变化的值。

查找内存时可通过右键转到地址即可,但需要输入物理地址。

如此时偏移地址为3500H,而通过观察DI赋值前一状态ds为20H,则通过计算可知在3700H输入2C,3701H输入6B即可,双击修改。

可以与硬件连接做接口实验,但没有人机对话功能。

在使用之前需要建立新项目。

过程简介如下:选择8086仿真--右击模块文件--新建项目--假如已编ASM文件(最好一个文件夹中)--保存项目--全部编译--单步执行(F8)--观查内存变化。

2.MASM软件它可以通过DEBUG调试窗口来进行观察,但需要有不同的命令输入去修改内存,查询内存,并且更新情况也不如W A VE直白,若有其他未考虑的某值变化,不宜观测。

单步跟踪(“t”)是先执行上一条语句,并显示执行后的状态,即显示上一语句执行后的状态。

而末尾的命令语句还未执行。

它不需要计算物理地址。

如找3500H时,直接输入“d ds:3500”即可查询。

另外,标志位的查询尽管每次单步跟踪都显示,但是需要先记住各个符号代表的意思。

修改内存较W A VE繁琐,需要输入e 3500,然后会提示修改,但一次只能改一个字节的内容。

其余命令可以在左侧DEBUG调试里双击在右侧得到。

另外,状态的显示没有记录。

MASM有人机对话功能,但在使用时,无法调试查看内存变化。

过程简介:编程--保存(.asm)--编译成目标文件--生成可执行文件--DEBUG调试。

1.3.3 使用过程1.将二字节十六进制数存放于起始地址为3500H的内存单元中图1-1-42.查看内存的变化--注意DX的变化图1-1-53. (1)注意AX的变化,已取低四位(2)标志位的变化:0CH比0AH大,NC表示CF=0,不执行JB后的命令,即继续执行+07H。

图1-1-64.(1)结合图1-7和1-8观察确定内存变化的时刻,了解调试指令t的运行情况;(2)DI的变化图1-1-7图1-1-85.(1)结合图1-8和图1-9观察DX的变化;(2)在调试过程中发现AX有非预期的变化,而原先也是有的,只是没注意到。

这个对于代码段的思路学习是没太大关系的。

图1-1-96.(1)注意CX的变化;(2)标志位CF由NC变成了CY,判断为JB成立,执行A2图1-1-107.(1)存储顺序的检查,确定指针指在350B,即确定可以往后存储;(2)压栈的变量(CX)变化时间,PUSH后并没有改变CX的值;图1-1-118.(1)出栈的变量(CX)变化,出栈后CX的值还原。

(在这里才提到是因为第一次循环中CX都是0004H,看不出变化)(2)g命令的使用,它可以全部运行,方便查看最后的结果。

因为至此关于编程的几个要点已全部明确。

图1-1-129.(1)检查执行结果,存储结果与预期相符。

(2)检查CX是否为预期的0,应用跟踪执行指令(‘t’),发现g 只是一个断点,用于显示验证。

但内存已发生了改变。

图1-1-1310. 由于内存已变化,无法确定后续命令是否对内存产生效果,虽从内存上不知350C是否再一次得到赋值,但AX的变化也可知。

但更改350D的值,观察350D的变化也可以明显确定,形成对比。

图1-1-1311.通过图1-14和图1-15可知,LOOP指令CX的计数方式。

图1-1-14图1-1-152.程序设计:将十进制的ASCII码转换为BCD设从键盘输入的五位十进制数的ASCII码存放在2000H起始的内存单元内。

若输入的不是十进制数的ASCII 码,则对应存放结果的单元内容为“FF”。

完成相应程序的编制,进行调试并验证结果。

2.1 程序流程图2.2 程序DATAS SEGMENT;此处输入数据段代码 DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码 STACKS ENDS CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START :MOV AX,DATAS MOV DS,AX;此处输入代码段代码 MOV CX,05hMOV BX,2000H ;存十进制数的ASCII 码的起始位置 GET: MOV AH,01H ;键入十进制数 INT 21H ; mov al,31h MOV [BX],AL ;比较输入的所对应的ASCII 码是否在0~9内 CMP AL,30H JB error CMP AL,39H JA error JMP crec ;不经过errorerror: ;不是十进制数时,将FFH 存入对应内存。

push cxmov cx,0ffh MOV [BX+1000H],cx pop cx MOV DL,[BX+1000H];直接将FF 做为ASCII 码所对应的符号显示出来,用以检验 MOV AH,02H INT 21H JMP endd crec: SUB AL,30H ;如若属于0~9,则图1-2-1-30H即可得到对应的十进制数于内存中MOV[BX+1000H],AL;将每一次翻过来的值放到3000H,3001H...3004H 中MOV DL,[BX+1000H];显示用以检查验证add dl,30hMOV AH,02HINT 21Hendd:INC BXLOOP GET ;这种显示是一次输入对应两个地方的存储并分别显示。

MOV AH,4CHINT 21HCODES ENDSEND START2.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 参考程序DATAS SEGMENT;此处输入数据段代码ORG 100H ;定义偏移首地址,方便寻找内存BUF db 8,22,33,12,-1,-50,-32,97,127MAX db?MIN db?DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX 1.2 实验流程图;此处输入代码段代码MOV CH,0MOV CL,BUF ;存个数数DEC CX ;后面要循环比较七(8-1)次,先变成七MOV AL,BUF+1 ;拿出第一个数放到最大数和最小数中,用于比较和更新MOV MAX,AL ;放到最大数MOV MIN,ALMOV BX,OFFSET BUF+2 ;拿第二个数与现有的最大最小值比较LAST:MOV AL,[BX] ;AL作为暂时存储的寄存器代表新来的要比较的值CMP AL,MAX ;判断是否更大JG GREAT ;若大(用于有符号比较),则跳转CMP AL,MIN ;判断是否更小,也可将相等的情况视作小于,则可省去,直接跳转至LESS即可JL LESS ;若小,也相应跳转JMP NEXT ;若相等,则直接跳过GREAT:MOV MAX,AL;大数更新JMP NEXTLESS:MOV MIN,AL;小数更新NEXT:INC BX ;BX取的是第二个数(用于排序)的地址,现在要指向下一个,即要判断下一个LOOP LAST ;第一次循环后,执行此句前cx为7,然后自减,判断是否继续。

相关主题