微机原理实验指导书 下载本文

微型计算机原理与应用

实验指导书

上 海 大 学 通 信 学 院

2010 年 4 月

PC微机原理实验一

一、

目的:掌握PC机DEBUG调试程序有关命令的操作及8086各类指令的

功能。

要求:在PC机上完成下列程序的调试运行,并写出运行结果。

二、

1.DEBUG的基本操作:(详细内容请参阅教材“4.5程序的调试,P173”和“附录F调试程序DEUBG的使用,P499”)

(1) 从WINDOWS进入DOS之后,输入命令启动DEBUG: C:>DEBUG 回车

(2) 输入R命令,查看和记录CPU各个寄存器的内容: -R回车 看到什么?

(3) 输入A命令,汇编下面的字符“WINDOWS”显示程序: -A 100 ;从偏移地址是0100H处开始写指令

MOV AH,2

MOV DL, 57 ;57H 是“W”的ASCII码 INT 21 ;INT 21是DOS 功能调用,AH=2代表2号功能 ;这3句合起来的功能是:显示DL中的字符

MOV DL, 49 INT 21 MOV DL, 4E INT 21

MOV DL, 44

INT 21

MOV DL, 4F

INT 21

MOV DL, 57

INT 21

MOV DL, 53

INT 21 INT 3 ; 功能是产生一个断点,不要省略 (4) 输入U命令反汇编上面的程序: -U 100

问:这里100代表什么?

(5) 输入G命令连续运行上面的程序,记录运行结果: -G=100

(6) 输入E命令把上面程序中的数据57,49,4E,44,4F,57,53依次分别改为57,

45,4C,43,4F,4D,45: -E 103 回车(以下同) -E 107

-E 10B

2

-E 10F -E 113 -E 117 -E 11B

(7) 输入D命令查看程序机器码的存放情况: -D 100 11E ;看从100开始到11E的机器码 (8) 输入G命令再连续运行程序,并记录运行结果: -G=100

(9) 依次输入下面的T命令(单步执行)和G命令(设置断点并启动运行),记录各

命令的运行结果: -T=100 回车 -G=100 106 回车

-G=100 10A 回车 -G=100 10E 回车 -G=100 11E 回车

注意:

下面第2—第8段程序是7个实用的小程序,若不小心打错指令,可以这样修改: 例如:CS: 0100 B300 MOV BL,0 0102 53 PUSH BX 0103 B220 LP1: MOV DL,20 要修改“PUSH BX”,因为这条指令的IP是0102,所以按以下操作: -A 0102 回车,然后把正确的指令打入,“-A ”是汇编指令。 如果要查看0100以后的指令及相应的机器代码,可以

-U 0100 回车 ,能够看到CS:0100开始的指令及相应的机器代码。“-U ”是反汇编 若发现有误用,用“-A XXXX 回车”,重打这条指令即可

2.编制一个能在CRT上连续显示A,B,C,D······Z大写英文字符的源程序,并在源程序下汇编调试机运行。

参考源程序(DEBUG调试环境中,源程序的十六进制数后面不写H): CS: 0100 B300 MOV BL,0 0102 53 PUSH BX 0103 B220 LP1: MOV DL,20 0105 B402 MOV AH,02 0107 CD21 INT 21 0109 5B POP BX

3

010A 88D8 MOV AL,BL 010C FEC0 INC AL 010E 3C1B CMP AL,1B 0110 7502 JNZ LP2(0114) ;不能写LP2,应写0114 0112 B001 MOV AL,01 0114 88C3 LP2: MOV BL,AL 0116 53 PUSH BX ; 0117 0440 ADD AL,40 0119 88C2 MOV DL,AL 011B B402 MOV AH,02 011D CD21 INT 21 011F B9FFFF MOV CX,FFFF 0122 49 DL: DEC CX 0123 75FD JNZ DL(0122);不能写DL,应写0122 0125 EBDC JMP LP1(0103); 按CTRL+C,可中止程序运行。

运行正确后,改写程序为0,1,2,3,4,5,7,8,9的循环显示。

3.编制一个3字节压缩BCD加法源程序

若要实现123456+456789,根据低地址放低字节,高地址放高字节原则,请用E命令在DS:1000-1002单元正确存放被加数123456,在DS:1010-1012单元正确存放加数456789。

