07-082汇编语言程序设计实验指导书

更新时间:2024-05-12 23:14:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《汇编语言程序设计》上机实验指导书

汇编语言上机实验指导书

一、概述

上机实验总学时为16学时,其中综合性实验为2学时。实验共有6项暂定为8次,每次2学时。 1.实验辅导的主要内容

实验辅导的内容包括每个实验的实验目的;实验内容;对实验的算法及实验方法的必要说明;实验准备;实验步骤;实验报告要求;实验程序及参考框图。开始的实验介绍较细,后面的实验简要介绍。

2.实验的软硬件要求

关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT即可,但应有彩色显示器以便进行图形实验。软件方面应有MASM.EXE5.0版(包括LINK.EXE),与MS-DOS版本配套的DEBUG程序和EDIT.EXE编辑软件(其它编辑软件也可以)。 3.加强实践能力的培养

实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。其中包括:

实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等; 开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。

对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或自己编制程序加以实现。

实验一 汇编语言运行环境及方法、简单程序设计(2学时、验证性)

1.实验目的:

(1) 熟悉汇编语言运行环境和方法 (2)了解如何使用汇编语言编制程序 (3) 熟悉DEBUG有关命令的使用方法 (4) 利用DEBUG掌握有关指令的功能 (5) 利用DEBUG运行简单的程序段 2.实验内容

(1)学会输入、编辑汇编语言程序

(2)学会对汇编语言程序进行汇编、连接和运行 (3)进入和退出DEBUG程序

(4)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、

- 1 -

《汇编语言程序设计》上机实验指导书

N命令、W命令等,也应试一下。 3.实验准备

(1)仔细阅读有关汇编语言环境的内容,事先准备好使用的例子。

(2)准备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析。

(3) 编写一个程序:比较2个字符串所含的字符是否相同。若相同则显示’Match.’,否则显示’No match!’;(1)仔细阅读有关DEBUG命令的内容,对有关命令,都要事先准备好使用的例子。 4.实验步骤

(1)在DOS提示符下,进入MASM目录。

(2)在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。 ①调用edit输入、编辑源程序并保存在指定的目录中;例:edit abc.asm ②用汇编程序masm对源程序汇编产生目标文件obj。例:masm abc 不断修改错误,直至汇编通过为止。

③用连接程序link产生执行文件exe.例:link abc ④执行程序

可直接从DOS执行程序,即在DOS环境中,输入文件名即可。 (3)详细记录每一步所用的命令,以及查看结果的方法和具体结果。 5.实验报告要求

(1) 程序流程图和源程序清单。 (2) 如何启动和退出EDIT程序。 (3) 如何对源程序进行汇编及编辑。 (4)如何启动和退出DEBUG程序。

(5)整理每个DEBUG命令使用的方法,实际示例及执行结果。 (6)启动DEBUG后,要装入某一个.EXE文件,应通过什么方法实现?

实验二 循环程序、分支程序程序设计实验(4学时、验证性)

1.实验目的:

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

(2)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。 (3)学会针对不同的问题,选用不同的组织循环的方法。 2.实验内容

(1)编写一个程序,将内存中一组有符号的字数组按递增的序列排序,并将其中的二进制数以十六进制的形式显示在屏幕上。

(2)编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显

- 2 -

《汇编语言程序设计》上机实验指导书

示“c”;若是回车字符(其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.实验报告要求

(1)画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。 (2)说明本实验是如何利用DEBUG进行调试的。 6.参考程序清单

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

CODE SEGMENT

ASSUME CS:CODE START: MOV AL,3EH PUSH AX 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

POP AX ;显示高位ASCII码

- 3 -

《汇编语言程序设计》上机实验指导书

MOV DL,AL 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 END START (2)显示键入字符程序 ;DISPKEY.ASM

CODE SEGMENT

ASSUME CS:CODE START: MOV AH,1

INT 21H CMP AL,0DH JZ 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'

;返回DOS ;等待键入字符,送AL ;是否是回车符? ;是则转DONE退出程序- 4 -

《汇编语言程序设计》上机实验指导书

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

实验三 子程序设计(4学时、验证性)

一、本实验的目的在于让同学们掌握同一模块调用的方法。 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)第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址

- 5 -

《汇编语言程序设计》上机实验指导书

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

- 6 -

《汇编语言程序设计》上机实验指导书

HEXASC PROC NEAR PUSH AX MOV DL,AL PUSH CX MOV CL,4 SHR DL,CL POP CX

CALL DISP ;显示高位HEX数 POP AX MOV DL,AL AND DL,0FH CALL DISP RET HEXASC ENDP DISP PROC

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)统计并显示键入字符串中某字符的个数 DATA SEGMENT CHAR DB 'b'

BUF DB 50H, ?,50H DUP(?) CRLF DB 0DH,0AH,'$' DATA ENDS MCODE SEGMENT

- 7 -

《汇编语言程序设计》上机实验指导书

ASSUME CS:MCODE, DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,0AH INT 21H LEA DX,CRLF MOV AH,9 INT LEA MOV MOV INC INC MOV MOV PUSH PUSH PUSH CALL MOV MOV INT POP MOV AND CMP JBE ADD NEXT: ADD MOV INT MOV

