微机原理实验报告

实  验  报  告

        

    课程名称:        微机原理实验(软件)           

    实验名称:    实验1 两个多位十进制数相加

班    级      

学    号         

姓    名                  

指导教师     李北明            


实验一  两个多位十进制数相加实验

一、实验目的

 1、学习数据传送和算术运算指令的用法。

 2、熟悉在pc机上建立、汇编、链接、调试和运行汇编语言程序的过程。

二、实验内容

   1、将两个五位十进制相加。要求加数和被加数均以ASCII码形式各自顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。

   2,改变程序手动输入2个数相加

三、实验程序

原程序

CRLF MACRO                 ;建立宏指令CRLF

     MOV DL,0DH

     MOV AH,02H

     INT 21H

     MOV DL,0AH

     MOV AH,02H

     INT 21H

ENDM

DATA  SEGMENT

DATA1 DB 32H,33H,34H,35H,36H       ;第一个数据(作为被加数)

DATA2 DB 31H,32H,33H,34H,34H       ;第二个数据(作为加数)

DATA ENDS

STACK SEGMENT              ;堆栈段

STA   DB   20 DUP (?)

TOP   EQU  LENGTH STA

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA

START:  MOV  AX,DATA

        MOV  DS,AX

        MOV  AX,STACK

        MOV  SS,AX

        MOV  AX,TOP

        MOV  SP,AX

        MOV  SI,OFFSET DATA2

        MOV  BX,05

        CALL DISPL         ;显示被加数

        CRLF

        MOV SI,OFFSET DATA1

        MOV BX,05

        CALL DISPL         ;显示加数

        CRLF

        MOV DI,OFFSET DATA2

        CALL ADDA          ;加法运算

        MOV SI,OFFSET DATA1

        MOV BX,05          ;显示结果

        CALL DISPL

        CRLF

        MOV AX,4C00H

        INT 21H

DISPL PROC NEAR            ;显示子功能

DS1:  MOV AH,02

      MOV DL,[SI+BX-1]     ;显示字符串中一字符

      INT 21H

      DEC BX               ;修改偏移量

      JNZ DS1

      RET

DISPL ENDP

ADDA PROC NEAR

     MOV DX,SI

     MOV BP,DI

     MOV BX,05

AD1: SUB BYTE PTR [SI+BX-1],30H

     SUB BYTE PTR [DI+BX-1],30H

     DEC BX       

     JNZ AD1

     MOV SI,DX

     MOV DI,BP

     MOV CX,05             ;包括进位,共五位

     CLC                   ;清位进位

AD2: MOV AL,[SI]

     MOV BL,[DI]

     ADC AL,BL             ;带进位相加

     AAA                   ;非组合BCD码的加法调整

     MOV [SI],AL           ;结果送被加数区

     INC SI

     INC DI                ;指向下一位

     LOOP AD2              ;

     MOV SI,DX

     MOV DI,BP

     MOV BX,05

AD3: ADD BYTE PTR [SI+BX-1],30H

     ADD BYTE PTR [DI+BX-1],30H

     DEC BX

     JNZ AD3

     RET

ADDA ENDP

CODE ENDS

END  START

手动输入相加

CRLF   MACRO               

       MOV   DL,0DH

       MOV   AH,02H

       INT   21H                       

       MOV   DL,0AH

       MOV   AH,02H 

       INT   21H

       ENDM

DATA   SEGMENT               

DATA1  DB   20 DUP(?)       

DATA2  DB   20 DUP(?)       

DATA   ENDS

STACK  SEGMENT              

STA    DB  20  DUP(?)

TOP    EQU   LENGTH   STA

STACK  ENDS 

CODE   SEGMENT              

       ASSUME   CS:CODE,DS:DATA,SS:STACK,ES:DATA          