参考程序如下: CS: 0200 BE0010 MOV SI,1000 0203 BF1010 MOV DI,1010 0206 BB2010 MOV BX,1020 0209 B103 MOV CL,3 020B B500 MOV CH,0 020D F8 CLC 020E 8A04 MAD: MOV AL,[SI] 0210 1205 ADC AL,[DI] 0212 27 DAA 0213 8807 MOV [BX],AL 0215 46 INC SI 0216 47 INC DI 0217 43 INC BX 0218 E2F4 LOOP MAD(020E) 021A F4 HLT 运行结果: [1020]=______ [1021]=______ [1022]=______ SI=______ DI=______ BX=_____ 相加后结果是:_________________ F标志: O=______ S=______ Z=______ A=______ P=______ C=______ 注意:按CRT的实际显示填写。(参考书P502)

思考:DAA的作用,如果没有DAA结果会如何?

4

4.一字节十六进制数转换为ASCII码(只考虑大写字母) 用E命令在DS:1000单元中存放十六进制数5A 调试运行下面程序: CS: 0300 8D360010 LEA SI,[1000] 0304 8D3E2010 LEA DI,[1020] 0308 8A04 MOV AL,[SI] 030A 240F MOV BL,AL 030C 240F AND AL,0F 030E E80E00 CALL CHANG(031F) 0311 80E30 AND BL,F0 0314 B90400 MOV CX,4 0317 D2EB SHR BL,CL 0319 88D8 MOV AL,BL 031B E80100 CALL CHANG(031F) 031E F4 HLT 031F 3C09 CHANG: CMP AL,09 0321 7602 JBE AD30(0325) 0323 0407 ADD AL,07 0325 0430 AD30: ADD AL,30 0327 8805 MOV [DI],AL 0329 47 INC DI 032A C3 RET 运行结果: [1020]=______ [1021]=______

思考:NOP 是空操作指令,若在ADD AL,07后面,加一条NOP,结果会如何?

5、搜索字符串结束标志,统计搜索的字符个数 用E命令在DS:1000开始的单元中存放若干个ASCII字符,如:30,31,32??39,0D。(0D作为字符串结束标志), 调试运行下面程序 CS: 0100 8D3E0010 LEA DI,[1000] 0104 B200 MOV DL,0 0106 B00D MOV AL,0D 0108 AE AGAIN: SCASB ;书P150,AL减去[DI],INC DI 0109 7404 JE DONE(010F) 010B FEC2 INC DL 010D EBF9 JMP AGAIN(0108) 010F 8D1E2010 DONE: LEA BX,[1020] 0113 8817 MOV [BX],DL 0115 F4 HLT 运行结果:

搜索的字符个数存放在___________单元,该单元的值是___________ AL=__________ BX=__________ DL=__________

5

思考:把SCASB换成通用指令,如何改?

6、编制一个将N个带符号的正、负数分开的源程序。 设N=10,用E命令在DS:1000-1009单元存放10个数(1字节): 01,02,03,04,06,FF,80,81,06,07

将该数据块正、负数分开,正数放在1010为首地址的单元中,负数放在1020为首地址的单元中。 参考程序: CS: 0300 BE0010 MOV SI,1000 0303 BF1010 MOV DI,1010 0306 BB2010 MOV BX,1020 0309 B90A00 MOV CX,000A 030C AC G1: LODSB ;书P150,[SI]送给AL;INC SI 020D A880 TEST AL,80

030F 7503 JNZ MINUS(0314) 0311 AA STOSB ; 书P150,AL送给[DI];INC DI 0312 EB05 JMP AGAIN(0319) 0314 887DF MINUS: XCHG BX, DI 0316 AA STOSB 0317 87DF XCHG BX, DI 0319 49 AGAIN: DEC CX 030A 75F0 JNZ G1(030C) 031C F4 HLT

运行结果:

[1010]=_______ [1011]=______ [1012]=______ [1013]=_____ [1014]=_____ [1015]=_______ [1016]=______ [1020]=______ [1021]=_____ [1022]=_____ 思考:二条XCHG作用是什么?如果不用STOSB(功能见书P150),程序能更简洁吗?

