微机原理与接口技术实验报告

   

实验一 数据传送............................................................................................. 2

实验二 算术运算............................................................................................. 8

实验三 代码转换........................................................................................... 14

实验四 程序的基本结构练习....................................................................... 20

实验五 存储器(RAM 6264)扩展............................................................. 25

实验六 可编程并行接口(8255)扩展....................................................... 28

实验七 可编程计数/定时器(8253)扩展.................................................. 34

实验八 A/D、D/A转换................................................................................ 45

实验九 可编程串行通信接口(8251)扩展............................................... 53


实验一:数据传送

实验学时:2

实验类型:验证

实验要求:必修

一.实验目的

1.学习程序设计的基本方法和技能,掌握用汇编语言设计、编写、调试和运行程序的方法;

学习用全屏幕编辑软件QEDIT.EXE建立源程序(.ASM文件);

学习用汇编软件MASM.EXE对源文件汇编产生目标文件(.OBJ文件);

学习用连接程序LINK.EXE对目标文件产生可执行文件(.EXE文件);

学习用调试软件TD.EXE调试可执行文件;

2.掌握各种寻址方法以及简单指令的执行过程。

二.实验器材

PC机

三.实验组织运行要求

1.利用堆栈实现AX的内容与BX的内容进行交换。堆栈指针SP=2000H,AX=3000H,BX=5000H;

2.汇编、调试、观察、记录结果;

⑴用QEDIT.EXE软件输入汇编语言源程序,以.ASM格式文件存盘;

⑵用MASM对源程序进行汇编产生二进制目标文件(.OBJ文件),再用连接程序LINK产生可执行文件(.EXE文件);

⑶用调试软件TD调试、运行程序,观察、记录结果。

四.实验步骤

1.进入子目录E:>\SY86后,利用QEDIT.EXE(简称Q)送入以下汇编语言源程序,并以 M1.ASM文件存盘

⑴汇编语言程序的上机过程

①进入\SY86子目录

E:>CD\SY868

E:\SY86>

②进入QEDIT.EXE 编辑界面

E:\SY86> Q8

③输入文件名*.ASM(如M1.ASM)后,输入源程序

源程序

DATA   SEGMENT  PARA   PUBLIC’DATA’       ;数据段定义

DB       512        DUP(0)

DATA   ENDS                                

STACK       SEGMENT       PARA STACK’STACK’      ;堆栈段定义

DB       512        DUP( ?)

STACK       ENDS                                    

CODE  SEGMENT  PARA   PUBLIC’CODE’      ;代码段定义

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

MAIN 

PROC FAR                                            ;定义过程程序

PUSH DS

MOV   AX,0

PUSH AX

MOV   AX,DATA

MOV   DS,AX

MOV  ES,AX

MOV    SP,2000h

MOV    AX,3000h

MOV    BX,5000h

PUSH   AX

PUSH   BX

POP      AX

POP      BX

RET

MAIN ENDP                                       ;结束主要部分程序

CODE ENDS                                   ;结束代码段

END  MAIN                                  ;结束汇编

⑵用MASM程序产生.OBJ文件

操作如下:

E:\SY86> MASM  M1.ASM  M1.OBJ8

Microsoft(R)Macro Assembler Version 5.00

Copyright(C)Microsoft Corp 1981-1985,1987.  All rights reserved.

Object Filename [HEXASC.OBJ]:8

Source listing            [NUL.LST]:8

Cross-reference        [NUL.CRF]:8

51576+385928 Bytes symbol space free

                   

      0 Warning Errors

      0 Severe  Errors

以上说明汇编过程已经完成。

⑶用LINK程序产生EXE文件

操作如下:

E:\SY86>LINK  M1.OBJ8

Microsoft(R)Overlay Linker Version 3.60

Copyright(C)Microsoft Corp 1983-1987.  All rights reserved.

Run File     [M1.EXE]:8