21H SI,BUF CL, [SI+1]

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

SI ;SI指向串首址TABLE AL,CHAR

AH,0 ;AX中为待查字符 SI CX

AX ; 参数送堆栈 FAR PTR CHECK DL,CHAR AH,2 21H

AX ;统计个数在AL中 DL,AL DL, 0FH DL,9 NEXT DL,7 DL,30H AH,2

21H ;显示统计个数 AH,4CH

- 8 -

《汇编语言程序设计》上机实验指导书

INT 21H MCODE 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 SCODE ENDS

END START

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

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

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

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

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

- 9 -

《汇编语言程序设计》上机实验指导书

(1)仔细阅读教材中有关模块间通信的方法及模块程序设计的方法。 (2)弄清伪指令PUBLIC及EXTRN的功能及用法。 4.实验步骤

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

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

(1)对愿程序清单,画出相应的程序流程图. (2)扼要总结多模块程序的特点和编写方法. 6.参考程序清单

(1)转换字符串小写字母为大写字母的程序清单: EXTRN 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 FAR PTR DNTOUP MOV AH,4CH INT 21H CODE ENDS

END START

;DNTOUP.SM为子模块的文件名 PUBLIC DNTOUP

EXTRN STRING1:BYTE,STRING2:BYTE CODE SEGMENT

- 10 -

《汇编语言程序设计》上机实验指导书

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 -

《汇编语言程序设计》上机实验指导书

INC CL JMP AGAIN DONE: LEA SI,STRN MOV CH,0 MOV BL,0 CLD CYCLE: LODSB

CMP AL,61H JB NEXT CMP AL,7AH JA NEXT INC BL NEXT: LOOP CYCLE MOV AL,BL MOV AH,0 MOV CL,10

DIV CL XCHG AH,AL MOV DL,AH OR DL,30H PUSH AX MOV AH,2 INT 21H POP AX MOV DL,AL OR DL,30H MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS

END START (2)删除字符串中重复字符的源程序清单:

;十位数在AL中,个位数在AH中 ;以下显示两位十进制数 - 21 -

《汇编语言程序设计》上机实验指导书

;DELD.ASM

DATA SEGMENT

STRN DB 80 DUP(?) LEN DB ? DATA ENDS CODE SEGMENT

ASSUME CS: CODE,DS: DATA,ES: DATA START: MOV AX, DATA MOV MOV LEA MOV AGAIN: MOV INT CMP JZ MOV INC INC JMP DONE: MOV MOV LEA REPEAT:

PUSH PUSH CMP JZ MOV CMP JE COMP: INC CMP

DS,AX ES,AX SI,STRN CL,0 AH,1 21H AL,0DH DONE [SI],AL SI CL AGAIN CH,0 LEN,CL SI,STRN SI CX CX,1

GOON AL,[SI] AL,0 NEXT1 SI AL,[SI]

最后一个字符,不找重复字符- 22 -

; 《汇编语言程序设计》上机实验指导书

JNE GOON ;为非重复字符

MOV BYTE PTR[SI],0 ;查出与该字符重复的所有字符,并用0替换 GOON: LOOP COMP NEXT1: POP CX POP SI INC SI

LOOP REPEAT ;对所有重复字符都进行查找 LEA SI,STRN ;删除重复字符 MOV MOV MOV CYCLE: MOV CMP JZ MOV INC NEXT: INC LOOP MOV MOV SUB CYCLE1: MOV INC LOOP MOV MOV INT MOV MOV INT LEA CYCLE2: MOV INC

DI,SI CL,LEN CH,0 AL,[SI]

AL,0 ;是重复字符吗? NEXT ;不是,查找下一个字符 [DI],AL DI SI CYCLE CL,LEN CH,0 CX,DI

BYTE PTR[DI],0 ;剩余字符前移,原字符位置清0 DI CYCLE1 DL,0DH AH,2 21H DL,0AH AH,2 21H SI ,STRN DL,[SI] SI

- 23 -

《汇编语言程序设计》上机实验指导书

CMP DL,0 JZ DONE1 MOV AH,2 INT 21H JMP CYCLE2 DONE1: MOV AH,4CH INT 21H CODE ENDS

END START

实验六BIOS和DOS中断调用应用程序设计

1. 实验目的

(1)了解 DOS、BIOS调用的基本功能、调用参数、返回参数。以及数据定义 掌握中断通信程序的设计方法。

(2)掌握如何利用扫描码进行功能控制。 2. 试验内容

编写一个可以进行光标左右移动和插入字符的简单字处理程序 3.试验准备 (1) 复习相关内容

(2)了解键盘的扫描码、ASCII码及其显示字符(如果存在可显示字符形式)之间的对应关系。 4.试验步骤

(1) 建立源文件,汇编、连接产生可执行文件。

(2) 运行程序,使得可以输入字符和光标左右移动及字符的插入。 5. 试验报告要求

(1) 由参考程序,画出简单字处理程序框图。 (2) 讨论如何实现光标的上下移动和字符的删除。 6. 参考程序清单

