微机原理实验报告

微机原理与应用课程实验报告

实验分工:

            

          

报告人

同组人

实验时间:2014.12.10

课程设计

一、题目要求

(1)在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据;

(2)将上述源区内容传送到目的内存区2(首址为1100H)中;

(3)检验上述传送过程是否正确,如有错误,在紧跟内存区2后的第一个字节开始写入ASCII码“ERROR”,否则写入“OK”。

(4)用冒泡法将上述内存区2的数据,按从小到大的次序重新排列,排列后存放在内存区3(开始地址为2100H)。

(5)将上述内存区2和内存区3的第100个数据分别乘以2,并转为BCD码,保存在各自存储区的末尾。再将上述两个BCD码相乘,其结果保存在内存区1的末尾处

二、实验程序框图

三、程序代码

code segment   

assume cs:code

      

DATA1  db  16  dup(?)

DATA2  db   'ERROR'

DATA3  db   'OK'     

;在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据

start: 

     mov ax,0100h              ;规定目标程序存放单元的偏移量

        mov ds,ax                      ;数据段地址

        mov es,ax                  

        mov si,offset DATA1         ;偏移地址

        mov cx,0010H                   ;循环次数

        mov bx,0100H

     mov al, ofH

    

S1:

     mov cs:[si],al

     mov [bx],cs:[si]

     inc si

     inc bx

     dec al

     loop S1

     nop  

;将内存区1数据搬移到内存区2中  

     mov cx,16

     mov si,0100h

     mov bx,1100h

S2:

     mov al,[si]

     mov [bx],al

     inc si

     inc bx

     loop S2

     nop  

   

   

   

;对比内存区1的数据与内存区2的数据是否相同   

    mov cx,16

    mov si,0100h

    mov bx,1100h

 comp: 

    mov ax,[si]

    mov dx,[bx]

    cmp ax,dx

    jne erro

    inc si

    inc bx

    loop comp

   

             

;数据如果都相同,说明上述传输过程正确             

    mov si,offset DATA3

    mov di,1110h 

    mov bl,0

    mov cx,2

enterOK:

    mov bl,cs:[si]

    mov [di],bl

    inc si

    inc di

    loop enterOK

    nop   

    jmp S3                      

;如果有一个数据不相同,说明上述传输过程不正确

    

err:

    mov si,offset DATA2

    mov di,1110h 

    mov bl,0

    mov cx,5

enterERR:

    mov bl,cs:[si]

    mov [di],bl

    inc si

    inc di

    loop enterERR 

                                         

                                         

                                          

;将内存区2数据搬移到内存区3中

S3:                     

       mov si,1100h        

       mov cx,0010h

       mov bx,2100h

    mov al,0

    mov cx,16

fil:

    mov al,[si]

    mov [bx],al

    inc si

    inc bx

    loop fil

    nop

       

;用冒泡法将内存区3的数据按从小到大重新排列

S4:                   

       mov bl,0

       mov cx ,16

       mov si,2110h

       dec si

       dec cx

again:

    mov al,[si]

       cmp al,[si-1]

       jae next              

       xchg al,[si-1]

       mov [si],al

       mov bl,1

next:

    dec si

       loop again

       cmp bl,0

       jne start1

       nop

 

         

            

    mov si,1109h

    mov al,[si]

    mov cl,2   

    mul cl     ;结果在al中

                          

    mov dx,0               

    mov bx,10

       div bx                           

       shl al,4

    add al,dl    ;把二进制数转换成BCD码   

    mov [1112h],al

     

  

                                        

    mov si,2109h

    mov al,[si]

    mov cl,2 

    mul cl     ;结果在al中

   

    mov dx,0               

    mov bx,10

       div bx                           

       shl al,4

    add al,dl    ;把二进制数转换成BCD码   

    mov [2110h],al      

;两个BCD码相乘,其结果保存在内存区1的末尾处。   

    mov si,1112h

   

    mov ah,[si]

      mov cl,4

       shr ah,cl

       mov al,ah

       mov dl,10

       mul dl ;结果在al中

     

    mov dl,[si]

       and dl,0fh

       add al,dl

       mov bl,al   ;result 

      

 

    mov si,2110h

    mov ah,[si]

      mov cl,4

       shr ah,cl

       mov al,ah

       mov dl,10

       mul dl

     

    mov dl,[si]

       and dl,0fh  

       add al,dl   ;结果在al中

    mul bl 

    mov [0110h],al  

code ends

end  start

四、实验结果

(1)在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据;

(2)将上述源区内容传送到目的内存区2(首址为1100H)中;