List File      [NUL.MAP]:8

Libraries     [.LIB]:8

E:\SY86>

LINK程序输出3个文件:.EXE文件;.LIB库文件;.MAP列表文件。连接过程全部完成,可以执行程序;

⑷在TD状态下用单步运行F8对M1.EXE文件进行调试,观察、记录结果。

E:\SY86>TD8

进入TD调试软件后用单步执行F8命令从首地址开始执行指令并观察相应变化。运行结果如下:

―F88

    AX=0000 BX=0000 CX=000D DX=0000 SP=2000 BP=0000 SI=0000 DI=0000

    DS=17F7 ES=17F7 SS=17F7  CS=17F7 IP=0103  NV UP DI PL NZ NA PO NC

    17F7:0103  B80030       MOV     AX,3000

―F88

    AX=3000 BX=0000 CX=000D DX=0000 SP=2000 BP=0000 SI=0000 DI=0000

    DS=17F7 ES=17F7 SS=17F7  CS=17F7 IP=0106   NV UP DI PL NZ NA PO NC

    17F7:0106  BB0050      MOV     BX,5000

―F88

    AX=3000 BX=5000 CX=000D DX=0000 SP=2000 BP=0000 SI=0000 DI=0000

    DS=17F7 ES=17F7 SS=17F7  CS=17F7 IP=0109   NV UP DI PL NZ NA PO NC

    17F7:0109  50         PUSH    AX

―F88

AX=3000 BX=5000 CX=000D DX=0000 SP=1FFE BP=0000 SI=0000 DI=0000

    DS=17F7 ES=17F7 SS=17F7  CS=17F7 IP=010A   NV UP DI PL NZ NA PO NC

    17F7:010A  53        PUSH    BX

―F88

    AX=3000 BX=5000 CX=000D DX=0000 SP=1FFC BP=0000 SI=0000 DI=0000

    DS=17F7 ES=17F7 SS=17F7  CS=17F7 IP=010B   NV UP DI PL NZ NA PO NC

    17F7:010B  58        POP              AX

―F88

    AX=5000 BX=5000 CX=000D DX=0000 SP=1FFE BP=0000 SI=0000 DI=0000

    DS=17F7 ES=17F7 SS=17F7  CS=17F7 IP=010C   NV UP DI PL NZ NA PO NC

    17F7:010C  5B       POP              BX

―F88

    AX=5000 BX=3000 CX=000D DX=0000 SP=2000 BP=0000 SI=0000 DI=0000

    DS=17F7 ES=17F7 SS=17F7  CS=17F7 IP=010D   NV UP DI PL NZ NA PO NC

17F7:010D  F4        HLT

2.用以上同样的方法,完成下列程序的调试:编辑、汇编、连接、运行程序,观察、记录结果。

⑴输入以下汇编程序(分号 “;” 后面内容不需输入)用单步运行执行程序,按分号后的要求记录结果。

源程序

DATA    SEGMENT PARA PUBLIC ‘DATA’

DATA    ENDS

STACK SEGMENT PARA STACK ‘STACK’

DB        512 DUP (?)

STACK       ENDS

CODE   SEGMENT PARA PUBLIC ‘CODE’

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

START  PROC FAR

PUSH    DS

MOV     AX,0

PUSH    AX

MOV     AX,DATA

MOV    DS,AX

MOV  ES,AX

MOV     AX,2000H                               ;AH=20H

MOV     DS,AX                                 ;AL=00H            DS=2000H

MOV     SS,AX                                      ;SS=2000H         AX=2000H

MOV     BX,2030H                               ;BH=20H            BL=30H

MOV     SI,BX                                       ;SI=2030H

MOV     DI,3040H                                 ;DI=3040H

MOV     SI,DI                                        ;SI=3040H

MOV     SP,50FFH                                 ;SP=50FFH

MOV     DX,SP                                      ;DH=50H            DL=0FFH