START: MOV AX,DATA           

       MOV DS,AX

       MOV AX,STACK           

       MOV SS,AX

       MOV AX,TOP

       MOV SP,AX

      

       MOV BX,05              

       MOV SI,OFFSET DATA1                

       CALL INPUT                     

       CRLF

       MOV BX,05              

       MOV SI,OFFSET DATA2

       CALL INPUT

       CRLF

       CRLF

       MOV   SI,OFFSET  DATA2        

       MOV  BX,06                     

       CALL DISPL       

       CRLF

       MOV  SI,OFFSET DATA1            

       MOV  BX,06

       CALL DISPL

       CRLF

       MOV  DI,OFFSET  DATA2        

       CALL ADDA                       

       MOV  SI,OFFSET  DATA1             

       MOV  BX,06

       CALL  DISPL

       CRLF

       MOV  AX,4C00H                       

       INT  21H

DISPL PROC NEAR                    

DSI:  MOV AH,02

      MOV DL,[SI+BX-1]                     

      INT 21H                          

      DEC BX

      JNZ DSI

      RET                       

      DISPL ENDP 

ADDA PROC NEAR    

     MOV  DX,SI

     MOV  BP,DI

     MOV  BX,06

AD1: SUB BYTE PTR[SI+BX-1],30H            

     SUB BYTE PTR[DI+BX-1],30H

     DEC BX

     JNZ AD1

     MOV SI,DX   

     MOV DI,BP

     MOV CX,06

     CLC          

AD2: MOV AL,[SI]

     MOV BL,[DI]

     ADC AL,BL

     AAA

     MOV [SI],AL

     INC SI

     INC DI                                 

     LOOP AD2

     MOV SI,DX

     MOV DI,BP

     MOV BX,06

AD3: ADD BYTE PTR[SI+BX-1],30H

     ADD BYTE PTR[DI+BX-1],30H

     DEC  BX

     JNE  AD3

     RET

INPUT PROC NEAR             

IN1:MOV AH,01

    INT 21H                          

    MOV [SI],AL

    INC SI

    DEC BX

    JNZ IN1                            

    RET

INPUT ENDP

ADDA ENDP

CODE ENDS

     END START

四 实验结果

图二

矩形标注: 修改后的程序
9999+8888=18887
矩形标注: 手动输入2个数相加的程序88888+99999=188887如图:图一为2个4位数相加,8888+9999=18887,符合事实

     图二为手动输入88888与99999,结果为18887,符合事实

五、Bug与修复

   在改变实验程序后,手动输入出现故障,后经检查发现语句出现遗漏,改正后,运行正常。

实  验  报  告

        

    课程名称:        微机原理实验(软件)           

    实验名称:      实验2 两个数相乘实验     

班    级    20120831         

学    号    2012083118        

姓    名              

指导教师    李北明            

实验二两个数相乘实验

一、实验目的

掌握乘法指令和循环指令的用法。

二、实验内容

    实现十进制数的乘法。被乘数和乘数均以ASCII码形式存放在内存中,实现两位十进制数乘五位十进制数,乘数和被乘数以及结果均在屏幕上显示出来。

三、实验程序

四、实现五位数乘两位的程序如下(更改部分标注在后面):

原程序

CRLF   MACRO                                 ;回车的宏命令

        MOV DL,0DH

        MOV AH,02H

        INT 21H

        MOV DL,0AH

        MOV AH,02H

        INT 21H

ENDM

DATA    SEGMENT

DATA1   DB      30H,30H,30H,30H,30H           ;五位乘数             

DATA2   DB      30H                           ;两位被乘数的十位

DATA3   DB      00H,00H,00H,00H,00H,00H,00H    ;五位乘数与十位被乘 

                                                  数乘积存放单元      

DATA4   DB      30H                            ;两位被乘数的个位

DATA5   DB      00H,00H,00H,00H,00H,00H,00H    ;五位乘数与十位被乘                                                                                                              数乘积存放单元      

RESULT  DB      7   DUP(00H)                   ;结果存放单元

DATA    ENDS

STACK   SEGMENT

STA     DB      20  DUP(?)

TOP     EQU     $-STA

STACK   ENDS