(3)检验上述传送过程是否正确,如有错误,在紧跟内存区2后的第一个字节开始写入ASCII码“ERROR”,否则写入“OK”。

(4)用冒泡法将上述内存区2的数据,按从小到大的次序重新排列,排列后存放在内存区3(开始地址为2100H)。

(5)将上述内存区2和内存区3的第100个数据分别乘以2,并转为BCD码,保存在各自存储区的末尾。再将上述两个BCD码相乘,其结果保存在内存区1的末尾处

内存区2

内存区3

内存区1末尾处

五、分析与总结

本课程设计是对微机原理实验的综合运用,涉及做过的每个子实验且在此基础上有所改进,并活用了学过的微机原理知识,充分考察了对于程序语言的阅读和编写能力。在这个设计实验中因为程序较长,出现错误比较难以改正,又由于自己完成实验时运用的软件不同,导致在寻找程序内存区时有一定困难,但这些问题在土同学们讨论和老师的指导下都得以解决。本次课程设计及实验内容让我受益匪浅且巩固了微机原理的基础知识。


实验一、汇编语言程序基本操作

一、实验目的

1.熟悉EL微机实验系统的操作。

2.掌握汇编语言设计和调试方法 。

二、实验内容

1.   把2000H-20FFH的内容清零。

2.   把源RAM区(首址为2200H)内100H个字节的数据,传送到目的RAM区(首址为2000H)。

三、实验程序框图


1.清零程序框图                            2.数据传送程序框图

四、实验步骤

1.EL微机实验系统与PC机联机

    (1) 打开EL微机实验系统电源,初始化后,数码管显示“P_”,表示实验系统处于下位键盘监控状态。

    (2) 在PC机处于在Windows软件平台下,单击EL86图标,根据屏幕提示进行联机操作,实验系统数码管显示“C_”,表示实验系统处于上位PC机监控状态。

2. 编辑程序

选择“打开”菜单,打开现有的程序(清零实验程序名:RAM0.ASM)或者选择“新建”菜单,编辑新程序。(编辑新程序注意:在org 100h的下一行,必须写标号start.)

3.编译程序

      编译并连接程序,信息窗口显示“程序下传正确”,表示编译、连接成功。如果显示“程序下传不正确”,则应选择“运行”菜单中“系统复位”操作,然后重新进行编译、连接。

4.运行程序

在“运行”菜单中可选择多种手段进行调试运行。建议设立断点后再运行程序。

5.检查运行结果

在内存窗口检查运行结果。修改内存地址时,将光标移动到内存显示区的头部,右击鼠标,在弹出菜单选择修改内存地址,即弹出地址输入窗口,输入相应的地址即可。

五、程序代码

1. 2000H-20FFH清零程序

CODE SEGMENT   

           ASSUME CS:CODE

           ORG 0100H

START:     MOV AX,0100H

           MOV DS,AX        ;段基址

           MOV ES,AX        

           MOV SI,1000H      ;偏移地址

           MOV CX,0100H      ;设置循环次数

           AND AL,0

QINGLING: MOV [SI],AL

           INC SI

           DEC CX

           JNZ QINGLING      ;置完100H个数后循环终止

NOP              ;设置断点处

           JMP START

CODE  ENDS            

END   START           

2.数据传送程序

CODE SEGMENT   

           ASSUME CS:CODE

           ORG 0100H

START:     MOV AX,0100H

          MOV DS,AX         ;段基址

           MOV ES,AX        

           MOV DI,1000H      ;目的数据区偏移地址

          MOV SI,1200H      ;源数据区偏移地址

           MOV CX,0100H      ;设置循环次数

S1:       MOV  [SI],10H     ;将源RAM区数据置10H

          INC  SI

          LOOP  S1

          MOV SI,1200H

           MOV CX,0100H

 S2:      MOV AL,[SI]       ;将源数据通过AL传送到目的数据区

           MOV [DI],AL

           INC SI

          INC DI

           DEC CX

          JNZ S2

           NOP               ;设置断点处

CODE  ENDS            

END   START    

六、程序调试过程

1.清零

2.数据传送  

将1200H作为源数据区,其中数据置为10H,并通过AL传送到目的数据区1000H。

七、分析与总结

通过“汇编语言程序基本操作”作为第一个实验,让我们熟悉了emu8086软件,也熟悉了微机原理课程中学习到的编程语言,并学会阅读、修改甚至编写程序。清零和数据传输程序作为最基础也是最重要的两类程序,虽然刚上手做的比较费力,但也为下面的实验内容打下了基础。

实验二  排序实验

一、实验目的

掌握多重循环设计及调试方法。

二、实验内容