MOV     CL,25                                       ;CL=25(19H)

MOV     BL,CL                                      ;CL=19H             BL=19H

MOV     AH,0F0H                                 ;AH=0F0H

MOV     CH,AH                                    ;CH=0F0H

MOV     BYTE PTR[DI],64                  ;(DI)=40H

MOV     WORD PTR[SI],256               ;(SI)=00H         (SI+1)=01H

MOV     DL,[SI+1]                                ;DL=01H

MOV     DH,1+[SI]                                ;DH=01H

MOV     AL,1[SI]                                  ;AL=01H

MOV     WORD PTR[BX][SI],34         ;(BX+SI)=22H    (BX+SI+1)=00H

MOV     [BX+SI+4],BL                        ;(BX+SI+4)=19H

MOV     BP,2[BX+DI]                           ;BP=0100H

MOV     [BP],AL                                          ;(BP)=01H

MOV     AX,[BP][DI]                            ;AX=8B00H

MOV     BL,AL                                     ;BL=00H

MOV     ES,BX                                      ;ES=2000H

PUSH    BX                                           ;SP=50FDH        (SP,SP+1)=2000H

PUSH    DI                                             ;SP=50FBH        (SP,SP+1)=3040H

POP       CX                                           ;SP=50FDH        CX=3040H

POP       DX                                           ;SP=50FFH         DX=2000H

XCHG  AX,BP                                     ;AX=0101H        BP=8B00H

XCHG  DH,BL                                     ;DH=00H            BL=20H

LAHF                                                    ;FLAG=NV UP DI PL NZ NA PO NC

;FLAG=00000000    

;AH=02H

SAHF                                                     ;FLAG=NV UP DI PL NZ NA PO NC                                                                      ;FLAG=00000000

;AH=02H

PUSHF                                                  ;SP=50FDH        (SP,SP+1)=3102H

POPF                                                     ;SP=50FDH

                                                               ;FLAG= NV UP DI PL NZ NA PO NC

                                                               ;FLAG=00000000

NOP

START  ENDP

CODE   ENDS

END      START

⑵以文件名“E2”存盘;

⑶单步运行程序,每运行一条指令即检查相应结果并予以记录;

⑷利用断点运行、跟踪运行和全速运行等功能调试程序、运行程序并检查结果。

——运行结果:各寄存器及内存变化如上。

五.思考题

常用的数据传送指令有几种类型?试归纳并举例说明。

答:常用的数据传送指令有四种类型:

1.通用数据传送指令

⑴MOV OPRD1,OPRD2

例:MOV AX,2000H         ;AX=2000H

⑵压栈指令 ——  PUSH OPRD

出栈指令 ——  POP OPRD

例:PUSH AX                       ;SP=SP-2,(SP,SP+1)=AX

    POP AX                          ;AX=(SP,SP+1),SP=SP+2

⑶交换指令 —— XCHG PORD1,OPRD2

例:MOV AX,02FFH

       MOV BP,0001H

XCHG AX,BP                ;AX=0001H,BP=02FFH

2.累加器专用传送指令

⑴输入、输出指令 —— IN、OUT

例:IN AX,DX                   ;AX=( DX+1, DX)

    OUT DX,AX               ;( DX+1, DX) =AX

⑵换码指令  XLAT

例:XLAT                              ;AL=(BX+AL)

3.地址传送指令

⑴有效地址送寄存器 —— LEA  REG,SRC

例:LEA SI,DAT1                     ;SI=ADDR(DAT1)

⑵指针送DS和寄存器 —— LDS  REG,SRC

例:LDS DI,[BX]               ;DI=(DS×16+BX),DS=(DS×16+BX+2)

⑶指针送ES和寄存器 —— LES  REG,SRC

例:LES DI,[BX]               ;DI=(DS×16+BX),ES=(DS×16+BX+2)

4.标志寄存器传送指令

⑴标志传送指令

