汇编语言上机实验指导

时间:2024.4.13

汇编语言上机实验指导书

实验要求:

1、      上机前作好充分准备,包括程序框图、调试步骤、测试方法、对运行结果的分析等。

2、      上机时要遵守实验室的规章制度,爱护实验设备。要熟悉与实验相关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。在程序的调试过程中,有意识地学习及掌握DEBUG程序的各种操作命令,以便掌握程序的调试方法及技巧。

3、      为了更好地进行上机管理,要求用硬盘(注:F盘下)存储程序,以避免文件丢失,实验结束后将程序上传到ftp://10.10.77.77,“!教学专区”文件夹下的“xuben”文件夹下“微机接口技术”文件夹中相应目录下。此外,要求实验者按以下形式命名实验文件:

学号+字母(a/b/c…).扩展名

比如:03光信2班章以敏编制的第2个程序,则命名为:031071203205b.asm

4、      程序调试完后,须由实验辅导教师在机器上检查运行结果。

5、      每个实验完成后,应写出实验报告。

实验报告:

实验报告的要求如下:

①     基本信息。

包括:课程名称、实验名称、专业、班级、姓名、实验时间。

②     实验报告编写要规范。

应包括:实验名称、目的、内容、原理、实验步骤、实验记录、数据处理(或原理论证、或实验现象描述、或结构说明等)。

③   实验报告应附有实验原始记录和源程序清单。

加强实践能力的培养

实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。其中包括:实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等;开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或本分改变程序加以实现。

实验一 利用DEBUG调试程序调试程序段(选做)

1.         实验目的:

(1)      熟悉DEBUG有关命令的使用方法

(2)      利用DEBUG掌握有关指令的功能

(3)      利用DEBUG运行简单的程序段

2.         实验内容

(1)      进入和退出DEBUG程序

(2)      学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应试一下。

(3)      利用DEBUG,验证乘法、除法、加法、减法、带进位加、带借位减、堆栈操作指令、串操作指令的功能。

3.         实验准备

(1)      仔细阅读有关DEBUG命令的内容,对有关命令,都要事先准备好使用的例子。

(2)      作为例子,准备用A命令,输入在显示器上显示字符“S”的系统调用程序段。

(3)      阅读将AX左移9位的程序段。

4.         实验步骤

(1)      在DOS提示符下,进入DEBUG程序。

(2)      在DOS目录下启动DEBUG。

(3)      详细记录每一步所用的命令,以及查看结果的方法和具体结果。

5.         实验报告要求

(1)      如何启动和退出DEBUG程序。

(2)      整理每个DEBUG命令使用的方法,实际示例及执行结果。

(3)      启动DEBUG后,要装入某一个.EXE文件,应通过什么方法实现?

实验二 分支程序实验(必做)

1.         实验目的:

(1)      掌握分支程序的设计方法

(2)      掌握利用DEBUG修改参数、检查结果的方法。

(3)      掌握汇编语言源程序的编辑、汇编、连接及调试过程。

2.         实验内容

(1)      编写一个程序,显示AL寄存器中的两位十六进制数

(2)      编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符<CR>(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

3.         实验准备

(1)      编写实验内容要求的两个程序。

(2)      写出调试以上程序,即修改程序参数,检查结果的操作方法。

(3)      熟悉源程序汇编、连接命令的使用方法即要回答的内容。

4.         实验步骤

(1)      用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。

(2)      对其进行汇编及连接,产生.EXE文件。

(3)      对.EXE文件进行调试运行。

a.       用DEBUG调试运行,学会修改AL内容的方法。

b.       对DSPKEY.EXE键入不同的字符,分别进行调试。

c.       在MS-DOS下运行这两个.EXE文件。

5.         实验报告要求

     画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。

6.         参考程序清单

(1)      显示AL中两位十六进制数程序:

;DISPHEX.ASM

CODE SEGMENT

      ASSUME CS:CODE

START: MOV AL,3EH

       MOV BL,AL

       MOV DL,AL

       MOV CL,4

       SHR DL,CL

       CMP DL,9

       JBE NEXT1

       ADD DL,7

NEXT1: ADD DL,30H

       MOV AH,2

       INT 21H                  ;显示高位ASCII码

       MOV DL,BL

       AND DL,0FH

       CMP DL,9

       JBE NEXT2

       ADD DL,7

NEXT2: ADD DL,30H

       MOV AH,2

           INT 21H                  ;显示低位ASCII码

           MOV AH,4CH

           INT 21H

CODE  ENDS                   ;返回DOS

       END START

(2)      显示键入字符程序

;DISPKEY.ASM

CODE   SEGEMENT

         ASSUME CS:CODE

START:  MOV AH,1

         INT 21H                     ;等待键入字符,送AL

         CMP AL,0DH                 ;是否是回车符?

         JZ  DONE                   ;是则转DONE退出程序

         CMP AL,’0’

         JB NEXT

         CMP AL,’9’

         JA CHARUP

         MOV DL,AL

         MOV AH,2

         INT 21H

         JMP START

CHARUP: CMP AL,41H

         JB NEXT

         CMP AL,5AH

         JA CHRDN

DISPC:   MOV DL,’C’

         MOV AH,2

         INT 21H

NEXT:   JMP START

CHRDN:  CMP AL,61H

         JB NEXT

         CMP AL,7AH

         JA NEXT

         JMP DISPC

DONE:   MOV AH,4CH

         INT 21H

CODE:   ENDS

         END START

实验三 循环程序实验(必做)

1.         实验目的:

(1)      掌握循环程序的设计方法

(2)      进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(3)      学会针对不同的问题,选用不同的组织循环的方法。

2.         实验内容

(1)      编写一个程序,用二进制显示从键盘输入一个字符的ASCII码。

(2)      编写一个程序,记录某个字存储单元数据中1的个数,以十进制形式显示结果。

3.         实验准备

(1)      编写实验内容要求的两个程序。

(2)      写出调试以上程序,即修改程序参数,检查结果的操作方法。

(3)      熟悉源程序汇编、连接命令的使用方法即要回答的内容。

4.         实验步骤

(1)      用EDIT或其它编辑软件,编写.ASM源程序,例如Binary.ASM及Statistic.ASM。

(2)      对其进行汇编及连接,产生.EXE文件。

(3)      对.EXE文件进行调试运行。

a.       用DEBUG调试运行,学会修改AL内容的方法。

b.       对DSPKEY.EXE键入不同的字符,分别进行调试。

c.       在MS-DOS下运行这两个.EXE文件。

5.         实验报告要求

     画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。

6.           参考程序段清单:

;Binary.asm

mov cx,8    ;CX←8(循环次数)

again:  shl bl,1    ;左移进CF,从高位开始显示

mov dl,0    ;MOV指令不改变CF

adc dl,30h  ;DL←0+30H+CF

;CF若是0,则DL←' 0 '

;CF若是1,则DL←' 1 '

mov ah,2

int 21h ;显示

loop again

;CX减1,如果CX未减至0,则循环

;Statistic.ASM

    ;数据段

number  dw 1110111111100100B   

    ;代码段

    mov bx,number

    xor dl,dl   ;循环初值:DL←0

again:  test bx,0ffffh  ;也可以用cmp bx,0

    jz done

    ;全部是0就可以退出循环,减少循环次数

    shl bx,1    ;用指令shr bx,1也可以

    adc dl,0

    ;利用ADC指令加CF的特点进行计数

    jmp again

done:   cmp dl,10   ;判断1的个数是否小于10

    jb digit    ;1的个数小于10,转移

    push dx

    mov dl,‘1’    ;1的个数大于或等于10

    mov ah,2    ;则要先显示一个1

    int 21h

    pop dx

    sub dl,10

digit:  add dl,‘0’    ;显示个数

    mov ah,2

    int 21h

实验四  子程序实验(一)(选做)

本实验的目的在于让读者掌握同一模块调用的方法。

1.  实验目的

(1)       掌握主程序与子程序之间的调用关系及调用方法。

(2)       掌握子程序调用过程中近程调用与远程调用的区别。

(3)       掌握通过堆栈转送参数的方法。

2.  实验内容

(1)       将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示.

(2)       编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数).