7、编制一个将N个ASCII字符进行偶校验的源程序。 设N=8,用E命令在DS:1000—1007单元放8个ASCII字符 31,32,33,34,41,42,43,44 参考程序: CS: 0400 8D360010 LEA SI,[1000] 0404 8D1E1010 LEA BX,[1010] 0408 B90800 MOV CX,8 040B AC AGAIN: LODSB 040C 20C0 AND AL,AL 040E 7A07 JPE NEXT(0417) 0410 0C80 OR AL,80 0412 8807 MOV [BX],AL 0414 43 INC BX 0415 EB03 JMP LP1(041A) 0417 8807 NEXT: MOV [BX],AL 0419 43 INC BX

6

041A 49 LP1: DEC CX 041B 75EE JNZ AGAIN(040B) 041D F4 HLT 运行结果:

1000—1007单元内容:___________________________________________ 1010—1017单元内容:___________________________________________ 改上述程序进行奇校验,写出运行结果:

1000—1007单元内容:___________________________________________ 1010—1017单元内容:___________________________________________

8、找出无序的有符号数中的最小值和最大值

用E命令在DS:1000—100A中存放11个数:0A,80,84,82,83,81,01,02,05,04,03,其中0A为数列的个数。 调试运行下面程序: CS: 0200 8D1E0010 LEA BX,[1000] 0204 8D361010 LEA SI,[1010] 0208 8D3E2010 LEA DI,[1020] 020C B500 MOV CH,0 020E 8A0F MOV CL,[BX] 0210 49 DEC CX, 0211 43 INC BX

0212 8A07 MOV AL,[BX] 0214 8804 MOV [SI],AL 0216 8805 MOV [DI],AL 0218 43 INC BX 0219 8A07 AGAIN: MOV AL,[BX] 021B 3A04 CMP AL,[SI] 021D 740C JE NEXT(022B) 021F 7F04 JG GET(0225) 0221 8804 MOV [SI],AL 0223 EB06 JMP NEXT(022B) 0225 3A05 GET: CMP AL,[DI] 0227 7C02 JL NEXT(022B) 0229 8805 MOV [DI],AL 022B 43 NEXT: INC BX 022C 49 DEC CX 022D 75EA JNZ AGAIN(0219) 022F F4 HLT

运行结果: [1010]=____________ [1020]=____________ 若求无符号数中的最小值和最大值,请修改并调试运行程序。

7

PC 微机原理实验二

一、 目的:掌握8088汇编语言程序的编辑、宏汇编、连接及运行的操作步骤,进一步掌

握编制源程序的格式,了解编辑程序EDIT、宏汇编MASM、联机程序LINK的功能,熟悉具有扩展名.ASM、.OBJ、.LST、.EXE等文件查询。 二、 要求:在DOS环境下,用EDIT文件编辑***.ASM源程序并存盘,用MASM文件汇

编无误,用LINK文件连接无误,然后在DOS下运行***.EXE文件,用DEBUG文件检查运行结果。最后写出程序运行结果。

运行以下程序(ASCORT.EXE)后,检测结果是否按从小到大的次序(ASCII码值)。排序算法可以参考教科书P114 例4.3.10。

显示一串字符可以参考教科书P146例4.3.19。 例如要显示BUF1中的字符,可以这样写:

MOV DX,OFFSET BUF1

MOV AH,9 INT 21H ;(AH)=9 显示一串字符,首地址:DS:DX(书P146)

源程序如下: NAME: ASCSORT.ASM STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD STACK ENDS

DATA SEGMENT

BUF1 DB 43H,47H,46H,41H,42H,30H,31H,32H,33H,34H,’$’ BUF2 DB 0DH,0AH,’$’ ;使光标回车换行(参书P147) DATA ENDS

CODE SEGMENT ASSUME CS,CODE, DS:DATA, SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP ;前几句几乎是固定格式 MOV DX,OFFSET BUF1 MOV AH,9 INT 21H ; 显示BUF1中未排序的原始数据 MOV DX,OFFSET BUF2 MOV AH,9 INT 21H ; 使光标回车换行(参考书P147)

8

MOV CX, 10 ; 因为BUF1是10个字节 ;下面是排序算法的主体部分 MOV SI,CX ; SI指向DATBUF最后一单元加1 MOV BL,0FFH ; BL中置标志0FFH LOOPA: CMP BL,0FFH ; (BL)不为0FFH则转DONE JNZ DONE MOV BL,00 DEC CX ;外循环修正CX JZ DONE PUSH SI ; SI, CX---堆栈 PUSH CX ; LOOPB: DEC SI ; 内循环修正指针 MOV AL,[SI] CMP AL,[SI-1] JAE LA XCHG AL,[SI-1] MOV [SI],AL MOV BL,0FFH LA: LOOP LOOPB POP CX POP SI JMP LOOPA