例:LAHF                             ;AH←PSW的低字节

    SAHF                              ;PSW的低字节←AH

⑵标志进、出栈

例:PUSHF                           ;SP←SP-2,(SP+1,SP)←PSW

    POPF                              ;PSW←(SP+1,SP),SP←SP+2

实验二:算术运算

实验学时:2

实验类型:设计

实验要求:必修

一.实验目的

1.验证算术运算基本指令;

2.正确使用加、减、乘、除程序,为设计综合算术运算程序打好基础;

3.学习独立编程;

4.深入学习、掌握TD调试软件的使用方法。

二.实验器材

PC机

三.实验内容及步骤

1.加、减法运算

⑴要求

调试以下程序

源程序

DATA           SEGMENT        PARA   PUBLIC ‘DATA’

DATA           ENDS

STACK        SEGMENT        PARA   STACK ‘STACK’

DB               512 DUP (?)

STACK       ENDS

CODE          SEGMENT        PARA   PUBLIC ‘CODE’

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

START         PROC FAR

PUSH    DS

MOV     AX,0

PUSH    AX

MOV     AX,DATA

MOV    DS,AX

MOV  ES,AX

MOV    AX,2040H                        ;AH=20H     ,   AL=40H,  CF=0

ADD     AL,AH                              ;AH=20H     ,   AL=60H,  CF=0

MOV     CX,257                             ;CX=0101H,    CF=0

MOV    SI,AX                               ;SI=2060H,

SUB      SI,CX                                ;SI=1F5FH,      CX=010H,       CF=0

SUB      CH,CL                              ;CH=00H,        CL=01H,   CF=0

ADC     AX,CX                             ;AX=2061H,    CX=0001H, CF=0

MOV     WORD PTR [SI],513              ;(SI,SI+1)=0201H

ADC   [SI],AL                         ;(SI,SI+1)=0262H,  CF=0

SBB      AX,[SI]                             ;AX=1DFFH,         CF=0

INC              BYTE PTR [SI+1]       ;(SI,SI+1)=0362H

DEC      BYTE PTR [SI]                ;(SI,SI+1)=0361H

DAA                                               ;AH=1DH, AL=65H, AF=1,CF=1

AAA                                               ;AH=1EH, AL=0BH, AF=1,CF=1

RET

START  ENDP

CODE   ENDS

END      START

——运行结果:各寄存器及内存数据如上。

2.加、减法程序设计

⑴要求

试设计、编写程序,计算(UP1)+(UP2)-(UP3),结果存放在DX中。如25+48-19=?其中UP1、UP2、UP3的内容均为二位十进制数,并以非压缩BCD码格式存入存储器:

(UP1)= 0205H,      (UP2)= 0408H,       (UP3)= 0109H

UP1 = 2050H,       UP2 = 2150H, UP3 =2250H

源程序

DATA          SEGMENT        PARA   PUBLIC ‘DATA’

DATA          ENDS

STACK              SEGMENT        PARA   STACK ‘STACK’

DB              512 DUP (?)

STACK      ENDS

CODE         SEGMENT        PARA   PUBLIC ‘CODE’

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

START        PROC FAR

PUSH   DS

MOV    AX,0

PUSH   AX

MOV    AX,DATA

MOV   DS,AX

MOV  ES,AX

MOV   AX,0000

MOV   DX,0000

MOV   SI,2050H

MOV   DI,2150H

MOV   BP,2250H

MOV   WORD  PTR[SI],0205H

MOV   WORD  PTR[DI],0408H

MOV   WORD  PTR[BP],0109H

MOV   AL,[SI]                      ;送被加数低8位

ADD   AL,[DI]                      ;低8位相加

AAA                                       ;加法ASCII调整

MOV   DL,AL                       ;暂存

MOV   AL,[SI+1]                  ;送被加数高8位

ADC   AL,[DI+1]                 ;带进位加

AAA                                       ;加法ASCII调整