3.  实验说明

(1)       第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。

(2)       第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。

(3)       第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。

4.  实验准备

(1)       预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图。

(2)       熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

5.  实验步骤

(1)       编辑、汇编两个源程序,生成相应的可执行文件(。EXE)

(2)       用DEBUG的R 命令,T 命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。

(3)       检查程序执行的结果是否正确。

6.  实验报告要求

(1)       分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。

(2)       说明用堆栈传送参数的过程及其具体方法。

(3)       分析实验结果及所遇到问题,并说明解决的方法。

7.参考程序清单

 (1)码型转换程序清单:

;CONV.ASN

DATA  SEGMENT

BUF   DB 0ABH,0CDH,0DEH,01H,02H,03H

DB 3AH,4BH,5CH,6FH

DATA   ENDS

CODE  SEGMENT

        ASSUME CS:CODE,DS:DATA

START:  MOV AX,DATA

         MOV DS,AX

         MOV CX,10

         LEA  BX,BUF

AGAIN: MOV AL, [BX]

        CALL HEXASC

        INC BX

        LOOP AGAIN

        MOV AH,4CH

        INT 21H

HEXASC PROC NEAR

MOV DL,AL

PUSH  CX

MOV  CL,4

SHR   DL,CL

POP   CX

CALL  DISP   ;显示高位HEX数

MOV   DL,AL

AND   DL,0FH

CALL  DISP

RET

HEXASC ENDP

DISP    PROP

        CMP   DL,9

        JBE    NEXT

        ADD   DL,7

NEXT:  ADD  DL,30H

        MOV  AH,2

        INT  21H     ;显示

        RET

DISP  ENDP

CODE  ENDS

       END START

(2)统计并显示某键入字符的个数的程序:

        :COUNTER.ASM

DATA   SEGMENT

CHAR  DB ‘b’

BUF    DB 50H, ? 50H DUP(?)

DATA   ENDS

MCODE  SEGMENT

        ASSUME CS: MCODE, DS: DATA

START:  MOV  AX,DATA

         MOV  DS,AX

         LEA   DX,BUF

         MOV  AH,9

]        INT   21H

         LEA   SI  BUF

         MOV  CL, [SI+1]

         MOV  CH, 0   ;CX中为字符串长度

         INC    SI

         INC    SI      ;SI指向串首址TABLE

         MOV  AL,CHAR

         MOV  AH,0     ;AX中为待查字符

         PUSH  SI

         PUSH  CX    

PUSH   AX  ; 参数送堆栈

CALL   CHECK

POP    AX   :统计个数在AL中

        MOV   DL,CHAR

        MOV   AH,2

        INT    21H

        MOV   DL,AL

        AND   DL, 0FH

        CMP   DL,9

        JBE    NEXT

        ADD   DL,7

NEXT:  ADD  DL,30H

        MOV  AH,2

        INT   21H        ;显示统计个数

        MOV  AH,4CH

        INT  21H

M CODE  ENDS

SCODE   SEGMENT

        ASSUME  CS:SCODE

CHECK  PROC  FAR

         PUSH  BP

         MOV   BP,SP

         MOV   SI,[BP+10]

         MOV   CX, [BP+8]

         MOV   AX, [BP+6]

         XOR   AH, AH

AGAIN:  CMP   AL.[SI]

         JNE    NEXT1

         INC    AH