编写并调试一个排序子程序,其功能为用冒泡法将16个无符号的正整数,按从小到大的次序重新排列。


三、实验程序框图

四、实验步骤

1.在RAM区2000H-201FH中放入不等的数据。

2.编辑程序。

3.编译、连接程序。

4.在程序中检查交换标志语句前设立断点后再运行程序。

5.在内存窗口检查运行结果,并记录。

五、程序代码

冒泡法程序,适应于字节型数

;bubble sort

code segment   

assume cs:code

org 0100h

start:

jmp start1

buff db

12h,15h,46h,38h,89h,43h,27h,65h,19h,76h,55h,33h,61h,11h,22h,72h                                         ; 0x1103

cont equ $-buff     ;设置循环长度

start1:   

mov bl,0

mov cx ,cont        ;count

mov si,cx

dec si

dec cx

         

again:mov al,buff[si]

          cmp al,buff[si-1]

          jae next            ;若前一个数大于后一个数,交换两数据位置

          xchg al,buff[si-1]

          mov buff[si],al

          mov bl,1

next: dec si                  ;地址向后移动一个字节

          loop again

          cmp bl,0            ; 当数据不再变动,即BL=0,循环结束

          jne start1

          nop

code  ends

end   start

六、程序调试过程

          

程序调试中发现的问题:

1、该程序循环次数较多,对分析程序功能产生困难

2、适用于单字节型的冒泡法程序中唯有第六、第七遍扫描中出现了没有把最小数前置的错误问题,但在下一次扫描中更正了结果,因此并没有影响最终结果。

3、字符型冒泡法程序改进

实现在RAM区2000H一201FH中放入数据并将其按从小到大排序的程序为:


CODE SEGMENT

ASSUME CS:CODE

ORG 0100H

START: MOV AX,0100H

MOV DS,AX      ;数据段地址

MOV ES,AX

MOV SI,1000H

MOV [SI],45H;向RAM区2000H一

ADD SI,2    ;201FH中放人不等

MOV [SI],18H   ;的数据

ADD SI,2

MOV [SI],25H

ADD SI,2

MOV [SI],42H

ADD SI,2

MOV [SI],06H

ADD SI,2

MOV [SI],16H

ADD SI,2

MOV [SI],15H

ADD SI,2

MOV [SI],27H

ADD SI,2

MOV [SI],13H

ADD SI,2

MOV [SI],22H

ADD SI,2

MOV [SI],13H

ADD SI,2

MOV [SI],29H


ADD SI,2

MOV [SI],78H

ADD SI,2

MOV [SI],17H

ADD SI,2

MOV [SI],33H

ADD SI,2

MOV [SI],40H

START1:   MOV SI,101FH     ;最后一个数据的偏移地址送到SI

              SUB BL,BL        ;BL设为循环结束标志

           MOV CX ,10H      ;设置循环次数     

AGAIN1:    MOV AX,[SI]

              CMP AX,[SI-2]

              JNB AGAIN2      ;若前一个数大于后一个数,交换两数据位置

           MOV  DX,AX

              MOV AX,[SI-2]

              MOV [SI],DX

              INC BL

AGAIN2:   DEC SI            ;地址向后移动两个字节

           DEC SI

           DEC CX

           JNZ AGAIN1

           CMP BL,0         ;当数据不再变动,即BL=0,循环结束

             NOP

             JNE START1  

CODE  ENDS            

END START

七、分析与总结

冒泡法排序是以前编程语言学习中学到的方法,在此应用在了微机原理实验中。冒泡法虽然容易编出代码,但编程运行时间长,分步观察不容易。在做16个单字节无符号数的排序时程序正确,但在做16个字符型无符号数排序时结果出错。分析后认为问题在于16个单字节无符号数的排序时,只执行一次DEC SI,偏移量减1,而做16个字型无符号数排序时要连续两次执行DEC SI,使偏移量减2。根据此分析结果修改程序后,运行成功。


实验三 8253定时器/计数器

一、实验目的

掌握8253定时器/计数器的工作方式和编程原理。

二、实验内容

将定时器0、定时器1、定时器2设为模式3(方波),T0、T1的时钟由CLK3提供,其频率为750KHz。若T0的初值设为927CH(37500十进制),则OUT0输出的方波周期为0.05S(37500*4/3*10-6 )。T2采用OUT0为时钟,若T2的初值设为00C8H(200十进制),则OUT2输出的方波周期为10S。

三、实验程序框图  

四、实验步骤

1.用插针把CS8253插孔与CS0插孔相连。

2.用插针把8253CLK0、8253CLK1插孔与分频输出端CLK3插孔相连。