XCHG  AL,DL                           ;AL与DL交换

SUB    AL,[BP]                            ;和的低8位减减数的低8位

AAS                                        ;减法ASCII调整

XCHG  AL,DL                           ;AL与DL交换,存低8位结果

SBB    AL,[BP+1]                 ;高8位带进位减

AAS                                        ;减法ASCII调整

MOV   DH,AL                       ;存高8位结果

RET

START ENDP

CODE  ENDS

END     START

——运行结果:DX=0504H

3.乘法程序设计

要求:

试设计、编写程序,计算(A)×(B)。A、B表示内存单元,分别存放着二个用非压缩BCD码表示的十进制数(如34、56)。内存单元(A)=04H,(A+1)=03H,内存单元(B)=06H,(B+1)=05H,计算结果应为非压缩的BCD码表示的十进制数,存放在以C为首地址的4个连续内存字节单元中。设内存单元A=2200H、B=2220H、C=2240H;

源程序

DATA          SEGMENT        PARA   PUBLIC ‘DATA’

DATA          ENDS

STACK              SEGMENT        PARA   STACK ‘STACK’

DB              512 DUP (?)

STACK      ENDS

CODE         SEGMENT        PARA   PUBLIC ‘CODE’

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

START        PROC FAR

PUSH   DS

MOV    AX,0

PUSH   AX

MOV    AX,DATA

MOV   DS,AX

MOV  ES,AX

MOV  AX,0

MOV  BX,0

MOV  DI,223AH

MOV  SI,2230H

MOV  AL,04H                                   ;被乘数低8位送AL

MOV  BL,06H                            ;乘数低8位送BL

MUL BL                                        ;相乘,AL=18H,CF=0

AAM                                              ;调整,AH=02H,AL=04H

MOV WORD PTR [DI],AX         ;存结果,(DI,DI +1)= 04H,02H

MOV AL,03H                               ;被乘数高8位送AL

MUL BL                                 ;被乘数高8位乘以乘数低8位,AL=12H,CF=0

AAM                                              ;调整,AH=01H,AL=08H

ADD AL,[DI+1]                           ;部分积相加,AL=0AH

AAA                                              ;调整,AH=02H,AL=00H,AF=1,CF=1

MOV WORD PTR [DI+1],AX     ;存结果,(DI +1,DI +2)= 00H,02H

MOV AL,04H                               ;被乘数低8位送AL

MOV BL,05H                               ;乘数高8位送BL

MUL BL                                        ;相乘,AL=14H

AAM                                              ;调整,AH=02H,AL=00H

MOV WORD PTR[SI],AX           ;存结果,(SI,SI +1)= 00H,02H

MOV AL, 03H                              ;被乘数高8位送AL

MUL BL                                        ;被乘数高8位乘以乘数高8位,AL=0FH

AAM                                              ;调整,AH=01H,AL=05H

ADD AL,[SI+1]                                   ;部分积相加,AL=07H

AAA                                              ;调整,AH=01H,AL=07H,AF=0,CF=0

MOV WORD PTR [SI+1],AX     ;存结果,(SI+1,SI +2)= 07H,01H

MOV AL,[DI]                               ;AL=04H

MOV BP,2240H                            ;乘积首址2240H

MOV [BP],AL                              ;存积低位,(2240H)=04H

MOV AL,[DI+1]

ADD AL.[SI+1]

AAA                                              ;调整,AH=01H,AL=00H,AF=0,CF=0

MOV [BP+1],AL                          ;存积低位加1,(2241H)=00H

MOV AL,[DI+2]                          ;AL=02H

ADC AL,[SI+1]                           ;AL=09H,AF=0,CF=0

AAA                                              ;调整,AH=01H,AL=09H

MOV [BP+2],AL                          ;存积低位加2,(2242H)=09H

MOV AL,0

ADC AL,[SI+2]                           ;AL=01H,AF=0,CF=0