CODE    SEGMENT                                                    ASSUME  CS:CODE,DS:DATA,SS:STACK,ES:DATA

START:  MOV AX,DATA

        MOV DS,AX

        MOV AX,STACK

        MOV SS,AX

        MOV AX,TOP

        MOV SP,AX

        MOV SI,OFFSET DATA1+4                   ;输入五位乘数并显       

                                                     示

          MOV CX,05

LOOPP:  MOV AH,1                                                 

        INT 21H

        MOV [SI],AL

        DEC SI

        LOOP LOOPP

        CRLF

        MOV AH,1

        INT 21H

        MOV SI,OFFSET DATA2                ;键入被乘数十位

        MOV [SI],AL

        MOV AH,1                                                       

        INT 21H

        MOV SI,OFFSET DATA4                ;键入被乘数十位

        MOV [SI],AL

        CRLF

        MOV SI,OFFSET DATA2                ;五位乘数与被乘数十位相

                                         乘结果右移一位存放DATA3中

        MOV BL,[SI]

        AND BL,00001111B

        MOV SI,OFFSET DATA1

        MOV DI,OFFSET DATA3+1

        MOV CX,05                                                      

LOOP1:  MOV AL,[SI]

        AND AL,00001111B

        INC SI

        MUL BL

        AAM

        ADD AL,[DI]

        AAA

        MOV [DI],AL

        INC DI

        MOV [DI],AH

        LOOP LOOP1

        MOV SI,OFFSET DATA4               ;五位乘数与被乘数个位相                                                                                                                 

                                               乘结果存放在DATA5中

        MOV BL,[SI]

        AND BL,00001111B

        MOV SI,OFFSET DATA1

        MOV DI,OFFSET DATA5

        MOV CX,05

LOOP2:  MOV AL,[SI]

        AND AL,00001111B

        INC SI

        MUL BL

        AAM

        ADD AL,[DI]

        AAA

        MOV [DI],AL

        INC DI

        MOV [DI],AH

        LOOP LOOP2

        MOV SI,OFFSET DATA3

        MOV DI,OFFSET DATA5

        CALL ADDA

        MOV BX,07

        CALL DISPLL

        CRLF

        MOV AX,4C00H

        INT 21H

DISPLL  PROC NEAR                       ;结果显示子程序

DSI:    MOV AH,02

        MOV DL,[SI+BX-1]

        INT 21H

        DEC BX

        JNZ DSI

        RET

DISPLL  ENDP

ADDA    PROC NEAR                       ;将DATA3和DATA5相加并              

                                              化成ASCII码

        MOV DX,SI

        MOV BP,DI

        MOV CX,07

        CLC

AD2:    MOV AL,[SI]

        MOV BL,[DI]

        ADC AL,BL

        AAA

        MOV [SI],AL

        INC SI

        INC DI

        LOOP AD2

        MOV SI,DX

        MOV DI,BP

        MOV BX,7

AD3:    ADD BYTE PTR[SI+BX-1],30H

        ADD BYTE PTR[DI+BX-1],30H

        DEC BX

        JNZ AD3

        RET

ADDA ENDP

CODE ENDS

END START

手动输入五位数乘两位数

CRLF    MACRO

        MOV  DL,0DH

        MOV  AH,02H

        INT  21H

        MOV  DL,0AH

        MOV  AH,02H

        INT  21H

ENDM

DATA   SEGMENT

DATA1  DB   5 DUP(?)        ;加数

DATA2  DB   2 DUP(?)        ;被加数

RESULT DB 7 DUP (00H)

RESULT1 DB 7 DUP (00H)

DATA   ENDS

STACK  SEGMENT

STA    DB   20 DUP (?)

TOP    EQU  LENGTH STA

STACK  ENDS

CODE   SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA

START: MOV      AX,DATA

       MOV      DS,AX

       MOV      AX,STACK

       MOV      SS,AX

       MOV      AX,TOP

       MOV      SP,AX            

             

          MOV BX,05              

       MOV SI,OFFSET DATA1                 ;设置指针

       CALL INPUT                     ;调用输入函数INPUT

       CRLF

          MOV      AH,02

       MOV            DL,2AH

       INT       21H     

       MOV            CX,2

   LP1:MOV            DL,20H

       INT      21H

       LOOP          LP1          

       MOV BX,02               ;调用输入函数

       MOV SI,OFFSET DATA2

       CALL INPUT1  

       CRLF

      

       MOV      AH,02                       

       MOV            CX,7

   LP3:MOV            DL,2DH

       INT      21H

       LOOP          LP3

       CRLF   

      

       MOV      SI,OFFSET DATA2

       MOV      BL,[SI]

       MOV            BH,[SI+1]             

       AND      BL,00001111B

       MOV      SI,OFFSET DATA1

       MOV      DI,OFFSET RESULT

       MOV      CX,05      

LOOP1: MOV      AL,[SI]

       AND      AL,00001111B

       INC      SI

       MUL      BL

       AAM

       ADD      AL,[DI]

       AAA  

       MOV      [DI],AL

       INC      DI

       MOV      [DI],AH

       LOOP     LOOP1

      

       AND      BH,00001111B

       MOV      SI,OFFSET DATA1     

       MOV      DI,OFFSET RESULT1

       INC              DI

       MOV      CX,05      

LOOP2: MOV      AL,[SI]

       AND      AL,00001111B

       INC      SI

       MUL      BH            

       AAM

       ADD      AL,[DI]

       AAA  

       MOV      [DI],AL

       INC      DI

       MOV      [DI],AH

       LOOP     LOOP2

        MOV SI,OFFSET RESULT              

        MOV DI,OFFSET RESULT1

     MOV DX,SI

     MOV BP,DI   

     MOV SI,DX

     MOV DI,BP

     MOV CX,07

     CLC

AD2: MOV AL,[SI]

     MOV BL,[DI]

     ADC AL,BL

     AAA

     MOV [SI],AL

     INC SI

     INC DI

     LOOP AD2

     MOV SI,DX

     MOV DI,BP

        

       MOV      CX,07

       MOV      SI,OFFSET RESULT

DISPL: MOV      AH,02

       MOV      DL,[SI+6]

       ADD      DL,30H

       INT      21H

       DEC      SI

       LOOP     DISPL

       MOV      AX,4C00H

       INT      21H

      

INPUT PROC NEAR             

IN1:MOV AH,01

    INT 21H                 

    MOV [SI+4],AL

    DEC SI

    DEC BX

    JNZ IN1                            

    RET

INPUT ENDP

INPUT1 PROC NEAR             

IN2:MOV AH,01

    INT 21H                 

    MOV [SI+1],AL

    DEC SI

    DEC BX

    JNZ IN2                            

    RET

INPUT1 ENDP

CODE   ENDS

END    START

    

五、实验结果

 实验程序运行结果如下:

矩形标注: 43189*4=172756矩形标注: 实验讲义中程序执行结果

矩形标注: 99999*88=8799912 


如图:xc为实验讲义中例程,得到的结果为×3=135276,符合要求;52为改变后的试验程序,能实现五位数乘三位数,并将乘数、被乘数结果显示在屏幕上,图中为99999*99=9899901。结果正确,符合设计要求。

五、bug与修复

   改变实验程序后,五位的乘数只有被乘数十位相乘,通过将五位乘数存放单元DATA3变为七位才得到正常结果。

实  验  报  告

        

    课程名称:      微机原理实验(软件)           

    实验名称:      实验3 字符匹配程序        

班    级   20120831          

学    号   2012083118            

姓    名                 

指导教师    李北明               

实验三字符串匹配程序

一、实验目的

     掌握汇编语言中串操作指令的用法。

二、实验内容

用串操作指令设计程序,实现在存储区(长度为100H)中寻找空格字符,退出时给出能否找到信息,当找到时,能够显示出空格字符在内存中的位置。

三、实验程序(修改部分)