NEXT1:  INC    SI

         LOOP  AGAIN

         MOV  AL, AH

         MOV  [BP+10],AX

         POP  BP

         RET  4

CHECK  ENDP

         END  START

实验五 子程序实验(二)(选做)

本程序的目的在于使读者掌握模块间调用子程序的编写方法.

1.实验目的

(1) 了解多模块程序设计方法.

(2) 学会使用PUBLEC和EXTRN 伪指令解决模块间的符号(如变量名,标号等)通信问题.

2. 实验内容

(1)编写一个子程序,将主程序设定的内存中字符串的小写字母转换成大写字母并显示出来.主程序用另一个模块编写.

(2)编写一个子程序,将主程序指定的字符所在的地址返回给主程序,字符串与主程序在同一个模块.

3.实验准备

(1)仔细阅读教材中有关模块间通信的方法及模块程序设计的方法.

(2)弄清伪指令PUBLIC及EXTRN的功能及用法.

4.实验步骤

(1)分别对实验1和实验2的主、子模块进行汇编,在连接时,将它们装配成一个以 .EXE为扩展名的可执行文件.观察汇编及连接过程中有无错误.

(2)对.EXE 文件进行调试及运行.

(3)将实验1中的原字符串改为由键盘输入,然后由子模块将源串中的小写字母转换为大写字母,并将源串与转换后的两个字串分两行显示出来(设键入字串长度小于80个字符).

5.实验报告要求

(1)对源程序清单,画出相应的程序流程图.

(2)扼要总结多模块程序的特点和编写方法.

6.参考程序清单

转换字符串小写字母为大写字母的程序清单:

;EXCHAR.ASM为主模块的文件名

EXCHAR.DNTOUP:FAR

PUBLIC   STRING1,STRING2

DATA     SEGMENT

STRING1  DB‘THIS IS A BOOK’,‘$’

STRING2  DB  80 DUP(?)

DATA     ENDS

CODE     SEGMENT

           ASSUME CS:CODE,DS:DATA

START     MOV  AX,DATA

          MOV   DS, AX

          CALL  DNTOUP

          MOV   AH,4CH

          INT     21H

CODE    ENDS

          END   START

:DNTOUP。ASM为子模块的文件名

PUBLIC   DNTOUP

EXTRN   STRING1:BYTE,STRING2:BYTE

CODE    SEGMENT

DNTOUP  PROC  FAR

          MOV   BX,0

CYCLE: MOV   AL,STRING1[BX]

         CMP   AL,24H   ;是否是STRING1结尾

         JZ   DONE     ;是“$”,转DONE

CMP  AL,61H  ;是小写字母么?

JB    NEXT     ;不是转NEXT

CMP  AL,7AH

JA    NEXT

SUB  AL, 20H   ;转为大写字母

NEXT:    MOV  STRING2[BX],AL

           INC  BX

           JMP CYCLE

DONE:   MOV  AL。‘$’

           MOV  STRING2[BX],AL  ;不一个$

           MOV  DL,0DH

           MOV  AH, 2

           INT   21H

           MOV  DL,0AH

           INT   21H       ;显示回车,换行

           LEA  DX, STRING1

           MOV  AH,9     

INT    21H     ;显示源串内容

           MOV   DL,OAH

           MOV   AH, 2

           INT    21H         ;回车换行

           MOV   DX ,OFFSET STRING2

           MOV   AH,9

           INT    21H        ;显示转换后的大写串

           RET

DNTOUP   ENDP

CODE     ENDS

           END

(2)找指定字符,并返回地址植的程序清单

   ;MAING。ASM为主模块程序名

EXTRN  FINDC:FAR

PUBLIC  STRN

DATA    SEGMENT

STRN    DB‘LINK DISPLAY SUBROUTING$’

ADDR   DW?

DATA    ENDS

CODE   SEGMENT

        ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

        MOV DS,AX

        MOV  AH,1

        INT   21H

        CALL  FINDC

MOV  ADDR, DI

MOV  AH,4CH

INT    21H

CODE      ENDS

           END   START

;FINDC。ASM为子模块程序名

PUBLIC    FINDC

EXTRN    STRN:BYTE

CODE     SEGMENT

           LEA   DI,STRN

AGAIN:  CMP BYTE  PTR[DI],‘$’

           JZ  DONE

           CMP  AL,[DI]

           JNZ   NEXT

DONE1:   RET

NEXT:    INC  DI

          JMP   AGAIN

DONE1:   MOV  DI,0FFFFH   ;找不到返回0FFFFH

          JMP   DONE1

FINDC    ENDP

CODE     ENDS

           END

(3)如由键盘输入字符串,则可在程序1 的主模块DATA段中加一行提示信息IMAGE:IMAGE  DB ‘INPUT A STRING PLEASE:$’然后在主模块的CALL 指令前插入以下程序段

          LEA   DX,IMAGE

          MOV   AH,9

          INT   21H

          LEA   DX,STRING2+1

          MOV AH,0AH

          INT    21H           ;将键入串存入STRING2

          LEA   SI,STRING2+2

          MOV   CL,0

          LEA    DI ,STRING1

AGAIN:  MOV  AL,[SI]

          MOV  [DI],AL

          INC  SI

          INC  DI

          LOOP AGAIN

          MOV BYTE PTR[DI],‘$’   ;补一个$

说明:此处先将键入字串存入STRING2,然后再将其字串部分传送到STRING1中,当然在定义STRING2时,应为:STRING2  DB  80,?80 DUP(?)。 

实验六  字符处理程序实验(选做)
1. 实验目的
     (1) 熟悉串操作指令的功能与应用
     (2) 掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。
2.实验内容
     (1) 字符串统计。自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。
     (2) 在给定的字符串中,删除重复的字符,其余的字符向前递补。
3. 实验准备
   (1)熟悉字符处理的方法和字符处理程序的设计;
   (2)认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。
    (3) 按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。