DONE: MOV DX,OFFSET BUF1 ; MOV AH,9 ; INT 21H ; 显示BUF1中已经排序的有序数据 MOV CX,LENGTH DATBUF ;-----------------------------------------------------------

MOV AH,4CH INT 21H ;返回DOS ;--------------------------------------------------------- CODE ENDS END START

思考:

(1)如果要求程序执行后,显示

Please enter string: 142AFC7 回车 ;(当场输入原始数据) 1247ACF ;(排序后的结果) 该如何修改程序?

(2)实验一的第3题“编制一个3字节压缩BCD加法源程序”改写成标准汇编 例如,至少写成这样:A+B=C

INPUT A = ;输入被加数 INPUT B = ;输入加数 RESULT = ;计算的和

9

提示:显示程序可以参考书P146

PC微机原理实验三

(PC机发声程序)

一. 目的:了解8254定时器、8255可编程外围接口芯片的工作原理,掌握对这些芯片的

编程方法

二. 要求:根据参考例子,自己编写一个简单的曲子。

注:可以参考书P400“扬声器驱动原理逻辑图”

PC机上的大多数输入/输出(I/O)都是由8255可编程序外围接口芯片管理的。它包括三个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。输出寄存器中的两位来选择扬声器的驱动方式,当输出寄存器(I/O端口6 1H)的第0位为l时,控制8254定时器来驱动扬声器,当第l位为l时,扬声器的门电路接通,并一直保持到位1变为0时关闭。连接到扬声器上的是8254的2号定时器,它实际上是一个振荡电路,此电路向扬声器发送指定频率的脉冲,当输出端口61H控制扬声器为接通状态时,就发出了一定频率的声音。 PC机内的R0M BIOS中有个BEEP子程序,它能根据BL中给出的时间计数值控制8254定时器,产生持续时间为1个或几个0.5秒,频率为896Hz的声音,这个子程序的用途是当“加电自测\系统发现硬件错误后,由ERROR—BEEP处理程序调用BEEP子程序,使扬声器发出“嘟嘟’’的信号。BL中的时间计数值由ERROR—BEEP程序设置为533H,BEEP子程序将此计数值送给8254的定时器2来产生896Hz的声音,然后BEEP又将AL的第0位和第l位置1,并把AL的值送到8255的输出寄存器(1/O端口61H),使扬声器接通发出声音。

实际上BEEP是一个很好的通用发声程序,我们可以利用并修改BEEP,使其产生任一频 率的声音。为此我们需要做两点修改,首先,BEEP程序只能产生896Hz的声音,我们的通用发声程序应能产生任一频率的声音。其次,BEEP产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间易于调整,例如可以是l0ms的倍数。

我们知道BEEP是将计数值533H送给定时器2产生896Hz的声音的,那么产生其它频率 声音的时间计数值应为: .

533H×896÷给定频率=l23280H÷给定频率

假定发声的频率存放在D1寄存器中,下面的指令在AX中得到送往定时器.2的计数值: MOV DX,l2H

MOV AX,533H*896 DⅣ DI

10ms的延迟时间可以简单地通过执行循环指令取得: WAIT: MOV CX.2801

DELAY: LOOP DELAY

注意:这个时间是在老的8086上运行的时间,现代“奔腾”要快得多,必须调整!

10

如果要产生与l0ms成倍数的延迟时间,可在BX寄存器中放入倍数。例如要产生l秒的持续 时间,则在BX中放入100,以控制LOOP指令执行100×2801次,也就是1 0ms的100倍。指令 如下:

MOV BX,100 WAIT: MOV CX,2801 DELAY: LOOP DELAY DEC BX JNZ WAIT

这样我们就能在修改后的BEEP程序的基础上编写一个任一频率(由Dl指定)和任一持续时 间(由CX和BX指定)的通用发声程序。它包括三个步骤:

1.在2号定时器中的43端口送一个特定的数OB6H(1 0 11 0 1l OB),此数对定时器的方

式寄存器进行初始化,使定时器2准备接收计时常数。