AAA                                              ;调整,AH=01H,AL=01H

MOV [BP+3],AL                          ;存积高位,(2243H)=01H

RET

START ENDP

CODE  ENDS

END     START

——运行结果:(2243H)=01H,(2242H)=09H,(2241H)=00H,(2240H)=04H;积=1904H

4.除法程序设计(选做)

⑴要求

试设计、编写程序,计算(A)/(B),A、B表示内存单元,数据自定。其中除数(B)是16位十六进制数,存放在BX中;被除数(A)是32位十六进制数,高16位存放在DX,低16位存放在AX中;结果为32位十六进制数的商存放在BX:AX中;16位十六进制余数存放在DX中。

设置数据时如果除数等于零或者商大于16位,则应考虑溢出处理。

源程序(避免溢出的除法程序)

STACK       SEGMENT PARA STACK 'STACK'

       DW 32 DUP(0)

STACK ENDS

DATA        SEGMENT PARA 'DATA'

DATA        ENDS

CODE SEGMENT PARA 'CODE'

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

DIVUO       PROC FAR

        PUSH DS

        MOV AX,0

        PUSH AX

         MOV AX,DATA

         MOV DS,AX

        MOV AX,1FCDH                   ;被除数低16位

        MOV DX,3B78H                    ;被除数高16位

        MOV BX,7C9AH                   ;16位除数

        CMP BX,0                               ;除数=0?

        JNZ DVROK                          ;不为零,转

        DIV BX                                          ;为零,除

        JMP SHORT GO_DOS

DVROK:      PUSH ES

        PUSH DI

        PUSH CX

        MOV DI,0                               ;取出当前的INT 0向量并保存之

        MOV ES,DI                           

        PUSH ES:[DI]

        PUSH ES:[DI+2]

        LEA CX,OVR_INT                ;获得INT 0向量

        MOV ES:[DI],CX

MOV CX,SEG OVR_INT

        MOV ES:[DI+2],CX

        DIV BX                                          ;做除法

        SUB BX,BX

RESTORE:

POP ES:[DI+2]                        ;恢复 INT 0 向量

        POP ES:[DI]

        POP CX

        POP DI

        POP ES

GO_DOS:

       RET

OVR_INT:

       POP CX

        LEA CX,RESTORE

        PUSH CX

        PUSH AX

        MOV AX,DX

        SUB DX,DX

        DIV BX

        POP CX

        PUSH AX

        MOV AX,CX

        DIV BX

        POP BX

IRET

DIVUO ENDP

CODE   ENDS

END     DIVUO

       ——运行结果:商BX:AX=7A2EH,余数DX=5821H

程序流程框图

 

四.思考题

1.若对两个带符号的双精度数作加、减法运算,该怎样处理。

答:如果对两个带符号的双精度数作加、减法运算,则运算应按照带符号的加、减法考虑。

2.在编写乘法程序时,若(B)是一个带符号非压缩的BCD码,则程序应该怎样编写。

答:如果乘数是一个带符号非压缩的BCD码,则运算应按照带符号的乘法考虑。首先保存被乘数和乘数的符号位,正常运算后,在结果加上符号位。

实验三:代码转换

实验学时:2

实验类型:设计                    

实验要求:必修

一.实验目的

1.设计常见的代码转换程序,通过实际操作,调试并检验所设计程序的正确性;

2.提高独立编程的能力。

二.实验器材

PC机

三.实验内容

1.十六进制数→ASCII码

要求:

试设计、编写程序,将一个十六进制数0FBE9H转换为ASCII码并在屏幕上显示出来。

源程序

   NAME  HEXASC

DATA        SEGMENT PARA PUBLIC 'DATA'

HEX           DW 0EBF9H

ASC           DB 20 DUP(0)

DATA        ENDS

STACK       SEGMENT PARA STACK 'STACK'

DB     512 DUP (?)

STACK       ENDS

