《汇编语言程序设计》上机实验指导书
ASSUME CS:CODE ,DS:DATA START: MOV AX,DATA MOV DS,AX
;建立自行设计的中断服务程序,写自行设计的中断处理程序入口偏移量到矢量表中 CLI ;关中断,以防引起混乱 MOV AX,3509H ;取类型9的中断向量 INT 21H
MOV OLDCS9,ES MOV OLDIP9,BX PUSH DS LEA DX,KBINT MOV AX,SEG KBINT MOV DS,AX
MOV AX,2509H ;设置类型9的中断向量 INT 21H POP DS IN AL,21H
AND AL,0FDH ;允许定时器和键盘中断的控制字送8259 OUT 21H,AL
LEA DX,PROMPT ;在屏幕上显示---kbd_io program begin --- MOV AH,9 INT 21H
STI ;开中断 ;程序功能:读键盘并显示字符
FOREVER: CALL KBGET ;读缓冲区字符
TEST KBFLAG,80H ;如果输入任意功能键,则使KBFLAG=80,退出 JNZ ENDINT PUSH AX
CALL DISPCHAR ;显示接收字符 POP AX CMP AL,'A'
JZ ENDINT ;输入A结束程序 CMP AL,0DH ;是回车符吗?
- 16 -
《汇编语言程序设计》上机实验指导书
JNZ FOREVER ;不是再接收 MOV AL,0AH
CALL DISPCHAR ;是,换行 JMP FOREVER ;接收下一行字符 ENDINT: MOV DX ,OLDIP9 MOV AX ,OLDCS9 MOV DS,AX MOV AH,25H MOV AL,9 INT 21H MOV AH,4CH INT 21H ;KBGET1取缓冲区字符->(返回) KBGET PROC NEAR PUSH BX CLI
MOV BX,BUFPT1 CMP BX,BUFPT2
JNZ KBGET2 ;缓冲区不空,转KBGET2,取字符 CMP KBFLAG,0 JNZ KBGET3
STI ;开中断 POP BX
JMP KBGET ;当输入缓冲区为空,且没有按键时循环等待 ; 取缓冲区字符
KBGET2: MOV AL,[BUFFER+BX] ;取缓冲区字符 INC BX ; 首指针加1 CMP BX,16 ;到缓冲区尾吗? JC KBGET3 ; 未到,转,KBGET3 MOV BX,0 ;到,指向缓冲区首 KBGET3: MOV BUFPT1,BX ;保护首指针 POP BX ;恢复BX寄存器 RET
- 17 -
《汇编语言程序设计》上机实验指导书
KBGET ENDP
;CHAR字符显示子程序 DISPCHAR PROC NEAR PUSH BX MOV BX,0 MOV AH,0EH INT 10H POP BX RET DISPCHAR ENDP CODE ENDS
END START
从FOREVER开始,程序便进入循环,反复读缓冲区字符,并将其显示出来。而键盘缓冲区的内容,是通过键盘中断9的中断处理程序KBINT写入的。KBINT程序如下: ;KBINT键盘中断处理程序
EXTRN SCANTAB:BYTE,BUFFER:BYTE,KBFLAG:BYTE,BUFPT1:WORD,BUFPT2:WORD CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG
PUBLIC KBINT KBINT PROC FAR
PUSH BX PUSH AX
;读键盘数据,并发确认信号
IN AL,60H ;读8255A 口,即键盘扫描码 PUSH AX
IN AL,61H ;为置确认信号 OR AL,80H ;置键盘确认信号 OUT 61H,AL ;置PB7位并送键盘
AND AL,7FH ;恢复键盘确认信号,亦即选通信号 OUT 61H,AL
;将接收的扫描码译为ASCII码 POP AX
TEST AL ,80H ;检查是否按下?最高位为0或为1,分别表示键是按下还是放开
- 18 -
《汇编语言程序设计》上机实验指导书
JNZ KBINT2 ;键抬起放弃本次输入 MOV BX ,OFFSET SCANTAB
XLAT ;查表找对应ASCII码 CMP AL,0 ;是有效字符键吗? JNZ KBINT4
MOV KBFLAG,80H ;不是有效字符则使得KBFLAG=80 JMP KBINT2
KBINT4:
;存ASCII码字符到缓冲区
MOV BX,BUFPT2 ;取缓冲区尾指针 MOV [BUFFER+BX],AL ;存字符 INC BX ;尾指针加1 CMP BX,16 ;是否到区尾?
JC KBINT3 ;不到,转 ,尾指针小于16时转KBINT3 MOV BX,0 ;到,置新尾址 ,缓冲区从0~15
KBINT3: CMP BX,BUFPT1 ;缓冲区满?
JZ KBINT2 ;此时首尾指针相等说明缓冲区已满,则不保留尾指针,从而忽略刚才输入的字符
MOV BUFPT2,BX ;不满,存尾指针 ;结束中断处理
KBINT2: CLI
MOV AL,20H ;发EOI ,结束8259中断 OUT 20H,AL POP AX POP BX
IRET ;中断返回 KBINT ENDP
CSEG ENDS
END KBINT
实验五 字符处理程序实验
1. 实验目的
(1)熟悉串操作指令的功能与应用
- 19 -
《汇编语言程序设计》上机实验指导书
(2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。 2.实验内容
(1) 字符串统计。自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。
(2)在给定的字符串中,删除重复的字符,其余的字符向前递补。 3. 实验准备
(1)熟悉字符处理的方法和字符处理程序的设计;
(2)认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。 (3)按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。 4.实验步骤
(1)用1号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。程序每次执行,都能得到不同的结果。
(2)编写一个在同一个字符串中删除字符,并将其余字符向前递补的程序。 5.实验报告要求
(1)对照参考程序,画出程序流程图。
(2)总结字符串处理的编程方法,提出改进和完善此类程序的设计方案。 6.参考程序清单
(1)统计小写字母个数的程序清单: DATA SEGMENT STRN DB 80 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX LEA DI, STRN MOV CL, 0 AGAIN: MOV AH, 1 INT 21H CMP AL,0DH JZ DONE MOV [DI],AL INC DI
- 20 -