2.在2号定时器中的4 2H端口装入一个l 6位的计时常数(533H×896/频率),以建立将 要产生的声音频率。

3.把输出端口61H的0、1两位置1,发出声音。

下面举例说明8253计数器2产生一定频率的方波并送至扬声器发音的程序 例:欲使8253的计数器2产生600 Hz的方波,经滤波后送至扬声器发音,当按下任一键时声音停止。试编写此程序。8253的端口地址为40H~43H,8255A的端口地址为60H~63H。 .

解:

计数器2的时钟输入:T2=t/f2=t/1.19 MHz≈840 ns 方波发生器OUT2的输出周期为:1/600 Hz≈l.665 ms

计数器2方波发生器的计数初值为:l.665 ms/840 ns≈l983 利用上述办法,编制的源程序如下。

STACK SEGMENT PARA STACK ‘STACK ’ DB 256 DUP(0) STACK ENDS

DATA SEGMENT PARA PUBLIC ‘DATA’

FRED DW l983 ;1.19 MHz/600 Hz=1983为计数值 DATA ENDS

CODE SEGMENT PARA PUBLIC ‘CODE’ ASSUME CS:CODE,DS:DATA,SS:STACK

;--------------------------------------- START PROC FAR

PUSH DS

MOV AX,0 ;为正确返回DOS保存地址 PUSH AX

MOV AX,DATA

MOV DS,AX ;设置DS指向DATA数据段

;-----------------------------------------

IN Al, 61H ;读PB口当前状态 0R Al, 03H ;使PB1 PB0均为1

OUT 6lH, AL ;输出PB口以使扬声器发声

11

;--------------------------------------------------

MOV AL,101101108 ;控制字D7D6=l0选择计数器2,D5D4=11先写低8位

;再写高8位,D3D2D1=011工作在方式3(方波发生器), ;D0=0二进制计数

OUT 43H,AL ;命令写入8253控制寄存器

;---------------------------------------------------

MOV BX,FRED ;设分频计数值(1983) MOV Al,BL ;先写低位字节 OUT 42H,AL

MOV AL,BH ;再写高位字节 OUT 42H,AL

;--------------------------------------------------

MOV AH,0 ;INT l6H的功能号0调用是从键盘读入字符,出口是AL中为

;键盘输入字符的ASCIl码(见BIOS中断调用)。

INT l6H

;------------------------------------------------------------

IN AL,61H ;读PB口的当前状态 AND AL,11111100B ;使PB,、PB。均为O OUT 61H.AL ;扬声器停止工作

;-----------------------------------------------------------

RET ;结束,返回DOS START ENDP

乐曲程序

利用通用发声程序,可以编写演奏乐曲的程序。乐曲是按照一定的高低、长短和强弱关系组成的音调,在一首乐曲中,每个音符的音高和音长与频率和节拍有关

组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。音符的频率可以,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。在4/4(四四拍)中,四分音符为一拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续l拍,八分音符持续半拍等。如果我们给全音符分配1秒的时间,则二分音符的持续时间为0.5秒(50 X1 0ms),四分音符的持续时间为O.25秒(25×1 0ms),八分音符的持续时间为0.1 25秒(1 2.5×1 0ms)。

知道了音调与频率和时间的关系,我们就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表,然后编写程序依次取出表中的频率值和时间值,调用通用发音程序发出各种声音。

编写乐曲程序可分为四个步骤:

1. 为演奏的乐曲定义一个频率表(FREQ)和一个节拍时间表(TIME),例如: FREQ DW 330,294,262,294,3 DUP(330) ;1,2小节

DW 294,294,294,330,392,392 ;3,4小节 DW 330,294,262,294,4 DUP(330) ;5,6小节

DW 294,294,330,294,262,0FFFFH ;7,8小节,其中0FFFFH是结束符 TIME DW 6 DUP(25),50 ;l,2小节

Dw 2 DUP(25,25,50) ;3,4小节

12

DW l2 DUP(25),1 00 ;5—8小节 2.分别将两个表的偏移地址放入Sl和BP LEA SI,FREQ LEA BP,DS:TIME

3.从表中取出音符的频率放入DI,取出音符的持续时间放入BX MOV DI,[SI] MOV BX,DS:[BP]

4.调用通用发音子程序发出音调

下面是按某乐谱编写的一个演奏程序,同时在屏幕上显示字符。