CRLF   MACRO

     MOV DL ,0DH

     MOV AH ,02H

     INT 21H

     MOV AH ,02H

     MOV DL ,0AH

     INT 21H

ENDM

      

             

DATAS SEGMENT

MESS1 DB  'INPUT THE SEGMENT ADDR:$'

MESS2 DB  'INPUT THE OFFSET ADDR :$'

MESS3 DB  'OK!HAS FOUND',0DH,0AH,'$'

MESS4 DB  'NO SPACE CHARACHTWE!',0DH,0AH,'$'

ERROR DB  'INPUT ERROR',0DH,0AH,'$' 

str   db   ' ',0dh,0ah,'$'

DATAS ENDS

STACKS SEGMENT

STA  DW   32 DUP (?)

TOP  DW   ?

STACKS ENDS

CODES SEGMENT

    ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS

   

START:

    MOV AX,DATAS

    MOV DS,AX

    MOV ES,AX

    MOV AH,09H

    MOV DX,OFFSET MESS1

    INT 21H

    CALL GETNUM

    MOV ES,DX

    MOV AH,09H

    MOV DX,OFFSET MESS2

    INT 21H

    CALL GETNUM

    MOV DI,DX

    CLD

    MOV CX,0100H

    MOV AL,20H

    REPNZ  SCASB

    JNZ CCC

    MOV AH,09H

    MOV DX,OFFSET MESS3

    INT 21H

     DEC DI

     MOV CH,4

LOP :MOV CL,4

     ROL DI,CL

     MOV DX,DI

     AND DL,0FH

     ADD DL,30H

     CMP DL,3AH

     JB NEXT

     ADD DL,7

NEXT:MOV AH,02H

     INT 21H

     DEC CH

     JNZ LOP

     MOV DX,OFFSET STR

     MOV AH,09H

     INT 21H

    JMP BBB

CCC:MOV AH,09H

    MOV DX,OFFSET MESS4

    INT 21H

BBB:MOV AX,4C00H

    INT 21H

GETNUM PROC NEAR

    PUSH CX

    XOR  DX,DX

GGG:MOV AH,01H

    INT 21H

    CMP AL,0DH

    JZ  PPP

    CMP AL,20H

    JZ PPP

    SUB AL,30H

    JB KKK

    CMP AL,0AH

    JB GETS

    CMP AL,11H

    JB KKK

    SUB AL,07H

    CMP AL,0FH

    JBE GETS

    CMP AL,2AH

    JB  KKK

    CMP AL,2FH

    JA  KKK

    SUB AL,20H

GETS:MOV  CL,04

     SHL DX,CL

     XOR AH,AH

     ADD DX,AX

     JMP GGG

KKK:MOV AH,09H

    MOV DX,OFFSET ERROR

    INT 21H

PPP:PUSH  DX

    CRLF

    POP DX

    POP CX

    RET

GETNUM ENDP

CODES ENDS

END START

四、实验结果

 

五、矩形标注: 显示找到矩形标注: 地址bug与修复

  本次实验十分顺利的得到了结果,未遭遇bug。

实  验  报  告

        

    课程名称:        微机原理实验(软件)           

    实验名称:      实验4 字符串匹配程序       

班    级   20120831             

学    号   2012083118           

姓    名              

指导教师    李北明               

实验四  字符串匹配程序

一、实验目的

     掌握显示提示信息的方法及接受键盘输入信息的方法。

二、实验内容

     1、编写程序,实现两个字符串比较。如果相同,则显示”MATCH”,否则,显示“NO MATCH”。

    2、改变程序,实现两个字符串比较。只有当两个字符串全部相同实结果显示“MATCH”。否则显示两个字符串中相同字符以及相同字符的个数。

三、实验程序

CRLF    MACRO            

       MOV  DL,0DH

       MOV  AH,02H

       INT  21H

       MOV  AH,02H

       MOV  DL,0AH

       INT  21H

ENDM

                     

DATA    SEGMENT

DATA1   DB   5 DUP (?)