CODE        SEGMENT PARA PUBLIC 'CODE'

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

START PROC FAR

          PUSH DS

                 MOV AX,0

          PUSH AX

                 MOV AX,DATA

          MOV DS,AX

   MOV ES,AX

MOV CX,0004H

                     MOV AX, HEX               ;取十六进制数0EBF9H

                 LEA BX,ASC

     AA:      PUSH CX

MOV CL,04H                  ;给循环计数器赋转换代码长度

                 ROL AX,CL                            ;十六进制数循环左移

               PUSH AX

        AND AX,000FH

                 CMP AL,0AH                  ;判别是否为“0~9”

               JB ASCII                          ;是“0~9”转ASCII

               ADD AL,07H

ASCII:  ADD AL,30H

               MOV DH,AL

               MOV CL,04H                  ;给循环计数器赋转换代码长度

               SHR DH,CL                            ;逻辑右移

               MOV DL,AL

               AND DX,0F0FH

               OR DX,3030H

               MOV [BX],DH                ;(BX)=46H,(BX)=42H,(BX)=45H, (BX)=39H,

               INC BX

               MOV [BX],DL

               INC BX

               POP AX

               POP CX

        LOOP AA

                 MOV AL,'$'

               MOV [BX],AL

        MOV AH,09H

                 LEA DX,ASC

               INT 21H

        RET

START        ENDP

      CODE        ENDS

                END START

——在TD状态下分别用单步执行、全速运行对HEXASC.EXE文件进行调试、运行,结果正确;

——在DOS状态下运行可执行文件HEXASC.EXE,结果正确。屏幕显示:45424639。

2.ASCII码→BCD码

要求:

试设计、编写程序,完成以下功能。设有一组ASCII码数据:3332H,3537H,3946H,3239H,3642H,…,存放在起始地址为DS:150H的连续内存单元内,数组长度存入CX 。经过转换后的BCD码存放在起始地址为DS:160H的连续内存续单元内,如果待转换的数据不是十进制数的ASCII码,则对应的结果单元存放“0FFH”。

源程序

NAME ASCBCD

DATA SEGMENT PARA PUBLIC'DATA'

ORG  0150H

DATA1 DW 3332H,3537H,3946H,3239H,3642H

ORG  0160H

DB  10  DUP(?)

DATA  ENDS

STACK  SEGMENT  PARA  STACK'STACK'

DB  512  DUP(?)

STACK  ENDS

CODE SEGMENT PARA PUBLIC'CODE'

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

START PROC FAR

PUSH DS

MOV AX,0

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV CX,0AH                        ;循环计数器赋转换代码数组长度

LEA DI,DATA1                     ;ASCII首址送DI

LEA SI,DATA2                      ;BCD首址送SI

BB:

MOV BL,0FFH                       ;错误标志BL

MOV AL,[DI]                         ;ASCII码送AL

CMP AL,3AH                         ;检查是否为大于9的ASCII码

JNB DONE                             ;是转DONE

SUB AL,30H                           ;不是,取ASCII码低4位

JB DONE                                ;小于0的十进制数,转DONE

MOV BL,AL                           ;BCD码送BL

DONE:

MOV AL,BL                           ;错误标志或结果送AL

MOV [SI],AL                          ;转换结果送BCD数据区

INC DI

INC SI

LOOP BB                                ;(CX)不为0,转BB

RET

START  ENDP

CODE  ENDS

END START

——运行结果:从DS:160H开始的连续内存单元的BCD码数据为:

                         02,03,07,05,0FF,09,09,02,0FF,06,…。

程序流程框图

 

3.BCD码→二进制

要求:

试设计、编写程序,完成以下功能。有一组非压缩的BCD码数据存放在起始地址为DS:180H的连续内存单元内,数组长度存入CX。经过转换后的二进制数存放在起始地址为DS:190H的连续内存单元内。

非压缩的BCD码数据如下:

0802,0103,0009,0706,0407,…。