调试程序,若调不通,请仔细检查和修改;调通后说明具体完成什么功能?画出程序的流程框图。

dseg segment

freg dw 262, 294,330,349,392,440,494 times dw 7 dup(65535) num db ? num1 db 3 count db 7

mess db '*musci1.exe*','$' dseg ends

stack segment para stack 'stack' dw 100 dup(?) stack ends

cseg segment

assume cs:cseg,ds:dseg,ss:stack main proc far start: push ds sub ax,ax push ax

mov ax,dseg

mov ds,ax mov es,ax mov al,1ch mov ah,35h int 21h push es push bx push ds

mov dx,offset musc mov ax,seg musc mov ds,ax mov al,1ch

13

mov ah,25h int 21h pop ds in al,21h and al,0feh out 21h,al sti

mov cl,0

mov byte ptr num,cl lp1: mov cl,byte ptr num mov al,cl inc al cmp al,1bh jnz lp2 mov al,1 lp2: mov cl,al

mov byte ptr num,cl add al,40h mov dl,al mov ah,2 int 21h mov dh,10 lp4: mov cx,0 lp3: loop lp3 dec dh jnz lp4

mov al,byte ptr num1 xor al,0 jnz lp1 pop dx pop ds mov al,1ch mov ah,25h int 21h in al,21h or al,1 out 21h,al cli ret main endp

musc proc near push ds push ax

14

push cx push dx

mov ax,dseg mov ds,ax dec count jnz exit

mov dx, offset mess mov ah, 9 int 21h

mov si, offset freg mov bp, offset times loop1:mov di,[si] cmp di,0 je exit1

mov bx,ds:[bp] call sound add si,2 add bp,2 jmp loop1

exit1: mov byte ptr count,7 dec byte ptr num1 exit: sti

pop dx pop cx pop ax pop ds iret musc endp

sound proc near push ax push bx push cx push dx push di

mov al,0b2h out 43h,al mov dx,12h mov ax,3280h div di out 42h,al mov al,ah out 42h,al in al,61h

15

mov ah,al

or al,3 out 61h,al delay: mov cx,20000 loop2: loop loop2 dec bx jne delay mov al,ah out 61h,al pop ax pop bx pop cx pop dx pop di ret sound endp cseg ends

end main

PC微机原理实验四

双机通信(设计性实验)

一、目的:了解两个RS-232C接口各引脚的定义及相互连结,掌握异步通信的帧格式及8052串行接口芯片的初始化编程,掌握查询方式双机通信一般的编程方式。

二. 要求:独立设计接收(SHOU.ASM)和发送(FA.ASM)程序

(可以参考书P423)

注意:

(1) 运行XXX.EXE文件之前,要检查通信连线是否连结好。

(2)两机同时运行程序时,一方键入的字符,会在对方的屏幕上显示出来,特别要注意

两机不能同时按键,即一方发送时,另一方只能接收。

(3)若要在单机上实现串行通信,不考虑连线,只需把13H写入MODEM控制寄存器

(3FCH),由8250回送,要求键盘输入的字符与显示的字符差“1”,例如:键入“1” 应显示“2”;键入“A”,应显示“B”。

三、零MODEM方式接法(参考书P416图11.10)

微机(甲) 微机(乙)

16

TX------------------------RX

RX------------------------TX ;TX、RX交叉相连 RTS-----------------------CTS

CTS---------------------- RTS ;RTS、CTS交叉相连 DSR---------------------- DTR DTR---------------------- DSR ;DTR、DSR交叉相连

GND----------------------GND ;别忘记连GND 以下是段定义(自己设计编写):

以下是程序的主题部分(按提示要求设计编写):

;指向线路控制寄存器

;设置波特率 ;波特率为1200 ;建立数据格式 ;指向MODEM控制寄存器 ;双机通信(单机通信该如何?)

;指向中断允许寄存器

;禁止所有中断

17

;指向线路状态寄存器

;读状态

;检测错误

;有错转移

;接收数据就绪? ;是,转接收

;否,发送寄存器空? ;不空,循环等待 ;检测键盘输入

;无,循环等待 ;有,读键盘输入

;是ESC键? ;是,返回DOS ;指向数据寄存器 ;发送字符

;取接收字符 ;取ASCII码

;显示字符

;是回车键? ;否,继续下一个 ;是,换行 ;出错处理

18