MESS1   DB    'TOTALLY MATCH',0DH,0AH,'$'

MESS2   DB   'NO MATCH',0DH,0AH,'$'

MESS3   DB    'INPUT STRING1:',0DH,0AH,'$'

MESS4   DB    'INPUT STRING2:',0DH,0AH,'$'

MESS5   DB    'MIS: $'

MESS6   DB    'N: $'

MESS7   DB    'D : $'

MAXLEN1   DB    81

ACTLEN1   DB    ?

STRING1   DB    81  DUP(?)

MAXLEN2   DB    81

ACTLEN2   DB    ?

STRING2   DB    81  DUP(?)

DATA     ENDS

STACK   SEGMENT

STA       DB   50 DUP (?)

TOP       EQU        LENGTH STA

STACK   ENDS

CODE     SEGMENT

ASSUME    CS:CODE,DS:DATA,ES:DATA,SS:STACK

START:   MOV AX,DATA

             MOV       DS,AX

             MOV   ES,AX

          MOV   AX,STACK

          MOV   SS,AX

          MOV   SP,TOP

                MOV       AH,09H

               MOV       DX,OFFSET  MESS3        

                INT   21H                     

          MOV     AH,0AH

                MOV       DX,OFFSET  MAXLEN1

                INT   21H                      

          CRLF

          MOV     AH,09H

                MOV       DX,OFFSET  MESS4

                INT   21H                     

          MOV     AH,0AH

                MOV       DX,OFFSET  MAXLEN2

                INT   21H                     

          CRLF

         

          CLD

          MOV   SI,OFFSET STRING1

          MOV   CL,[SI-1]

          MOV   CH,00H

          MOV   DI,OFFSET STRING2

WANQUAN:  CMPSB     ;比较两字符串,完全相同则跳转至GGG,否则跳转至LLL                                                                       

          JNZ     LLL

          LOOP    WANQUAN

       

GGG:    MOV       AH,09H                    

        MOV     DX,OFFSET  MESS1   

        INT         21H

        JMP     PPP

LLL:    MOV     SI,OFFSET STRING1   

        MOV     CL,[SI-1]

        MOV     CH,00H

        MOV     BH,00H

       

KKK:    MOV     DI,OFFSET STRING2

        PUSH    CX

        MOV     BL,30H

        MOV     CL,[DI-1]

        MOV     CH,00H

        MOV     AL,[SI]

        MOV     DX,DI

LP1:    SCASB                    ;非重复比较,一次只比较一个数

        JZ      FOUND

        DEC     CX

        JNZ     LP1

        TEST    BL,0FH

              JZ          DIF

        JNZ     SAME

               

LP2:    INC     SI

        POP     CX

        LOOP    KKK

        TEST    BH,4FH     

        JNZ     PPP

        MOV     AH,09H

        MOV     DX,OFFSET  MESS2   

        INT         21H                  

        JMP     PPP

       

FOUND:  ADD     BL,01                    ;统计相同字符数子程序

        ADD     BH,01

        DEC     CX

        JNZ     LP1

                                 

SAME:   MOV      AH,09H                 ;字符串部分相同子程序 

        MOV     DX,OFFSET  MESS5

        INT         21H       

        MOV     AH,02H

        MOV     DL,[SI]

        INT     21H                 

        CRLF

        MOV AH,09H             

        MOV     DX,OFFSET  MESS6

        INT         21H

        MOV     AH,02H

              INC              BL

        MOV     DL,BL               

        INT     21H                 

        CRLF

        CRLF

        JMP     LP2

DIF:      MOV    AH,09H             

        MOV     DX,OFFSET  MESS7

        INT         21H

              MOV            AH,02H

              MOV            DL,[SI]

              INT       21H

              CRLF

        CRLF

        JMP     LP2

PPP:    MOV     AX,4C00H

        INT     21H                

CODE    ENDS

END     START

四  实验结果

 

 

五、bug与修复

   实验顺利没有bug。

相关推荐