;字处理演示参考程序 ,插入、左右移动

DSEG SEGMENT

KBD_BUF DB 96 DUP(' ') ;input buffer CNTL DB 16 DUP(0) ;char number of row BUFPT DW 0 ;buffer head point BUFTL DW 0 ;buffer tail point

- 24 -

《汇编语言程序设计》上机实验指导书

COLPT DB 0 ROWPT DB 0

ROWMX DW 0 ;maxum row number DSEG ENDS

CURS MACRO ROW,COL MOV DH,ROW MOV DL,COL MOV BH,0 MOV AH,2 INT 10H ENDM CSEG SEGMENT MAIN PROC FAR

ASSUME CS:CSEG,DS:DSEG,ES:DSEG START:

MOV AX,DSEG MOV DS,AX MOV ES,AX MOV BUFTL,0 MOV COLPT,0 MOV ROWPT,0 MOV BUFPT,0 MOV ROWMX,0 MOV CX,LENGTH CNTL XOR AL,AL LEA DI,CNTL CLD

REP STOSB

MOV AH,6 ;clear screen MOV AL,0 MOV CX,0

MOV DH,24 ;在文本方式下,每个屏幕是由25行,80列组成,屏幕左上角是其初始位置0,0

- 25 -

《汇编语言程序设计》上机实验指导书

MOV DL,79 ;行数由上至下从0递增到24,列数由左至右依次从0递增到79

MOV BH,07

INT 10H ;设置显示方式 CURS 0,0 ;初始化光标 READ_K:

MOV AH,0

INT 16H ;键入字符送AL

CMP JNZ MOV INT ARROW:

CMP JZ CMP JZ INST: JMP LEFT: JMP RIGHT: JMP INS_K: MOV MOV CMP JE LEA ADD MOV DEC SUB STD

REP KM:

AL,1BH ;is escape? 按esc键退出 ARROW AH ,4CH 21H AH,4BH ;is left arrow LEFT

AH,4DH ;is right arrow RIGHT INS_K LEFT_K RIGHT_K

;insert a character BX,BUFPT CX,BUFTL BX,CX

KM ;yes,char into buffer DI,KBD_BUF ;no,buffer move DI,CX ;a byte backward SI,DI SI CX,BX MOVSB - 26 -

《汇编语言程序设计》上机实验指导书

MOV KBD_BUF[BX],AL

INC BUFPT ;inc head pointer INC BUFTL ;inc tail pointer CMP AL,0DH ;insert a CR JNZ KN

LEA SI,CNTL ;yes,move the count ADD SI,ROWMX ;of each row INC SI ;backword MOV DI,SI INC DI

MOV CX,ROWMX SUB CL,ROWPT STD

REP MOVSB

MOV BL,ROWPT ;adjust the counts XOR BH,BH ;of current row MOV CL,COLPT ;and next row MOV CH,CNTL[BX] SUB CH,COLPT MOV CNTL[BX],CL MOV [CNTL+1],CH

MOV AX,ROWMX ;clear displaying row MOV BH,7 MOV CH,ROWPT MOV DH,24 MOV CL,0 MOV DL,79 MOV AH,6 INT 10H

INC ROWPT ;point to next INC ROWMX ;inc max row count MOV COLPT,0 ;point to 0 column JMP SHORT KP

- 27 -

《汇编语言程序设计》上机实验指导书

KN:

MOV BL,ROWPT XOR BH,BH

INC CNTL[BX] ;inc current row count INC COLPT ;point to next column KP: CALL DISPBF ;display input buffer CURS ROWPT,COLPT ;position the cursor JMP READ_K LEFT_K:

CMP JNZ CMP JZ DEC MOV LEA XLAT MOV JMP K2: DEC K3: DEC CURS LRET: JMP RIGHT_K:

MOV CMP JE INC CMP JNZ INC MOV K4: INC COLPT,0 ;is at 0 column K2 ;no

ROWPT,0 ;is at 0 row LRET ;yes,cursor is unmove ROWPT AL,ROWPT BX,CNTL CNTL COLPT,AL K3 COLPT BUFPT ROWPT,COLPT READ_K BX,BUFPT ;is at tail of file? BX,BUFTL

RRET ;yes,cursor unmoved COLPT ;point to next column KBD_BUF[BX],0DH ;is CR? K4 ;no

ROWPT ;yes,point to next row COLPT,0 ;and 0 column BUFPT ;adjust buffer pointer

- 28 -

《汇编语言程序设计》上机实验指导书

CURS ROWPT,COLPT ;position cursor RRET: JMP READ_K DISPBF PROC NEAR MOV BX,0 MOV CX, 96 CURS 0,0

DISP: MOV AL,KBD_BUF[BX] PUSH BX MOV MOV INT POP CMP JNZ MOV MOV INT KK: INC LOOP RET DISPBF ENDP MAIN ENDP CSEG ENDS

END BX,0700 AH,0EH 10H BX AL,0DH KK AL,0AH AH,0EH 10H BX DISP START

- 29 -

本文来源:https://www.bwwdw.com/article/fjug.html

Top