3.用插针把8253CLK2插孔与OUT0插孔相连。

4.用插针把8253 OUT2插孔与LED1插孔相连。

5.编写调试程序。

6.运行程序。

五、程序代码

8253定时器/计数器

assume cs:code

code segment public

org 100h

start:

      mov dx,04a6h        ;控制寄存器

      mov ax,36h          ;0011 0110b,计数器0,方式3

      out      dx,ax       ;写控制字

      mov dx,04a0h        ;T0

      mov ax,7Ch          ;先写低地址

      out  dx,ax

      mov ax,92h          ;后写高地址

      out  dx,ax           ;计数值927Ch

      mov dx,04a6h        ;控制寄存器

      mov ax,76h          ;0011 0110b,计数器1,方式3

      out dx,ax

mov dx,04a2h        ;T1

      mov ax,32h

      out     dx,ax

      mov ax,0            ;计数值32h

      out     dx,ax        ;频率为750KHZ/50=15KHZ

      mov dx,04a6h

      mov ax,0b6h         ; 0011 0110b,计数器2,方式3

      out     dx,ax

      mov dx,04a4h        ;T2

      mov ax,0c8h

      out     dx,ax

      mov ax,0            ;计数值0c8h

      out     dx,ax        ;频率为20HZ/200=0.1HZ

next:

      nop

      jmp      next

code  ends    

end   start    

六、实验结果

示波器输入通道1与OUT0插孔相连时,可以看到周期为0.05S的方波;

与OUT1插孔相连时,可以看到周期为0.067mS的方波;

与OUT2插孔相连时,可以看到周期为10S的方波;示波器屏幕可看到一个绿点缓慢的周期性移动,移动路线形状为周期为10S的方波。

七、分析与总结

通过该实验,我熟悉了8252芯片和微机接口原理的方法,掌握了8253定时器/计数器的基本工作原理、工作方式和编程原理,并熟悉了相关汇编代码的编写。本次试验中还使用了试验箱,连接电路,利用代码控制实验电路,不但加深了对课本理论知识的理解,也学会了软硬件结合的方法调试程序。

本次实验中我还尝试使用INT 21H中断0A号功能,将输入一串字符到存储器中转化为十六进制数作为分频数的方法产生一个负脉冲宽度的周期方波。

实验四 BCD码相乘

一、实验目的

掌握用组合BCD码表示数据以及组合BCD码相乘的方法

二、实验内容

编写两个单字节组合BCD码的乘法程序。

三、实验程序框图

四、实验步骤

1.编写调试程序。

2.设立断点后再运行程序。

五、程序代码

两个压缩BCD码相乘,结果为5个字节

CODE SEGMENT

ASSUME CS:CODE

org 0100h

start:jmp start1

pbcd db 66h,88h             ;压缩BCD码:0x7102,0x7103

result db 5 dup(?)          ;结果:0x7104-0x7108

start1:       

    mov si,offset pbcd

    mov ah,[si]

    mov cl,4

    shr ah,cl

    mov al,ah

    mov dl,10

    mul dl                   ;结果在al中         

    mov dl,[si]

    and dl,0fh

    add al,dl

    mov bl,al   ;result

    inc si

    mov ah,[si]

    mov cl,4

    shr ah,cl

    mov al,ah

    mov dl,10

    mul dl                   ;结果在al中          

    mov dl,[si]

    and dl,0fh                 

    add al,dl

    mul bl

    mov dx,0

    mov bx,10000

    div bx

    mov [result],al

          

    mov ax,dx

    mov dx,0

    mov bx,1000

    div bx

    mov [result+1],al

        

    mov ax,dx

    mov dx,0

    mov bx,100

    div bx

    mov [result+2],al

    mov ax,dx

    mov dx,0

    mov bx,10

    div bx

    mov [result+3],al

    mov [result+4],dl                    

    nop

code ends

         end start

六、实验结果

运行程序后,可以看到结果数据区0x7104-0x7108依次存放着0,5,8,0,8;因此两压缩BCD码的乘积为5808

七、分析与总结

通过此次BCD码相乘的编程设计实验,我更加牢固的掌握了对BCD码数据的处理,更熟悉了二、十、十六进制数间的转换,通过这个实验也对其他指令的运用有了进一步比较深刻的了解以及对乘法运算程序的子模块的认识。

虽然有学习过C++但,本次微机原理实验还是比较困难,特别是设计题目部分,因此通过实验我认为我还要在微机课程上多花功夫和时间,才能更牢固的掌握这门课程所学到的知识。在此感谢老师在实验过程中对我的细心指导。

相关推荐