4.实验步骤
(1)用1号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。程序每次执行,都能得到不同的结果。
(2)实验2可参考教材第五章练习10的解法,但要编写一个在同一个字符串中删除字符,并将其余字符向前递补的程序。
5.实验报告要求
(1)对照参考程序,画出程序流程图。
(2)总结字符串处理的编程方法,提出改进和完善此类程序的设计方案。
6.参考程序清单
(1)统计小写字母个数的程序清单:
;COUNTDC.ASM
DATA  SEGMENT
  STRN  DB 80 DUP(?)
DATA  ENDS
CODE  SEGMENT
        ASSUME CS:CODE, DS:DATA
START: MOV  AX, DATA
       MOV  DS, AX
LEA   DI, STAN
MOV  CL, 0
AGAIN: MOV  AH, 1
       INT  21H
CMP  AL,0DH
JZ   DONE
MOV  [DI],AL
INC  DI
INC  DL
JMP  AGAIN
DONE: LEA  SI,STRN
MOV  CH,0
MOV  BL,0
CLD
CYCLE: LODSB
       CMP  AL,61H
CMP  AL,7AH
JA  NEXT
INC  BL
NEXT: LOOP  CYCLE
MOV  AL,BL
MOV  AH,0
MOV  CL,10
DIV  CL                    ;十位数在AL中,个位数在AH中
XCHG  AH,AL              ;以下显示两位十进制数
MOV  DL,AH
OR  DL,30H
INT  21H
MOV  DL,AL
OR  DL,30H
MOV  AH,2
INT  21H
MOV  DL,AL
OR  DL,30H
INT  21H
MOV  DL,AL
OR  DL,30H
INT  21H
MOV  AH,4CH
INT  21H
CODE:ENDS
END START
(2)删除字符串中重复字符的源程序清单:
;DELD.ASM
DATA  SEGMENT
STAN  DB 80 DUP(?)
LEN   DB ?
DATA  ENDS
CODE  SEGMENT
ASSUME CS: CODE,DS: DATA,ES: DATA
ATART: MOV  AX, DATA
MOV  DS,AX
MOV  ES,AX
LEA   SI,STRN
MOV  CL,0
AGAIN: MOV  AH,1
INT 21H
CMP  AL,0DH
JZ   DONE
MOV  [SI],AL
INC   SI
INC   CL
JMP   AGAIN
DONE:MOV  CH,O
MOV  LEN,[CL]
REPEAT: PUSH SI
        PUSH CX                   ;CX为内循环记数
        PUSH CX                   ;DX为外循环记数
        POP  DX
        DEC CX             
        JE  NEXT1                 ;是最后一个字符,不再查找重复字符
        MOV AL,[SI]
        CMP AL,0
        JE NEXT1
COMP:  INC SI
        CMP AL,[SI]
         JNE GOON                 ;为非重复字符
         MOV BUTE PTR[SI],0