源程序

NAME  BCD2

DATA  SEGMENT

ORG  0180H

DAT1  DW 0802H,0103H,0009H,0706H,0407H

ORG  0190H

DAT2  DB 10 DUP(?)

DATA  ENDS

STACK  SEGMENT  PARA  STACK'STACK'

DB  512  DUP(?)

STACK  ENDS

CODE  SEGMENT

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

START  PROC  FAR

    PUSH  DS

    MOV  AX,0

    PUSH  AX

    MOV  AX,DATA

MOV  DS,AX

MOV  ES,AX

MOV  CX,05H                      ;循环计数器赋转换代码长度

LEA  DI,DAT1                     ;BCD码首址送DI

      LEA  SI,DAT2                      ;二进制首址送SI

XL: MOV  AL,[DI+1]                  ;BCD码十位数值赋AL

    MOV  BL,0AH

    MUL  BL                              ;乘10

    INC  DI

    MOV  AH,00H

    ADD  AX,[DI]                            ;BCD码十位和个位相加,转换结束

    MOV  [SI],AL                      ;转换结果存二进制起始地址

    INC  DI

    INC  DI

    INC  SI                                 ;(CX)不为0转AA

    LOOP  XL

    RET

START ENDP

CODE ENDS

    END START

       ——运行结果:从DS:190H开始的连续内存单元的二进制数据为:

                                52H,0DH,09H,4CH,2FH,…。

程序流程框图

 

四.思考题

1.对以上几种代码转换的方法,除了你已调试通过的程序外,还有没有其它的方法实现转换?至少再列举一种程序。

答:对BCD码转换为二进制,BCD码的十位数乘以10再加上BCD码的个位数可用以下语句实现转换:

MOV BH,00H

MOV BL,AL

MOV AL,AH

MOV AH,00H

MOV CL,10

MUL CL

ADD AX,BX

实验四:程序的基本结构练习

实验学时:3

实验类型:设计

实验要求:必修

一.实验目的

1.熟悉程序设计中的查表、分支与循环和排序等方法;

2.进行综合程序设计练习,巩固汇编语言设计和调试能力。

二.实验器材

PC机

三.实验内容

1.查表处理

要求:

试设计、编写程序,完成数组查表处理。

设有一组首地址为list的字数组:12,11H,22H,33H,44H,55H,66H,77H,88H,99H,111H,222H,333H,该数组的第一个字中放着数组长度,将该数组的首地址存放到DI寄存器中。程序运行之前在AX寄存器中存放一个数,如(AX)=55H,要求在数组中查找该数。如果找到此数就把它从数组中删除,如果没有找到则不对数组作任何处理退出程序。

            源程序

DATA   SEGMENT

LIST  DW 12,11H,22H,33H,44H,55H,66H,77H,88H,99H,111H,222H,333H

DATA   ENDS

CODE   SEGMENT

DEL_UL      PROC  FAR

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

MAIN:  PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AX,55H

CLD                                         ;使DF=0,执行串处理指令时地址自动增量

LEA DI, LIST                         ;取得数据区首地址

PUSH DI

MOV CX,ES:[DI]                   ;取数组长度,CX=000CH

ADD DI,2                                ;数组首址

REPNE SCASW                            ;字符串比较

JE DELETE                             ;字符相同转移

JMP SHORT EXIT                 ;字符不同转EXIT,不做处理

DELETE:  JCXZ DEC_CNT       ;CX寄存器内容为0则到数据区尾转结束

NEXT_EL:  MOV BX,ES:[DI]

MOV ES:[DI-2],BX

ADD DI,2

LOOP NEXT_EL    

DEC_CNT:  POP DI

DEC WORD PTR ES:[DI]

EXIT:    RET

DEL_UL ENDP

CODE   ENDS

END      MAIN

——运行结果:可正确查找到AX寄存器中存放的数据并作出处理。

相关推荐