GOON:  LOOP COMP                ;查出与该字符重复的所有字符,并用0替换
NEXT1:  POP DX
         POP SI
         DEC DX`
         JNZ REPEAT                ;对所有重复字符都进行查找
         LEA SI,STRN                ;删除重复字符
         MOV CL,LEN
         MOV CH,0
CYCLE: MOV  AL,[SI]               
CMP  AL,0                   ;是重复字符吗?
JNZ  NEXT                   ;不是,查找下一个字符
DEC  CX                     ;递补字串长度送CX
JZ   DONE                   ;若是最后字符不递补
CALL  DELE                 ;删除该空字符并递补
DEC  SI                      ;对递补子串从头处理
NEXT: INC  SI
LOOP  CYCLE
MOV  AH,4CH
INT  21H
DELE  PROC
PUSH  SI
PUSH  CX
CLD
MOV  DI,SI              ;空字符处为目的首址
INC  SI                  ;下一个地址为源串首址
REP  MOVSB
POP  CX
POP  SI
RET
DELE  ENDP
CODE  ENDS
        END  START

实验七  输入输出实验(选做)
1. 实验目的
(1) 掌握输入输出程序设计的概念和方法。
(2) 了解PC机外围芯片8255、8259的功能。
(3) 学习如何在PC机上编写具有输入输出功能的程序,包括8255、8259芯片的使用方法
2. 实验说明
    本实验要求自行编写一个键盘输入处理程序,它可以完成键盘字符的读入并进行屏幕显示,本实验要利用IBM—PC系统的硬件结构,分别使用外围芯片8255及8259。
    在本例中,利用8255A的A端做数据输入,对应的端口地址为60H;利用B端口作控制端输入,端口地址为61H。8255A的控制端口地址为63H 。
本例的8259中断控制器,其IRQ1端用于键盘中断请求线。键盘通过它可以响CPU发出中断请求。8259的I/O端口地址为21H,可以写入中断屏蔽字,以对8个中断源是否容许中断进行控制。在每次中断结束时,要通过I/O端口地址20H写回一个中断结束命令EOI ,使8259可以清除本次中断。
    因此本实验既属于输入输出实验,也属于中断实验。
    有关说明将详细地附在参考程序中。
3.实验内容
    利用pc机键盘,编写一个读入并显示键盘输入的演示程序。该程序只接受常规字符(包括回车键及退格键),对特殊功能键不进行处理。在程序中设置这些特殊功能键对应0编号即可,凡是检测到键位编号为0值时,均忽略对它们的处理。有键按下时,送出的扫描码的D7位为0时,当键抬起时,扫描的码D7位为1,以判定键是否被按下。
4.实验准备
(1) 预习输入输出程序设计的特点和方法。
(2) 仔细阅读参考程序,弄清外围芯片接口初始化的意义和方法。
5.实验步骤
(1) 建立源文件,并通过汇编和连接,产生可执行文件。
(2) 运行程序,观察常规字符键及功能键按下时程序的反应,
6.实验报告要求
(1) 给出程序框图,包括主程序框图、中断处理程序框图。
(2) 说明输入输出程序设计的特点。
(3) 讨论:将SHIFT键及右SHIFT 键也进行判别处理,它们的扫描码为42及54。为记录SHIFT键的按动状态,可设一个标志单元KBFLAG,右SHIFT按下,KBFLAG的D0位置1,左SHIFT按下,KBFLAG的D1位置1,放下左右的SHIFT键,KBFLAG的相应恢复为0。当程序工作时,应能显示上档键的字符。
7.参考程序清单
    ;KEYPRG.ASM
      STACK  SEGMENT  PARA  STACK ‘STACK’
                DB  256  DUP(0)
           STACK   ENDS                     ;设计256个字节堆栈区
 DATA   SEGMENT  PARA  PUBLIC ‘DATA’
BUFFER  DB 10DUP(0)             ;定义10个字节的键盘缓冲区
BUFFER1  DW 0                  ;指向键盘缓冲区的起点
BUFFER2  DW 0                  ;指向键盘缓冲区的终点
;注意当BUFFER1=BUFFER2时,表明缓冲区空

SCANTAB  DB 0,0,’1234567890- =’,8,0
               DB’QWERTYUIOP[]’,0DH,0
               DB’ASDFGHJKL;’,0,0,0,0
               DB’ZXCVBNM,./’,0,0,0
               DB’’,0,0,0,0,0,0,0,0,0,0,0,0
               DB 0,0,’789-456+1230.’
DATA      ENDS
           EXTRN  KBINT: FAR ;      ;外部引用说明
CODE     SEGMENT  PARA  PUBLIC ‘CODE’
           ;主程序段
            ASSUME  CS:CODE
START:    MOV  AX,DATA
              MOV  DS,AX
              ASSUME  DS:DATA
              ;建立自行设计的中断服务程序
              CLI                     ;关中断,以防引起混乱
              MOV  AX,0             ;确定中断类型号9的物理地址
              MOV  ES,AX
              MOV  DI,24H
              MOV  AX,OFFSET  KBINT
 ;写自行设计的中断处理程序入口偏移量到矢量表中
             CLD
             STOSW
             MOV  AX,CS
             STOSW                   ;再写入中断处理程序段基址
            MOV  AL,0FCH           ;允许定时器和键盘中断的控制字送8259
            OUT  21H,AL
            STI                       ;开中断
;读键盘并显示字符
PROEVEVER:CALL  KBGET1       ;读缓冲区字符
            PUSH  AX
            CALL  DISPCHAR      ;显示接收字符
            POP   AX
            CMP   AL,0DH         ;是回车符吗?
            JNZ   FOREVER         ;不是再接收
            CALL  DISPCHAR        ;是,换行
            JMP   FOREVER          ;接收下一行字符
;KBGET1取缓冲区字符—>(返回参数)
;KBGET1   PROC  NEAR
KBGET:  PUSH  BX
                 CLI  
                 MOV  BX,BUFFER1
                 MOV  BX,BUFFER2
                 JNZ  KBGET2                 ;缓冲区不空,转KBGET2
                 STI                       ;开中断
                 POP  BX
                 JMP  KBGET
              ; 取缓冲区字符
KBGET2: MOV  AL,[BUFFER+BX]         ;取缓冲区字符
                 INC  BX                       ; 首指针加1
                 CMP  BX,10                  ;到缓冲区尾吗?
                 JC   KBGET3                  ; 未到,转,KBGET3
                 MOV  BX,0                   ;到,指向缓冲区首
KBGET3: MOV  BUFFER1,BX           ;保护首指针
                 STI
                 POP  BX                      ;恢复BX寄存器
                 RET
KBGET1  ENDP
               ;DISPCHAR字符显示子程序
DISPCHAR  PROC  NEAR
                  PUSH  BX
                  MOV  BX,0             ;显示零页
                  MOV  AH,14H          ;写功能
                  INT  10H                ;调显示器中断调用
                  POP  BX
                  RET
DISPCHAR  ENDP
CODE      ENDS
            END   START
从FOREVER开始,程序便进入循环,反复读缓冲区字符,并将其显示出来。而键盘缓冲区的内容,是通过键盘中断9的中断处理程序KBINT写入的。KBINT程序如下:
;KBINT键盘中断处理程序
SEG  SEGMENT  PARA  PUBLIC ‘CODE’
      ASSUME  CS:SEG
      PUBLIC   KBINT
KBINT    PROC  FAR
          PUSH  BX
          PUSH  AX
          ;读键盘数据,并发确认信号
         IN  AL,60H            ;读8255A 口,即键盘扫描码
         PUSH  AX
         INT  AL,61H           ;为置确认信号
                                 ;读8255A B口
         OR   AL,7FH           ;置键盘确认信号
         OUT  61H,AL           ;置PB7位并送键盘
         AND  AL,7FH           ;恢复键盘确认信号
         OUT  61H,AL
         ;将接收的扫描译为ASCII码
         POP  AX
         TEST  AL,80H          ;检查是否按下?
         JNZ  KBINT2            ;键抬起放弃本次输入
         MOV  BX,OFFSET  SCANTAB
         XLAT  SCANTAB         ;查表找对应ASCII码
         CMP  AL,0             ;是有效字符键吗?
         JZ   KBINT2            ;不是,放弃
        ;存ASCII码字符到缓冲区
        MOV  BX,BUFFER2        ;取缓冲区尾指针
        MOV  [BUFFER+BX],AL    ;存字符
        INC   BX                   ;尾指针加1
        CMP  BX,10               ;是否到区尾?
        JC    KBINT3               ;不到,转
        MOV  BX,0                ;到,置新尾址
KBINT3:CMP  BX,BUFFER1       ;缓冲区满?
          JZ  KBINT2               ;不满,存尾指针
          MOV  BUFFEER2,BX
          ;结束中断处理
KBINT2:MOV  AL,20H           ;发EOI ,结束8259中断
         OUT  20H,AL
         POP   AX
         POP   BX
         IRET                  ;中断返回
KBINT  ENDP
SEG     ENDS
 END
;读键盘数据,并发确认信号
IN AL,60H                      ;读8255A口,即键盘扫描码
PUSH AX
IN AL,61H                       ;为置确认信号
;读8255A B口

OR AL ,80H                      ; 置键盘确认信号
OUT 61H,AL                     ;置PB7位并送键盘
AND 61H,AL 
;将接收的扫描码译为ASII码
POP AX
TEST AL,80H                     ;检查是否按下
JNZ  KBINT2                    ;键抬起放弃本次输入
MOV BX,OFFSET SCANTAB
XLAT SCANTAB                  ;查表找对应ASII码
CMP AL,0                        ;是有效字符键吗?
JZ KBINT2                       ;不是,放弃
;存ASII码字符到缓冲区
MOV BX,BUFFWR2               ;取缓冲区尾指针
MOV [BUFFER+BX],AL          ;存字符
INC BX                          ;尾指针加1
CMP BX ,10                      ;是否到区尾?
JC KBINT3                       ;不到,转
MOV BX,0                       ;到新尾址
KBINT3:  CMP BX,BUFFWR1                ;缓冲区满?
JZ KBINT2                       ;满,转
MOV BUFFWR2                  ;不满,存尾指针
;结束中断处理
KBINT2:  MOV AL,20H                     ;发WOI,结束8259中断
        OUT 20H,AL
POP AX
POP BX
IRET                            ; 中断返回
KBINT    ENDP
SEG      ENDS
END 

试验八 中断程序试验(选做)
1. 实验目的
(1) 掌握中断通信程序的设计方法。
(2) 了解串行通信芯片8250的编程方法。
2. 试验内容
1) 8250的初始化
   8250共有10个可访问的寄存器。对其中的5个寄存器,只需在主程序的开始出用输出指令将它们初始化即可。要想实现单机试验,要对调制解调控制寄存器3FCH正确初始化。它的D0位等于1时,表示实际的数据终端已准备好调制解调器信号;D1位等于1,表示实际的请求发送的调制解调器信号,D2位(OUT)是辅助的用户设计的输出,不使用;D3位是辅助的设计输出,为将8250产生的中断信号经系统总线传送到8250自己的输入中。利用这个特点,可以编写程序,不需任何附加设备,直接测试8250的工作是否正常;D5、D6、D7位强迫置0。
2) 8250的初始化
 为实现分别允许或禁止各中断源,可以通过把屏蔽字节写入中断寄存器IMR(端口地址为21H0)来实现。
例如希望禁止所有外设中断,只保留键盘中断(连8259的IRQ1),可编程如下:
  MOV AL,0FDH;只有ORQ1未屏蔽
OUT 21H,AL
当然,中断信号能否被CPU接收,还需有标志位IF来决定。IF=1,CPU允许中断。
在CPU执行中断服务程序时,应当把这一信息通知8259。起方法是向20H端口送一个中断结束命令字节EOI,其内容为20H。将EOI送至8259,通知本次外设中断已结束。
3.   收发程序的实现
发送出巡的数据来自键盘输入,它收到的数据发送到8259串行口,屏幕显示。接收程序接收到数据后,也在屏幕上显示出来。因此,程序正常执行后,从键盘输入一个数字,屏幕上显示两个同样的数据,其中一个是发送程序发送的数据,另一个是接收程序收到的字符数据。
接收数据是通过接收中断处理程序实现的。
4.  试验准备
(1) 预习关于中断程序的有关内容
(2) 熟悉8250初始化的方法,8259有关命令字和中断向量表的设置等,熟悉中断程序的结构。
5. 试验步骤
(1) 建立源文件,汇编、连接产生可执行文件。
(2) 运行程序,使发送的字符串能被正确地接收。
6. 试验报告要求
(1) 由参考程序,画出收发通信框图。
(2) 对8250及8259芯片,弄清是如何实现对它们进行初始化和控制的写出有关的初始化控制字节并说明其意义。
7. 参考程序清单
;SINT.ASM
STACH   SENGMENT PAPA STACk'STACL'
     DB 256 DUP(0)
STACK   ENDS
CODE    SEGMENT PARA PUBLIC 'CODE'
RTATS  PROC  FAR
          ASSUME CS:CODE
START:   PUSH DS
          XOR AX,AXPUSH AX          ;保存返回地址
CLI
MOV AX,0
MOV ES,AX   
MOV AX,OFFSET   ;ES指向中断向量表
MOV DI,0CH*4     ;串行口中断类型号为0CH
MOV AX,OFFSET RECEIVE
CLD              
STOSW            ;RECEIVE为接收中断入口
MOV AX,OFFSET RECEIVE
CLD
STOSW       ;以上4条指令为接收中断入口
MOV AX,SEG RECEIVE
CLD
STOSW   ; 以上4条指令完成置0CH的中断向量
MOV AL,2CH
OUT 21H,AL   ;允许串口、键盘及时钟中断,初始化8259
MOV DX,3FBH  ;通信线控制端口
MOV DL,80H
OUTDX,AL     ;初始化波特率寄存器
MOV DX,3F8H  ;将波特率初始化为1200波特,分
;送3F8H及3F9H
MOV AL,60H
OUT DX,AL
MOV DX,3F9H
OUT DX,AL
MOV  DX,3FBH   ;奇校验,1位停止位
MOV AL,0AH      7位代码
OUT DX,AL
MOV DX,3FCH
MOV AL,1BH
OUT DX,3F9H     ;允许数据接收中断
 MOV AL,01H
OUT DX,AL
STI           ;开中断
FOREVER: MOV DX,3FDH  ;读线路状态寄存器
          IN AL,DX
TEST SL,20H    ;是否允许发送
JZ FORWVRTR   ;是否继续查询
MOV AH,1      ;BIOS 16H中断,判有无键盘输入
INT 16H
INC SI         ;发送数加1
CMP SI,11     ;超过10个字符结束
JE GOOD
MOV BX,0
MOV AH,14   ;显示键入的字符
INT 10H
MOV DX,3F8H
OUT DX,AL   ;将字符发送出去
JMP FOREVER  ;循环,随时可产生接收中断
GOOD: RET
RECEIVE:   PROC NEAR
PUSH SX
PUSH BX
PUSH DX
PUSH DS
MOV DX,3FDH   ;读线路状态寄存器
IN AL,1EH
JNZ ERROR      ;有错误转错误处理
MOV AL,DX
MOV DX,3F8H
IN AL,DX       ;输入数据
AND DL,7FH
PUSH AX       ;一下显示输入字符
MOV AH,14
INT 10H
POP AX
CMP AL,0DH
JNZ RTN
MOV AL,0AH  ;显示回车换行
MOV AH,14
MOV BX,0
INT 10H
RNT: MOV AL,20H    向8259发EOI指令
OUT 20H,AL
POP DS
POP DX
POP BX
POP AX
STI        ;开中断
IRET       ;开中断返回
ERROR:  MOV DX,3F8H
IN AL,DX  ;从数据寄存器中读一字节,以清除时
;错误
MOV AL,'?' ;显示“?”错误标志
MOV BX,0
MOV AH,14
INT 10H
JMP RTN    ;返回中断程序
RECEIVE    ENDP
RTATS       ENDP
CODE       ENDS
            END START
    系统中预制的DOS或BIOS中断调用,给用户编制程序带来了极大的方便,但在系统配置用专用设备,或需要扩充原中断例行程序的功能,或需要设备执行完全不同于原中断例行程序的功能时,就需要用户自编中断处理程序。
   这类程序应解决好以下3个问题:
  (1)将原中断向量保存在堆栈中或自设的存储单元中。
若中断类型号为INT_TYPE并将该中断类型号对应的中断向量保存在KEEP_IP及KEEP_CS地址中,则以下程序段可以实现该操作:
   MOV AH, 35H       ;DOS系统调用35号功能,可将原中断向量段址→ES,偏移
                       ;地址→BX中
   MOV AL,INT_TYPE
INT 21H
MOV KEEP_IP,BX
MOV KEEP_CS,ES
(2)将自编的中断处理程序入口置入中断向量表中。该操作可以用DOS系统调用25H实现,这时应将自编中断处理程序的段内偏移地址送DX,段基址送DS,中断类型号送AL 中作为入口参数。相应的程序段如下:
PUSH DS
MOV DX, OFFSET ROUTINE
MOV AX, SEG ROUTINE
MOV DS, AX
MOV AH, 25H
INT 21H
POP DS
当用25H功能改变中断向量时,会自动禁止硬件中断,因此在设置新的中断向量时,硬件中断不会使用中断向量。
(3)在中断处理程序结束时,必须恢复原来的中断向量,否则后继程序不能正确使用系统提供的例行程序。相应的程序如下:
PUSH DS
MOV DX, KEEP_IP
MOV AX, KEEP_CS
MOV DS, AX
MOV AL, INT_YYPE
MOV AH, 25H
INT 21H
POP DS
中断处理子程序中,应由IRET指令从中断处理程序返回。

实验九 微机串口通信编程(必做)

1.         实验目的:

(1)了解计算机串并行通信技术,学习串行异步通信的接口总线RS232C,通用异步接收发送器8250

(2)实现简单的串行数据传输。

2.         实验内容

(1)      编写程序,实现串口通信发送/接收单个字符。

(2)      编写一个程序,实现串口通信连续发送/接收键盘输入的字符。

3.         实验准备

(1)编写实验内容要求的程序;制作串口通信所需的数据传输线。

(2)写出调试以上程序,即修改程序参数,检查结果的操作方法。

4.         实验步骤

(1) 建立源文件,并通过汇编和连接,产生可执行文件。

(2) 运行程序,观察常规字符键及功能键按下时程序的反应,调试程序,实现串口通信发送/接收单个字符。

(3)调试程序,实现串口通信发送/接收键盘连续输入的字符。

5.         实验报告要求

     画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。

7.           参考程序段清单:

;通过COM1端口实现两台电脑间单个字符发送与接收。

; initialize COM1

      mov ah,0    ; initialization

      mov dx,0    ; COM1

      mov al,0c3h  ; parameters

int 14h

Send程序

; Checking key press and sending key to COM1 to be transferred

again:  mov ah,1

        int 21h

        CMP AL,1BH

        JE  EXIT

;Check COM1 port to see there is a char, if so get it and display it

        mov ah,1

        mov dx,0

        int 14h

        jmp again

exit:   mov ah,4ch

        int 21h

Receive 程序

wait:    mov  ah,  3    ; read the state of port

         mov  dx,  0    ;  COM1

         int  14h       ; using BIOS

         and  ah,  1    ; if the data is ready

         jz   wait      ; if not, return

         mov  ah,  2    ;if so, read the data

         mov  dx,  0    ; COM1

         int  14h       ; using BIOS

         mov  dl,  al   ;display the char

         mov  ah,  02h

         int  21h

;实现两台电脑间连续字符的发送与接收

stack segment para stack 'stack'

      db  256 dup(0)

stack ends

data segment para public 'data'

speak1   db  'how do you do!', 0dh,0ah

speak2  db   'good afternoon!',0dh,0ah

speak3  db   'ok!',0dh,0ah

flag  db  0

abuf  dw  ?

data  ends

code  segment    para public 'code'

start proc   far

        assume cs:code,ss:stack,ds:data

       push ds

       xor ax,ax

       push ax

       mov ax,data

       mov ds,ax

init:  mov dx,3fbh

       mov al,80h

       out dx,al

       mov dx,3f8h

       mov al,60h

       out dx,al

       mov dx,3f9h

       mov al,0h

       out dx,al

       mov dx,3fbh

       mov al,03h

       out dx,al

       mov dx,3fch

       mov al,00h

       out dx,al

       mov dx,3f9h

       mov al,00h

       out dx,al

       mov flag,0

forever:

      mov dx,3fdh

      in  al,dx

      test al,1eh

      jz  s10

      jmp error

s10:  test al,01h

      jnz receive

      test al,20h

      jz  forever

s5:   test flag,80h

      jz testkey

      mov bx,abuf

      mov al,[bx]

      inc bx

      mov abuf,bx

      jmp s4

testkey:

      mov  ah,01

      int 16h

      jz forever

      mov ah,0

      int 16h

    

      cmp al,'^'

     

      jne s1

      lea bx,speak1

      jmp s3

s1:   cmp al,'$'

      jne s2

      lea bx,speak2

      jmp s3

s2:   cmp al,'*'

      jne s4

      lea bx,speak3

s3:   mov abuf,bx

      or flag,80h

      jmp s5

  

s4:   mov dx,3f8h

      out dx,al

      test flag,80h

      jnz s6

      cmp al,'&'

      jne   forever

      ret

s6:   cmp al,0ah

      jne s7

      mov flag,00

s7:   jmp forever

receive:

      mov dx,3f8h

      in al,dx

      and al,7fh

      push ax

      mov bx,0

      mov ah,14

      int 10h

      pop ax

      cmp al,0dh

      jnz forever1

      mov al,0ah

      mov ah,14

      mov bx,0

      int 10h

forever1:

      cmp al,'@'

      jne s8

      ret

s8:   jmp forever

error:mov dx,3f8h

      in al,dx

      mov al,'?'

      mov bx,0

      mov ah,14

      int 10h

      jmp forever

start endp

code  ends

      end start

思考题:

1、本程序有什么功能?帧格式是什么?分别按'$', '^', '&', '*'键之后程序分别执行什么操作?

2、如何退出本程序?如何让对方退出通信程序?

3、本程序用的是几号串口?

4、增加一个功能如下:当‘!’键之后,本程序发送20H到7FH ASCII码,并退回系统.

更多相关推荐:
C语言实验指导及报告模板

语言程序江西理工大学设计1C附件1实验报告模板C语言程序设计实验报告实验一简单的C程序教学班级冶金136学号01姓名张博课程教师胡春安实验教师胡春安完成时间20xx20xx学年第1学期江西理工大学2实验一简单的...

行政案例方法与实例实验指导书

前言行政案例分析课程的首要特点是强调理论联系实际的学习方法要求学生运用已学的行政学基本理论对当前行政管理领域的重特大事件公共政策规范等进行分析剖析该事件或该公共政策的问题成因探讨解决该问题的可能途径丰富对该类社...

VC++实验指导书

VC程序设计实验指导书张位勇湖南工学院前言VisualC实验环境介绍一VisualC简介VisualC是Microsoft公司的VisualStudio开发工具箱中的一个C程序开发包VisualStudio提供...

Web技术实验指导书

Web技术实验指导书内容简介Web技术是计算机专业学生的一门专业课程着重讲述Web编程的技术方法对于学生从事Web系统的研发使用和维护有重要意义本课程概念多内容涉及面广系统性强通过本课程的学习学生应能从软件硬件...

C_sharp实验指导书

实验指导实验一VS20xx集成开发环境一实验目的熟悉VS20xx开发环境掌握如何在此环境下开发简单的NET应用程序以及调试程序的基本操作技巧二实验要求123熟悉VSNET环境按照C规范正确写源程序能得到正确的程...

设计性实验论文范例与书指导

设计性实验论文范例与书指导,内容附图。

设计性实验论文范例与书指导

设计性实验论文范例与书指导,内容附图。

数据结构实验指导书

数据结构实验教学大纲课程编号020xx3040课程学时学分603实验总学时10课程英文名称DataStructure课程类别技术基础课开出学期第四学期第六学期开出单位实验室信息学院教学机房制定人张丽霞讲师一制定...

数据库原理本科实验指导综合

数据库原理实验指导书数据库原理实验指导书实验一建立数据库一实验目的1了解SQLServer20xx2掌握SQLServer20xx数据库的建立和删除二实验内容1查看SQLServer20xx的所有组件2使用服务...

序号8-0914070030-12-20xx-20xx-01程序设计语言Ⅱ实验指导书

辽东学院自编教材程序设计语言实验指导书齐文编计算机科学与技术专业用辽东学院20xx年12月I目录C概论和输入输出1类和对象6派生类与继承12多态性16IO流与异常处理19面向对象程序设计方法与实例23I实验一实...

实验指导书《大型数据库(Oracle)》

大型数据库Oracle实验指导实验一Oracle安装与维护一实验目的1了解并掌握Oracle10的安装方法2了解并掌握测试安装好的Oracle10g的方法二实验内容及步骤1软件下载Oracle公司针对个人学习之...

数据结构实验指导书(广工)

数据结构作业和实验指导书数据结构课程组广东工业大学计算机学院20xx年3月目录第1章概述11课程教材和实验12作业和实验安排第2章算法设计实验和上机21数据结构习题概述22算法设计的上机作业要求23算法设计上机...

实验指导语(22篇)