c语言编写n n矩阵转置程序,将无符号整数X的高八位均置为1,低八位保持不变。

计算机组成原理作业讲解1-4章 答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
计算机组成原理作业讲解1-4章 答案
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩19页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢北京交通大学单片机第4章参考答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
北京交通大学单片机第4章参考答案
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩17页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢实验一 基本程序编程和程序调试一、实验目的1、 掌握数码转换等基本程序设计的技巧和方法。 2、 熟悉 DEBUG 命令。 3、 学会和掌握用 DEBUG 调试程序的方法。二、实验设备PC 机一台,装有 DOS 基本系统三、实验内容及步骤用 DEBUG 建立、汇编和运行调试程序的操作。DEBUG 是 DOS 系统支持的用于汇编语言源程 序调试的系统软件。它共有 19 条命令完成相应的功能,命令及其格式可参阅附录一。 (一) DEBUG 操作练习 1)实验调试程序 程序的功能是从 3500H 内存单元开始建立 0-15 共 16 个数据。程序如下: 地址 (H) 机器码(H) 助记符 2000 BF0035 MOV DI,
B91000 MOV CX,
B80000 MOV AX, E SAHF 200A 8805 MOV BYTE[DI],AL 200C 47 INC DI 200D 40 INC AX 200E 27 DAA 200F E2F9 LOOP 200A 2011 F4 HLT 2)实验步骤: (1)输入与修改 ① 启动 DOS,在 DOS 提示符下输入 D E B U G 后回车,屏幕立即显示 DEBUG 提示符“―” , 表明已进入 DEBUG 状态,可以执行 DEBUG 的各种命令。 ② 用 DEBUG 中的汇编命令 “A 地址”将程序建立在内存单元中。 在提示符“―”下键入 :1 “A 2000 ?” 此时显示器上将会显示程序的段地址 CS 和偏移地址 IP,你就可以输入以上的程序 了。即 显示 169C :2000 键入 MOV DI, C: 2003 MOV CX, 0010169C: 2011 HLT : : ③ 用反汇编命令 “U 地址”检查程序:在提示符“―”下,键入 “U 2000?” ,将从 2000 内存单元开始的内容反汇编,屏幕上显示 169C:2000 BF0035 MOV DI, C: MOV CX, C: MOV AX, 0000 : : : : : : 169C:2011 F4 HLT 当发现程序有错时,可用汇编命令“A 地址”进行修改,如要修改 200A 单元中的指令, 则键入 “A 200A?” ,屏幕显示 169C:200A ,然后再键入 MOV BYTE[DI], AL?,就把错误的程 序改正了。 (2)显示和修改数据 ①用修改内存单元命令 “E 地址” 在指定内存单元中存入一个数。 如要在 3500 为首址的单元中存入 14H 和 25H 两个数据,可在提示符“―”下,键入: 3500?” “ 显示 169C:3500 ××. 键入 14,按空格键 ××. 25,按空格键 ②用显示内存命令 “D 地址” 检查指定单元的内容在提示符“―”下,键入 “D3500?” 显示
14 25 48 02 ????
** ** ** ** ???? : : : :
** ** ** ** ???? 若某单元内容有错则可用命令: “E 地址 ”进行修正。 ③用显示和修改命令 “R ”或“R 寄存器名”显示寄存器或修改其内容 在提示符“―”下,键入 “R?” 显示 AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE????????2 DS=169C ES=169C SS=169C CS=169C IP=2000????????? 要修改 IP 的内容时,键入命令 “R IP”后, 显示 IP 2000,在 2000 之后键入新内容。 (3)程序运行 程序的运行方式有单步运行、断点运行和连续运行几种方式。 ①单步运行 输入 DEBUG 跟踪命令“T”或“T=地址”或“T=地址 指定次数” ,可从指定地址处运行该单元 中的一条指令,以后只要连续输入“T”命令就能连续执行一条一条指令。 如在提示符“―”下,键入 “T=2000 ?” 显示 : AX=0000 BX=0000 CX=001D DX-0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=169C ES=169C SS=169C CS=169C IP=2000 NV??? 169C: MOV CX, 0010 ②断点运行 用运行命令 “G=地址 地址断点 地址断点?”执行指定地址的程序 在提示符“―”下,键入 “G= ?” 显示 169C:2011 F4 HLT 表示这段程序已经执行完毕。 ③连续运行 输入 DEBUG 命令“G=地址” ,执行指定地址的程序 (4)用显示内存命令检查运行结果 在提示符“―”下,键入命令 “D 地址?” ,根据其中的内容判断程序运行是否正确。 如检查以上程序执行后的结果,在提示符“―”下,键入“ D 3500?” ,可显示 169C: 02 03 04 ?? 15 169C:3510 (二)数码转换程序及其调试 1、 将 ASCII 码表示的十进制数转换为二进制数 1)程序设计的算法及其程序 十进制数据可表示为:Dn ? ??n ? Dn?? ? ??n?? ? ? ? D? ? ??? ? ? Di ? ??ii ??n(?)DI 代表十进制数 1,2,3,?9,0 上式可转换为:? D ???i ?? ini? ((? Dn ??? ? Dn?? ) ???) ? Dn?? ) ??? ? ? ? D? ) ??? ? D ? ((?)由式(2)可归纳十进制数转换为二进制数的方法:从十进制的最高位 Dn 开始乘 10 加次位的操3 作,将结果再乘 10 再加下一次位,如此重复,则可求出二进制数结果来。程序流程及参考程序如图 1-1。这里我们规定:被转换的 ASCII 码十进制数存放在 3500H――3504H 单位中。而转换结果存放 在 3510H――3511H 单元中。 2)实验步骤 (1)输入程序并检查无误。 (2) 3500H――3504H 单元存入十进制数 12 的 ASCII 码, E3500HL, 在 即 并输入 H。 (3)G=2000L,运行程序,并用 CTRL+C 来中断程序返回监控状态。 (4)用 D3510L来查看结果,应为: (5)反复试几组数,考查程序的正确性。 地址(H) 06 0E 14 1A 201C 201E 助记符 MOV SI,3500 MOV DI,3510 MOV BX,000A MOV CX,0004 MOV AH,00 MOV AL,[SI] SUB AL,30 IMUL BX ADD AL,[SI+01] SUB AL,30 INC SI LOOP 2012 MOV [DI],AX INT 3 注释 ;源地址 ;结果地址 ;乘数 10 ;计数 ;AH 清零 ;取被转换数 ;ASCII 码变十进制数 ;高位(AX)*(BX)送 AX ;取下一位 ;ASCII 码减 30 变十进制数 ;源地址指针+1 ;CX-1,若 CX 不等于零则继续 ;若 CX 不等于零则存结果图 1-1 2 将十进制数的 ASCII 码转换为 BCD 码1)程序流程和程序 设从键盘输入的五位十进制数的 ASCII 码已存放在 3500H 起始的内存单元内,把它转换成 BCD 码后,再按位分别存入 350AH 起始的内存单元内。若输入的不是十进制数的 ASCII 码,则对应存放 结果的内容为“FF” 。一字节 ASCII 码取其低四位即变为 BCD 码,程序流程图及考程序如图 1-2 所 示。 2)实验步骤 (1) 输入程序并检查无误。 (2) 在 3500H――3504H 单元中存入五位十进制数的 ASCII 码,即 E3500L,并输入 31,32,33,34,35。 (3) G=2000L,运行以上程序。 (4) D350AL,显示结果为:4 A 01 02 03 04 05 CC? (5) 反复试几组数,考查程序的正确性。 地址(H) 06 0C 200E 14 1A 201C 助记符 注释 MOV CX,0005;循环计数器赋初值 MOV DI,3500;ASCII 码首址 MOV BL,FF; 错误标志送 BL MOV AL,[DI];送 ASCII 码至 AL CMP AL,3A; 比较 AL 与 3AH JNB 2014; 不低于 3A 则转 2014 SUB AL,30; 低于 3A 则取 ASCII 码的低四位 JB 2014; 低于 30 则转 2014 MOV BL,AL; 否则 AL 内容送 BL,取代 FF MOV AL,BL; 结果或错误标志送 AL MOV [DI+0A],AL INC DI LOOP 2006 INT 3 图 1-2 3 将十六位二进制数转换为 ASCII 码表示的十进制数 1)程序及其流程 十六位二进制数的值域为 0――65535,最大可转换为五位十进制数。 算法:五位十进制数可表示为:N D ? D? ???? ? D? ???? ? D? ???? ? D? ??? ? D?Di:表示十进制数 0――9。 因此,将十六位二进制数转换为五位 ASCII 码表示表示的十进制数,就是求 D1――D4,并将它 化为 ASCII 码。程序流程图如图 1-3 所示,设源数据存于 3500――3501H 单元中,结果数存于 3510 ――3514H 单元中。 2)实验步骤 (1) 输入程序并检查无误。 (2) 在 3500――3501H 单元中存放 0C00,运行程序并检查结果,应看到 3510――3514H 单元中 的数依次为 。 (3) 反复试几组数,并运行程序、观察结果。5 地址(H) 07 0D 14 1B 201D 24 2A助记符 注释 MOV DX,[3500];取二进制数 MOV SI,3515; 目标首址在 3510 DEC SI MOV AX,DX MOV DX,0000 MOV CX,000A DIV CX; ; 除 10 XCHG AX,DX ADD AL,30 MOV [SI],AL CMP DX,0000 JNE 2007 CMP SI,3510 ; 填余下高位为 0 JZ 202A; DEC SI MOV AL,30 MOV [SI],AL JMP 201D INT 3 图 1-34、 十六进制数转换为 ASCII 码 1) 程序及其流程 经过 CPU 处理后的十六进制数存放在起始地址为 3500H 的内存单元中,把它们转换成 ASCII 码之后,再分别存入起始地址为 350AH 的内存单元中。 从表 2-1 中可知,十六进制数加 30H 即可得到 0H――9H 的 ASCII 码,而要得到 AH――FH 的 ASCII 码,则需再加 7H。程序流程图及参考程序如图 1-4 所示。 2)实验步骤 (1) 输入程序并检查无误。 (2) 在 3500――3501H 单元中存入四位十六进制数 203B,即 E3500L,并输入 3B,20。 (3) G=2000L,运行以上程序 (4) D350AL,显示结果为: A 42 33 30 32 CC? 输入数据与结果 ASCII 码对应顺序相反。 (5) 反复试几组数。考查程序的正确性。6 地址(H) 06 0D 200F 15 1A 201C 201E 201F 2021助记符 注释 MOV CX,0004 MOV DI,3500 MOV DX,[DI] MOV AX,DX AND AX,000F ;取低四位值 CMP AL,0A; ; 判是否“0”-“9” JB 2013 ; 是“0”-“9”转 2013 ADD AL,07; 是“A”-“F” ,加 7 ADD AL,30; 转换为 ASCII 码 MOV [DI+0A],AL INC DI PUSH CX ;保护循环计数器内容 MOV CL,04; 移位次数送 CL SHR DX,CL POP CX LOOP 2008 INT 3 图 1-44BCD 码转换为二进制数1) 程序及其流程 设四个二位十进制数的 BCD 码存放在起始地址为 3500H, 的单元中,转换出的二进制数码存入起始地址为 3510H 的内存 单元中,程序流程图及参考程序如图 1-5 所示。 地址(H) 06 0C 200E 13
助记符 注释 CX,0004 DI,3500 AL,[DI] AL,AL ;乘 2 BL,AL AL,AL ;乘 2 AL,AL ;乘 2 AL,BL ;乘 10 DI AH,00 AL,[DI]; BCD 码十位与个位加 [DI+0F],AX;存结果MOV MOV MOV ADD MOV ADD ADD ADD INC MOV ADD MOV图 1-57 201A 201B 201DINC DI LOOP 2006 INT 32)实验步骤 (1) 输入程序并检查无误。 (2) 在 3500――3507 单元中存入四个十进制数(12,34,56,78)的 BCD 码,即 E3500L 输 入 01,02,03,04,05,06,07,08。 (3) G=2000L,运行以上程序。 (4) D3510L,显示结果为
22 00 38 00 4E 00 (5) 反复试几组数,考查程序的正确性。 四、思考题 1、 图 1-1 程序,将一个五位十进制数转换为二进制数(十六位)时,这个十进制数最小可为多少, 最大又可为多少?为什么? 2、 将一个十六位二进制数转换为 ASCII 码十进制数时,如何确定 D1 的值? 3、 在十六进制数转换为 ASCII 码时,存转换结果后,为什么要把 DX 向右移四次? 4、 自编 ASCII 码→十六进制、十进制小数→二进制、二进制→BCD 码的程序,并调试运行。8 实验二程序设计和 PC 机上程序调试操作实验一、 实验目的1.掌握常用程序设计的基本技巧和方法。 2.学会和熟悉使用 MASM 汇编程序和 LINK 连接程序。 3.掌握使用 PC 机上编程和调试程序的方法。二、 实验设备PC 机一台,装有 DOS 基本系统和 MASM 宏汇编软件三、实验内容及步骤(一)按要求编写程序并在 DEBUG 下建立、汇编和调试程序1、 四字节二进制数的加法1)程序设计要求 两个字的被加数存放于 3500H-3503H 单元, 加数存于 3504H-3507H 单元 (存放格式为 高位存高地址单元, 低位存低地址单元) 两数之和 , (如不超过四字节) 存放于 3508H-350BH 单元。 2)实验步骤 (1)编写程序。 (2)在 DEBUG 下输入程序并检查(程序可存放于 2000H-8000H 单元) 。 (3)在 3500H-3507H 单元中存入被加数 014527 和加数 146758。 (4)运行程序后,检查 3508H-350BH 单元中内容。 (5)反复选择几组被加数和加数,检查结果,验证程序正确性。2、数据块的搬移1)程序设计思想和要求 将内存中一数据区中数据(源数据块)传送到另一数据区(目的数据块) 。 源数据块和目的数据块区在内存中的位置有两种情况:两区重叠和不重叠,如下图所示。 对于两个数据块不重叠的情况, 数据的传送可从数据块的首址开始, 也可从数据块的末址开始; 对于两个数据块重叠的情况,则要加以分析,否则重叠部分会因搬移而遭破坏。处理方法可以是: 在源数据块首址>目的数据块首址时,从数据块的首址开始传送,在数据块首址<目的数据块首址 时,从数据块的末址开始传送。 若源数据块首址存放于 SI 中,目的数据块首址存放于 DI 中,块字节数存放于 CX 中。要求设 计的程序能够实现不同情况下的数据块传送。9 源数 据块源 数 据 块 目的 数 据 块目的数 据块2)实验步骤 (1)编写程序。 (2)在 DEBUG 下键入程序并检查(程序可存放于 2000H-8000H 单元) 。 (3)确定源数据块和目的数据块区不重叠时的首址,确定数据块个数为 16 个。并在源数据区送 入任意16个数据。 (4)运行程序后,检查目的数据区的内容。 (5)确定源数据块和目的数据块区重叠时, 源区首址>目的区首址时的首址, 以及数据块个 数为 16 个,并在源数据区送入任意16个数据。运行程序后,检查目的数据区的内容。 (6)确定源数据块和目的数据块区重叠时, 源区首址<目的区首址时的首址, 以及数据块个 数为 16 个,并在源数据区送入任意16个数据。运行程序后,检查目的数据区的内容。3、无序数据块的递增排序1)程序设计思想和要求 在首址为 3000H 的数据区中存放着一组无符号数, 数据的长度存于 3500H 单元内,要求用冒 泡法对该区中的数据按递增次序排列。 冒泡法的基本思想是从最后一个数(或从第一个数)开始,依次把相邻两个数比较,即第N个 数与第N-1个数比较?,若大则交换,否则不交换,直到N个数都比较完为止。此时,其中最小 数排在最前列。然后将剩下的N-1 个数再按前述方法进行,找到 N-1 个数中最小的数。以后重复进 行,直到全部按序排列。 2)实验步骤 (1)编写程序。 (2)在 DEBUG 下键入程序并检查(程序可存放于 2000H-8000H 单元,只要不与数据区重叠 即可) 。 (3)确定数据个数并输入 3500H 单元中,在首址为 3500H 的数据区中存入任意无符号数。 (4)运行程序并检查运行结果。 (6)反复修改数据个数和数据区中的数,运行程序、观察结果,验证程序的正确性。10 4、求数的平方根1)程序设计思想和要求 减奇数法是一种求取近似平方根和平方根的整数部分的方法。有公式:n?(2K-1)=Nk=12若要求数 S 的平方根 ?S, 则可以从 S 中减去奇数 1、3、5?直到减为零或不够减下一个奇数 为止,然后统计减去的奇数个数,它就是 S 的近似平方根。 被开方数为一个足够大的二进制数, 存于首址为 4000H 的单元内,它的方根存放在以 4500H 为首的单元内。 2)实验步骤 (1)编写程序。 (2)在 DEBUG 下输入程序并检查(程序可存放于 2000H-8000H 单元,和数据存放单元不要 重叠) 。 (3)在 4000H 为首的单元中存入一个任意大的数。 (4)运行程序并检查运行结果。 (6)反复修改被开方数,运行程序、观察结果,验证程序的正确性。5、思考题① 如果二进制加数和被加数不限于四字节而为任意字节时,程序应作如何改动? ② 修改原有的无符号数的排序程序为带符号数的排序程序。 ③ 被开方数是一压缩型的 BCD 码十进制数时,程序应作如何修改?(二)MASM 汇编程序和 LINK 连接程序的使用操作在 DEBUG 中,使用 A 命令建立程序,一般不能使用标号和伪指令,并不能保存汇编语言源程 序,适用于简单程序。MASM 宏汇编程序可以将编辑程序建立的源程序文件进行汇编,汇编后在盘 上建立目标文件、列表文件和交叉参考文件。而目标文件经 LINK 程序连接以后成为可执行的文件, 它可以在 DOS 下执行也可在 DEBUG 下调试。 1、计算机钢琴程序 1)实验内容 根据乐曲中不同的音符是由输出不同频率的声波而产生的原理, 通过设置 PC 机中 8253 定时器 不同的计数值,可由扬声器发出不同的曲调。 以下是实现 PC 机作为一架可弹奏的钢琴演奏预定的 曲调。程序中采用了 INT 21H 软中断调用了 DOS 的常用子程序。 源程序为:11 DATA MESS TABLESEGMENT DB ‘Push any key to stop!’,0dH,0aH,’$’ DW 524,588,660,698,784,880,988,20,0DB 31H,31H,32H,31H,35H,34H,3BH DB 31H,31H,38H,36H,34H,33H,32H,3BH DB 36H,36H,36H,34H,35H,34H,3BH,0AAHTABLEL DB 31H,31H,32H,31H,34H,33H,3BHDATA STACK STA STACK CODEENDS SEGMENT PARA STACK DB 256 DUP(?) ENDS SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACK, ES: DATA DIV WORD PTR [TABLE+BX] ‘STACK’STARTPROCFARPUSH DS XOR AX, PUSH AX MOV AX, MOV DS, MOV ES, DATA AX AX AXMOV BX, AX MOV AL, OUT 43H, MOV AX, B AL BXOUT 42H, AL MOV AL, AHMOV AH, 09H LEA DX, MESS INT 21H KK: LEA SI, TABLELOUT 42H, AL IN AL, OR AL, 61H 03H ALOUT 61H,CALL DELAY IN AL, AND 61H 0FCH ALAL,OUT 61H, QQ: SING: MOV AH, MOV DL, INT 21H JNE FINISH [SI] 3BH DELAY PROC NEAR PUSH CX PUSH AX 06H 0FFH FINISH: START INC SI JMP SING RET ENDPMOV AL, CMP AL, JNE DDD;延时子程序CALL DELAY JMP QQ DDD: CMP AL, JE KK SUB AL, 31H 0AAH X1: X2:MOV AX, 500H MOV CX, 0FFFFH DEC CX JNZ X2 DEC AX;大循环次数; 小循环次数12 SHL AL, MOV BL,01H ALJNZ X1 POP AX POP CX RET DELAY ENDP CODE ENDSMOV AX, 0000H MOV DX, 12H MOV BH, 00HEND START2)实验步骤 (1)利用 EDIT 全屏幕编辑程序或 TURBO PASCAL 中的编辑功能输入以上程序,以文件名为 PLAYPIA.ASM 存盘。 (2) DOS 系统下执行子目录 MASM 中的执行文件 MASM.EXE , 在 用宏汇编程序将 PLAYPIA.ASM. 汇编成目标文件 PLAYPIA.OBJ。操作过程如下: 显示 键入 C:\MASM& MICROSOFT(R) ???? COPYRIGHT(C)????? MASM?SOURCEFILENAME [.ASM]PLAYPIA? ?OBJECT FILENAME [PLAYPIA.OBJ] SOURCE LISTING[NUL.LST] CROSS-REFERENCE[NUL.CRF] WARNIING ERRORS 0 SEVERE ERRORS 0 如 ERRORS 均为 0 表示汇编正确,如不为 0,则必须在编辑状态下重新修改源程序。 (3)运行子目录 DOS 下 LINK 执行文件将目标文件 PLAYPIA.OBJ 连接成为可执行的文件 PLAYPIA.EXE。操作如下: 显示 键入 C:\ MICROSOFT(R)?????????? COPYRIGHT(C)?????????? OBJECT MODULES[.OBJ]: RUN FILE[PLAYPIA.EXE] PLAYPIA LINK PLAYPIA?? ?13 LIST FILE[NUL.MAP] LIBRARIES[.LIB]PLAYPIA??C:\ (4)在 DOS 下直接键入由 MASM 宏汇编和 LINK 连接程序生成的可执行文件文件名 PLAYPIA, 运行程序观察运行结果。 (6) 修改程序中延时子程序的循环次数,重新汇编、连接后运行。2、求数据块的最小值和最大值1)实验内容 在以 BUFFER 为首址的内存中存放了若干个带符号数, 其个数存放在首单元,寻找出它们最大 值放到存储单元 MAXVAL 中, 最小值放到存储单元 MINVAL 中。汇编语言源程序如下: DATA SEGMENT BUFFER DB 10,22,33,-80,127,-76,0,90,-45,60,-1 MINVAL DB ? MAXVAL DB ? DATA STACK STA STACK CODE START ENDS SEGMENT PARA STACK ‘STACK’ DB 100 DUP(?) ENDS SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK PROC FAR PUBH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX LEA BX, BUFFER MOV CH, 0 MOV CL, [BX] INC BX MOV AL, [BX] MOV MINVAL, AL MOV MAXVAL, AL INC BX DEC CX MOV AL, [BX]AGAIN:14 A1:NEXT:START CODECMP AL, MINVAL JE NEXT JG A1 MOV MINVAL, AL JMP NEXT CMP AL, MAXVAL JL NEXT MOV MAXVAL, AL INC BX DEC CX JNE AGAIN RETF ENDP ENDS END START2)实验步骤 (1)用编辑程序建立源程序文件,文件名自定。 (2)用 MASM 宏汇编程序和 LINK 连接程序将源程序文件汇编生成以 EXE 为扩展名的执行文件。 (3)用 DEBUG 调试程序将由上产生的 EXE 可执行文件送入内存,先用反汇编命令检查程序内容 和首末地址,然后检查以 BUFFER 为首址的存储单元中数据块和 MINVAL、MAXVAL 单元的内容。 BUFFER 地址单元的段地址和偏移地址是由系统在汇编和连接时指定的。各个不同的系统都不一 样,一般来说,偏移地址为零,段地址可在反汇编程序时,根据指令 MOV AX, DATA 对应机 器码中 DATA 的值来确定。 (4)在 DEBUG 下运行程序,检查运行结果。 (5)修改源程序中 BUFFER 数据区的各数据,重新汇编后再运行,检查结果。3、从无序数列中删除一个元素1)实验内容 在 BUFFER 为首址的内存区中存放了一个无序字符串,其长度存放在第一个字节单元,在 KEY 单 元内存放了要删除的一个字符,查找此无序字串,若找到则删除并作相应调整,若字串中无此字符 则在 FLAG 单元内置 FFH 标志。其程序流程图如下。 2)实验步骤 (1)按以上框图编写程序,并任意设定字符个数和字符串。 (2)输入汇编语言源程序,文件名自定。 (3)用 MASM 和 LINK 程序汇编和连接生成 EXE 执行程序。 (4)运行该程序,并检查结果。 (5)修改字符串及其个数,再运行程序,验证程序的正确性。15 设地址指针, 取串长度 ?CXKEY 内容 ?AL搜索字串找到否? N Y CX―1 串搜索 N 完否? 以要删除的数据的地址 为目的地址,下一个数 据的地址为源地址,以 剩下的数据个数为传送 次数进行传送 Y 置 FLAGE 单元返回4、思考题① 计算机钢琴程序中,INT 21 的作用是什么?指令 DIV WORD PTR[TABLE+BX]中为什么要 用操作符 WORD PTR?延时子程序 DELAY 中为什么要把 AX、CX 压入栈? ② 在求最大和最小值的程序中,有指令 MOV MINVAL,AL 和 MOV MAX MAXVAL,AL 将 第一个数存入这两个单元,可以用哪两个立即数直接存入这两个单元也可达到同样效果? ③ 若求无符号数据块的最大和最小值,那么程序要作哪些修改? ④ 删除一个升序或降序字符串中一个字符时, 程序应如何修改可使在找不到这个字符时搜集次数减 少?四、实验报告要求1.对所有程序写上较详细的注释。 2.整理出实验中数据和运行结果。 3.总结 DEBUG 程序、MASM 宏汇编、LINK 连接程序的调试程序的方法和经验。 4.根据思考题写出答案和运行结果。16 实验三 DOS 系统功能调用及模块化程序设计一、实验目的2、 熟悉 DOS 系统中基本功能子程序的作用及其调用方法。 3、 结合 DOS 系统中键盘和显示功能子程序的调用和汇编语言源程序结构设计有关程序。 4、 掌握复杂程序的设计思想―模块化程序设计的方法。二、实验设备PC 机一台,装有 DOS 基本系统和 MASM 宏汇编软件。三、实验内容及步骤 (一)DOS 键盘、显示基本功能子程序调用DOS 提供了许多系统功能子程序可由程序设计者调用,其中最基本的是键盘和显示操作功能 的调用,具体调用的方法可参阅教科书。 1、 显示缓冲区的字符串 1)实验程序: DSEG SEGMENT STRING DB ‘Welcome to DONG HUA University!’,0dH,0aH,’$’ DSEG ENDS STACK SEGMENT PARA STACK ‘STACK’ DB 256 DUP (?) STACK ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG, DS: DSEG SS: STACK START: PUSH DS MOV AX, 0 PUSH AX MOV AH, 9 MOV DX, SEG STRING MOV DS, DX MOV DX, OFFSET STRING INT 21H RET17 ENDP ENDS END START 2) 实验步骤: (1)建立源程序文件。 (2)用 MASM 宏汇编程序和 LINK 连接程序生成执行程序。 (3)运行执行程序,输入不同字母,观察结果。 2、键盘输入小写字母,显示器显示大写字母 1)实验程序: CSEG SEGMENT MAIN PROC FAR ASSUME CS:CSEG START:PUSH DS MOV AX, 0 PUSH AX BEGIN: MOV AH,1 INT 21H CMP AL, ‘a’ JB STOP CMP AL, ‘z’ JA STOP SUB AL, 20H MOV DL, AL MOV AH, 2 INT 21H JMP BEGIN STOP: RET MAIN ENDP CSEG ENDS END START 2) 实验步骤: (1)建立源程序文件。 (2)用 MASM 宏汇编程序和 LINK 连接程序生成执行程序。 (3)运行执行程序,输入不同字母,观察结果。 3、从键盘输入一个二位十进制的月份数(01-12) ,显示相应月份的英文缩写名 1)程序及其结构 程序采用子程序的结构形式,子程序有:将输入的二位月份数转换为二进制数的子程序;从字符MAIN CSEG18 表中查找相应的英文缩写的子程序;将月份的英文字母显示在屏幕上的子程序。 程序如下: DATASG THREE MONIN ALFMON MONTAB DATASG CODESG MAINMAIN INPUTSEGMENT PARA ‘DATA’ DB 3 DB 3,4 DUP(?) DB ‘???’,’$’ DB ‘JAN’,’FEB’,’MAR’,’APR’,’MAY’,JUN’ DB ‘JUL’,’AUG’,’SEP’, ’OCT’,’NOV’,’DEC’ ENDS SEGMENT PARA ‘CODE’ ASSUME CS:CODESG,DS:DATASG PROC FAR PUSH DS SUB AX, AX PUSH AX MOV AX, DATASG MOV DS, AX MOV ES, AX CALL INPUT CALL LOCATE CALL DISPLAY RET ENDP PROC PUSH MOV LEA INT MOV MOV XOR CMP JZ SUB ADD POP RET ENDP NEAR ; 键盘输入并将 ASCⅡ码转换二进制数的子程序 DX AH, 0AH ; 键盘输入月份数 DX, MONIN 21H AH, MONIN+2 ; 将月份数字的 ASCⅡ码取入 AH 和 AL AL, MONIN+3 AX, 3030H ; 将 ASCⅡ码转换为 BCD 码 AH, 00 RETURN AH, AH AL, 10 DXRETURN: INPUT:19 LOCATELOCATE: DISPLAYPROC PUSH PUSH PUSH LEA DEC MUL ADD MOV CLD LEA REP POP POP POP RET ENDP PROC PUSH LEA MOV INT POP RET ENDP ENDS ENDNEAR ; 将月份数字转换为英文缩写字母的子程序 SI DI CX SI, MONTAB AL THREE SI, AX CX, 03 DI, ALFMON MOVSB CX DI SINEAR ; DX DX, ALFMON AH, 09 21H DX屏幕显示子程序DISPLAY CODESGMAIN(二)采用 DOS 功能调用设计源程序,并运行调试程序1、十进制加法和结果显示程序(自行设计) 1)程序设计要求 将数据段 DSEG 中的 ADDOP1 定义的双字变量的 4 位十进制数和附加段 ESEG 中的 ADDOP2 定义的双字变量的 4 位十进制数相加,和存放于数据段 DSEG 中的 SUM 中,采用 DOS 显示功能调 用将和显示在屏幕上。 2) 实验步骤: (1)建立源程序文件。 (2)用 MASM 宏汇编程序和 LINK 连接程序生成执行程序。20 (3)运行执行程序,输入不同的加数和被加数,观察结果。 2、十进制加法和算式显示程序(自行设计) 1) 程序设计要求 在以上十进制数加法要求的基础上,将加法算式及和在显示器上显示。 如 ADDOP1 中存放 1234H,在 ADDOP2 中存放 6789H,执行程序后显示器上显示: 23 2) 实验步骤: (1)建立源程序文件。 (2)用 MASM 宏汇编程序和 LINK 连接程序生成执行程序。 (3)运行执行程序,输入不同的加数和被加数,观察结果。 3、键盘输入加数和被加数进行十进制数加法,显示结果程序(自行设计) 1)程序设计要求 采用 DOS 的键盘功能调用和显示功能调用,将键盘输入的 4 位十进制被加数和 4 位加数相加, 和存入有关内存单元,并将算式及和显示在显示器上。 要求采用子程序的设计方法设计程序,例如设计一个从键盘读入输入数据的子程序和将数据显 示的子程序。 2)实验步骤:同上(三)模块化程序设计模块化程序设计是指将一个较大的功能分解成几个独立功能的子模块,每个子模块独立编缉各 自建立一个文件,通过单独的汇编生成各个独立的目标文件,然后由 LINK 程序将各个目标文件 链接在一起,形成一个完整的执行文件。 1)实验程序的设计思想及其实现功能 程序实现键盘输入十进制数,以十六进制数形式在屏幕上显示的功能。程序分成两个模块,模 块 A 为主程序,负责从键盘输入一个十进制数,处理后存入指定内存单元。模块 B 主要实现屏幕提 示和将十六进制数转换及显示的功能。 实验程序参见教科书“微型计算机原理及应用” (吴宁主编)P185 页上 模块化程序设计例 1。 2) 实验步骤: (1) 输入模块 A 程序和模块 B 程序,各产生一个文件。 (2) 汇编两个程序生成两个目标文件。 (3) 用 LINK 文件名 1+文件名 2 命令链接为一个可执行文件。 (4) 运行程序,输入不同的十进制数,观察结果。21 四、思考题:1、在实验(一)题 3 中,如输入 01-12 以外的数时将会出现什么结果? 2、如果输入非法的十进制数时,你所设计的实验(二)题 3 的程序是如何处理的?若无这种功能 请增加提示、出错处理等功能,完善以上程序。 3、实验(三)的程序中是否对输入任何位的十进制数都能在屏幕上显示其十六进制数? 4、在实验(三)的程序中如果以回车键作为对输入数据的确认,程序应作什么修改?五、试验报告要求写出(二)1、2、3 自行设计的采用 DOS 功能调用设计源程序的程序清单。实验四一、 实验目的EL 微机实验教学系统认识实验学习并掌握教学系统的基本操作,为以后的实验打下基础。二、实验设备EL 型微机实验教学系统设备一套、PC 机一台三、实验系统操作步骤简介:(1) 系统的启运: 双击桌面上的 8086 实验系统图标,即可运行。 (2) 使用本系统进行 8086 程序开发的步骤: &一&选择串口、波特率。系统通信连接成功。(下位机的 LED 显示“C-”) &二&建立一个新的文件,进行编辑;或是打开一个已经编辑好的文件。 如果已经编译、链接过,并与下位机处于连机状态,则打开文件时,自动下传程序, 立即可以进行调试。 &三&编译和链接。 如果编译、链接没有错误,系统自动下传程序。 如果编译、链接有错误,将在编辑窗口里红色加亮错误行,并消息窗口里,详细提示22 错误信息。 &四&系统运行。 可进行全速运行、单步调试、跟踪调试、运行到光标处、从光标处运行。 在此过程 中,可以进行程序复位。如果下位机处于全速运行状态时,只能进行系统复位 &五&运行结果。 如果想观察下位机的内存、变量值和寄存器的值。只要点击相应的窗口。如果想修改 下位机的内存的值,可在内存窗口中点击鼠标右键,在弹出设置窗口里,设置内存 地址,然后可点相应的单元进行修改,按 ENTER 即可。 各菜单的详细说明,详见附录二。四、实验操作内容和步骤: 1、 从 0500H 内存单元开始建立 0~15 共 16 个数据。1)程序如下 : code segment assume cs:code org 0100h start: mov di,0500h mov cx,0010h mov ax,0000h sahf mdata: mov byte ptr[di],al inc di inc ax daa loop mdata nop jmp start code ends end start;定义代码段;设数据区首址 ;字节数→CX ;0→AX ;写入一字节 ;修改地址指针 ;修改数据 ;十进制调整 ;未填完转移 ;空操作,设置断点处 ; 结束代码段 ; 汇编结束2)实验步骤:① 双击桌面上的 8086 实验系统图标,启动实验系统 ② 选择串口、波特率。系统通信连接成功。 ③ 建立一个新的文件,原文件前缀.ASM, ④ 编译并链接。 若在“消息窗口”中出现“ 编译、链接完毕!,并在程序“START”处出现绿色加亮行,表 ” 示编译和链接成功。若在“编辑窗口” 中出现红色加亮错误行,则须根据“消息窗口”里提23 示的错误信息,修改原程序。 ⑤ 从内存首址为 0100H 的单元中读出程序的机器码。 ⑥ 运行程序。 运行前,先在内存窗口中点击鼠标右键,在弹出设置窗口里,设置观察内存地址“0500H” ; 另在程序“NOP”处设置断点(F10) ,即在程序“NOP”处褐色加亮行, 然后运行程序。 ⑦ 观察运行结果。 从内存首址为 0500H 的单元中读出 0~15 共 16 个数据。2、简单 I/O 扩展实验1)实验原理 分别用三态缓冲器 74LS244、锁存器 74LS273 作并行输入/输出接口。 硬件如图所示2) 实验步骤① 连线:将 74LS244(IC25)的输入 SI0~SI7 分别与逻辑电平开关电路的 K1~K8 相连,将 I/O 地址片选信号 CS0 与 74LS244 的片选信号 (CSU10)相连。将 74LS273 (IC24)的输出 SO0~SO7 分别与发光二极管电路的 KL~L8 相连,将 I/O 地址片选24 信号 CS1与 74LS273的片选信号(CSU8)相连。 ② 编辑程序,单步运行,调试程序。 ③ 调试通过后,全速运行,观察实验结果。 3)实验说明 用逻辑电平开关电路作为 74LS244(IC25)的输入,用发光二极管作为 74LS273(IC24) 的输出,编写程序,使得逻辑电平开关的状态从发光二极管上显示出来。逻辑电平开关拨上时 为 5V,拨下时为 0V。发光二极管输入“1”为亮, “0”为灭。从 74LS244 读入的数据应求反后 从输出口输出。 在 8086CPU 中有 4 个 16 位通用数字寄存器,其中仅 AX(AL,AH)有输入输出功能,本实 验通过输入语句(IN) ,将开关量输入存到 AL 中,再通过输出语句(OUT) ,将 AL 值输出到发 光二极管,从而实现开关控制发光二极管。 4)实验程序:assume cs:code code segment public org 100h start: mov dx,04a0h in al,dx mov dx,04b0h out dx,al jmp start code ends end start 3、将习题中设计的程序进行运行和调试。实验五一、 实验目的1、掌握 8259 中断控制器的工作原理。 2、掌握编写中断服务程序的方法。 3、掌握初始化中断矢量的方法。8259 中断控制器实验二、 实验设备25 EL 型微机实验教学系统设备一套、PC 机一台.三、 实验原理图四、 实验内容和步骤1、 用单脉冲发生器的输出脉冲为中断源,按一次 PUL 键,产生一次中断请求,执 行中断服务程序,将 AX 寄存器的值改写为 0055H。(1)程序如下: 1 assume cs:code code segment public org 100h start: mov dx,3f0h mov ax,13h out dx,ax mov dx,3f2h mov ax,80h out dx,ax 10 mov ax,01 out dx,ax mov ax,0h out dx,ax mov ax,0 mov ds,ax mov si,200h mov ax,offset hint mov ds:[si],ax add si,2 mov ds:[si],0100h;ICW2 set int type 80ICW4 ;init 8259 ; set int enable;int enter 0+200h2026 mov ax,0 sti waiting: cmp ax,55h jne waiting 26 nop jmp start hint: mov ax,55h nop cli iret code ends end start ;中断服务程序(2)程序框图(3)实验步骤27 ①将 DMA/8259 中断控制实验板插入实验箱的右上角“DMA 插槽”中;单脉冲发生器(PULSE 键 处)输出口(P0)与 DMA/8259 中断控制实验板的 IR0 相连;8259 的片选 C59 与 CS7 相连。 ② 输入程序并以文件名为 8259ZD1.asm 存盘。 ③ 断点设置于第 26 句指令处。 ④ 运行前寄存器窗口中 AX 的值。 ⑤ 运行程序,按下 PULSE 键后再观察 AX 的值。 ⑥ 从内存中读出并记下第 20 条至 31 条指令的机器码。(4)思考题 ① 中断服务程序中mov ax, 20h 的作用是什么? mov dx, 3f0h out dx, ax 如果没有这三条指令将会出现什么结果? ② 程序中的中断类型码为多少?如类型码要求设置为 28,请修改程序并运行。 ③ 若 8259A 的 ICW2 已设置为 80H, 而单脉冲发生器 (PULSE 键处) 输出口 (P0) DMA/8259 与 中断控制实验板的 IR7 相连,请修改程序并运行。2、 用单脉冲发生器的输出脉冲为中断源,每按一次 PULSE 键,产生一次中断请求, 将 AX 寄存器的值从 0055H 开始逐次增 1。在实验 1 程序的基础上修改,实现该功能。五、 试验报告要求1、对所有程序(包括自行设计的)写上较详细的注释。 2.根据思考题写出修改程序的段落。实验六8255 并行口实验一、实验目的学习并掌握 8255A 的工作方式及其应用。二、实验设备1、EL 型微机教学实验箱一个; 2、PC 机一台;28 3、74LS48、共阴极七段数码块实验板一个。三、实验内容和步骤1、 8255A 接口实验(1) (单口方式 0 输出) 按实验原理图,编写程序,使 8255A 端口工作在方式 0,并作为输出口,将其 PA0~PA3 通过 74LS48 BCD 码七段显示驱动器,在共阴极七段数码块上循环显示“0~9”十个数。 (1)实验原理图(2)程序如下:地址(H) 机器码(H) 助记符 注释1 2
3 6 7 8 010A 9 010D 10 2 12 4 14
0119BA 04A6 B8 0082 EF BA 04A0 B8 0A 74 F8 EF 40 E8 0002 EB F4 50assume cs:code code segment public org 100h start: mov dx,04a6h mov ax,82h out dx,ax mov dx,04a0h st1: mov ax,00h st2: cmp ax,0ah jz st1 out dx,ax inc ax call ys jmp st2 ys: push ax;8255 控制寄存器端口地址 ;8255 工作方式控制字 ;8255A 口地址;写数码块上“0~9”十个数。 ;延时29 17 18 19 20 21 22 23 24 26011A 011D 23 27B9 B8 48 75 E2 58 C3 FD F8ys1:codemov cx,0100h mov ax,0200h ys2:dec ax jnz ys2 loop ys1 pop ax RET ends end start(3)实验步骤: ①按图接线,将 8255APA 口的 PA0~PA3 和数码块上的 A~D 相连;8255A 片选信号(CS8255) 和 CS0 相连;数码块上的 VCC(红导线)与实验箱上的 5V 相连(面包板左上方) ,数码块上 的数码块上的 GND(褐导线)与实验箱上的 GND 相连(5V 旁) 。 ②输入源程序并汇编和链接。 ③运行程序,观察 LED 显示器上显示的数字。 2、 8255A 接口实验(2) (双口方式 0 输入输出) 拨动开关,观察发光二极管的变化。当开关某位拨上时,对应的发光二极管点亮,拨下时熄灭。 (1)实验程序: assume cs:code code segment public org 100h org 100h start: mov dx,04a6h start: mov dx,04a6h mov ax,82h out dx,ax start1: mov dx,04a2h in ax,dx mov dx,04a0h out dx,ax jmp start1 code ends end start;8255 控制寄存器端口地址 ;8255 控制寄存器端口地址 ;设置双口方式 0,A 口输出,B 口输入 ;B 口地址 ;读开关状态 ;A 口地址 ;写发光二极管状态(2)实验步骤 ①连线:8255A 的 PB0~PB7 分别与逻辑电平开关电路的 K1~K8 相连;PA0~PA7 分别与发光二极 管电路的 L1~L8 相连;8255A 的片选信号(CS8255)与 CS0 相连。30 ②编辑程序,单步运行,调试程序。 ③调试通过后,全速运行,观察实验结果。 3、 8255A 接口实验(3) (方式 1 输入和方式 0 输出) 编写程序,使 8255 端口 A 工作在方式 0 并作为输出口,端口 B 工作在方式 1 并作为输入口, 则端口 C 的 PC2 成为选通信号输入端 STBB,PC2 成为中断请求信号输出端 INTRB。 当 B 口数据就绪后,通过发 STBB 信号来请求 CPU 读取端口 B 数据,并送 A 端口输出显示。 (1)实验程序 code segment assume cs:code org 0100h start: mov dx,04a6h start: mov dx,04a6h mov ax ,86h out dx,ax mov ax,05h out dx,ax mov dx,3f0h mov ax,13h out dx,ax mov dx,3f2h mov ax,80h out dx,ax mov ax,01 out dx,ax mov ax,0h out dx,ax mov ax,0 mov ds,ax mov si,200h mov ax,offset hint mov ds:[si],ax add si,2 mov ds:[si],0100h mov ax,0 waiting : sti jmp waiting nop jmp start;8255 控制端口地址 ;8255 控制端口地址 ;设置 8255 工作方式控制字 ;置 C 口 ;设置 8259 ;ICW1;ICW2 ;ICW4 ;OCW1 ;设置中断矢量表31 ;中断服务程序 hint: mov dx,04a2h in ax,dx mov dx,04a0h out dx,ax NOP mov ax, 20h mov dx, 3f0h out dx, ax iret code ends end start;8255 B 口地址 ;读开关状态 ;8255 A 口地址 ;写发光而极管状态 ;写 EOI 命令于 8259 OCW2(2)实验步骤 ① 连线:PA 口和 PB 口的连线同 8255A 接口实验(2) ;PC2 与单脉冲发生器的输出口(P1)相 连; PC0 与 DMA/8259 中断控制实验板上的 IR0 相连; 8259 的片选 C59 与 CS7 相连。 8255A 的 CS8255 和 CS0 相连。 ② 编辑和调试程序。 ③ 全速运行程序,拨动开关组K1~K8(发光二极管组不变化) ,按一下 PULSE 键后,观察 发光二极管组,应与开关组信号对应。实验七一、 实验目的8253 定时器/计数器接口实验掌握 8253 定时器/计数器的工作方式及其编程原理。二、实验设备4、EL 型微机教学实验箱一个; 5、PC 机一台。三、实验内容和步骤1、 8253 定时器/计数器应用实验(8253 作定时器) 用 8253 定时器中断,使发光二极管循环点亮。 (1) 实验原理图32 (2) 实验说明 8253 的时钟端 CLK0、CLK1 的频率均为 1M/8。CLK2 的时钟由 OUT0 来控制。本实验中, 8253 采用工作模式 3 为方波方式。CLK0 的频率为 1M/8,设计数器 0 的初值为 0F42H(十 进制为 62500) 时, 方波周期约为 0.5s。 在计数器 2 中设置不同的初值 n, 可得 n *0.5 s 的 时间周期。 利用计数器 2 定时产生中断(IR0) ,在中断服务程序中通过 74LS273 循环点 亮发光二极管。 (3) 实验程序 assume cs:code code segment public org 100h start: mov dx,04a6h mov ax,36h out dx,ax mov dx,04a0h mov ax,24h out dx,ax mov ax,0f4h out dx,ax mov dx,04a6h mov ax,0b6h out dx,ax mov dx,04a4h mov ax,04h out dx,ax out dx,ax mov ax,0;8253 控制端口地址 (CS0) ;设置计数器 0 工作方式 ;计数器 0 地址 ;设置计数器 0 的初值 0F424H;设置计数器 2 工作方式;计数器 2 地址 ;设置计数器 2 的初值 04H33 out dx,ax mov dx,3f0h mov ax,13h out dx,ax mov dx,3f2h mov ax,80h out dx,ax mov ax,01 out dx,ax mov ax,0h out dx,ax mov ax,0 mov ds,ax mov si,200h mov ax,offset light mov ds:[si],ax add si,2 mov ds:[si],0100h mov ax,0 mov bl, 01h waiting: sti nop jmp waiting ;中断服务程序 light: mov dx,04b0h mov al,bl out dx,al rol bl,1 cmp bl,00h jne next mov bl,01h next: mov ax,20h mov dx,3f0h out dx,ax iret code ends end start;8259 端口地址 (CS7) ;ICW1;ICW2 ;ICW4 ; OCW1;中断服务程序的偏移量-→200H;中断服务程序的段地址-→202H ;点亮第一个发光二极管 ;开中 ;等待中断;73LS273 地址 ;写发光二极管状态 ;移一位;OCW2 中断结束方式(4) 实验步骤 ① 连线:8253 的片选信号(CS8253)与 CS0 相连;34 8253 的 OUT0 与 CLK2 相连; 8253 的 OUT2 与 8259 实验板上的 IR0 相连; 8259 的片选信号(CS8259)与 CS7 相连; 74LS273 的片选信号(CSU8)与 CS1 相连; 74LS273 的输出 SO0~SO7 分别与发光二极管电路的 L1~L8 相连。 ②编辑并调试程序。 ③全速运行程序,观察发光二极管状态。 ④修改计数器 2 的初值,再运行程序,观察发光二极管循环点亮的快慢速度。 2、 8253 定时器/计数器应用实验(8253 作计数器) 用 8253 定时器/计数器中断方式 2, 用单脉冲发生器的输出脉冲为外部中断源, 每按若干次 , () 产生一次中断,执行中断服务程序,将 BX 寄存器的值从 0 开始逐次增 1。 (1)实验程序 assume cs:code code segment public org 100h start: mov dx,04a6h mov ax,0b4h out dx,ax mov dx,04a4h mov aL,05h out dx,aL mov ax,0 out dx,ax mov dx,3f0h mov ax,13h out dx,ax mov dx,3f2h mov ax,80h out dx,ax mov ax,01 out dx,ax mov ax,0h out dx,ax mov ax,0 mov ds,ax mov si,200h mov ax,offset hint mov ds:[si],ax add si,2;8253 控制端口地址 (CS0) ;计数器 2 工作方式 2 ;计数器 2 地址 ;设计数器 2 初值;8259 地址 (CS7) ;ICW1;ICW2 ;ICW4 ; OCW135 mov ds:[si],0100h mov bx,0 waiting: sti nop jmp waiting hint: add bx,0001h mov ax, 20h mov dx, 3f0h out dx, ax nop iret code ends end start (2)实验内容及步骤;设 BX 寄存器的初值 ;开中 ;等待中断 ;中断服务程序:BX+1→BX ;OCW2;中断返回①连线:单脉冲发生器的输出口(P1)与 8253 的 CLK2 相连; 8253 的 OUT2 与 8259 的 IR0 相连; 8253 的 CS8253(片选)与 CS0 相连; 8259 的 C59(片选)与 CS7 相连。 ②编辑并调试程序 运行程序前,先将光标设在等待中断的“NOP”处,按 F6 键,程序运行到光标处(绿色 光标行) ;再将光标设在中断服务程序中的“NOP”处,按 F6 键,程序仍在等待中断的“NOP”处, 只有当按下 PULSE 键 4 次后,程序才运行到中断服务程序中的“NOP”处(绿色光标行) ,并将 BX 寄存器的值增 1。附录一DEBUG 命令及其操作DEBUG 是为汇编语言设计的一种调试工具,它通过单步、设置断点等方式为汇编语言程序员提 供了非常有效的调试手段。 6.1 DEBUG 程序的调用在 DOS 的提示符下,可键入命令: C&DEBUG[d: ][path]filename[.exe][parm1][parm2] 其中,文件名是被调试文件的名字。如用户键入文件名,则 DUBUG 将指定的文件装入存储器中,用 户可对其经行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用 DUBUG 命令 N 和 L 把需要的文件装入存储器后再经行调试。 命令中的 d 指定驱动器, path 为路径, parm1 和 parm236 则为运行被调试文件时所需要的命令参数。 在 DUBUG 程序调入后,将出现提示符,此时就可用 DUBUG 命令来调试程序。 6.2 DUBUG 的主要命令 1)显示存储单元的命令 D(DUMP) ,格式为: -D[address]或 -D[range] 例如,按指定范围显示存储单元内容的方法为: ―d100 120 18E4: 04 02 38 01 C7 06―06 02 00 02 C7 06 08 02 G?8.G??G? 18E4: BB 04 02 E8 02 00―CD 20 50 51 56 57 8B 67 ?;?h?MPQVW. 7 18E4:0120 8B 其中 0100 至 0120 是 DUBUG 显示的单元内容。左边用十六进制表示每个字节,右边用 ASCII 字符表 示每个, 。表示不可显示的字符。这里没有指定段地址,D 命令自动显示 DS 段的内容。如果只指定 首地址,则显示从首地址开始的 80 个字节的内容。如果完全没有指定地址,则显示上一个 D 命令显 示的最后一个单元后的内容。 2)修改存储单元内容的命令有两种。 .输入命令 E(Enter) ,有两种格式如下: 第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为: ―E address [List] 例如,―E DS :100 F3’XYZ’8D 其中 F3,’X’,’Y’,’Z’和 8D 各占一个字节,该命令可以用这五个字节来替代存储单元 DS:0100 到 0104 的原先的内容。 第二种格式则是采用逐个单元相继修改的方法。命令格式为: ―E address 例如,―e cs :100 则可能显示为: 18E4:0100 89.― 如果需要把该单元的内容修改为 78,则用户可以直接键入 78,在按“空格”键可接着显示下一个单 元的内容,如下: 18E4: 1B 这样,用户可以不断修改相继单元的内容,直到用 Enter 键结束该命令为止。 3)检查和修改寄存器内容的命令 R(Register) ,它有三种格式如下: .显示 CPU 内所有寄存器内容和标志位状态,其格式为: ―R 例如, ―r AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=01OO NV UP DI PL NZ NA PO NC37 18E4:3801 MOV WORD PTR [ DS: 其中标志位状态的含义可见第二章表 2.1。 .显示和修改某个寄存器内容,其格式为: ―R register name 例如,键入 ―r ax 系统将响应如下: AX FIF4 : 即 AX 寄存器的当前内容为 FIF4,如不修改则按 Enter 键,否则,可键入欲修改的内容,如: ―r bx BX 0369 : 059F 则把 BX 寄存器的内容修改为 059F。 4)运行命令 G ,其格式为―G[=address1][address2[address3?]。 其中,地址 1 指定了运行的起始地址,如不指定则从当前的 CS:IP 开始运行。反面的地址均为断点 地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执 行的指令。 5)跟踪命令 T(Trace) ,有两种格式; .逐条指令跟踪 ―T[=address] 从指定地址执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址则从当前的 CS:IP 开始执行。 .多条指令跟踪 -T[=address][value] 从指定地址起执行 n 条指令后停下来,n 有 value 指定。 6)汇编命令 A(Assemble),其格式为: ―A[address] 该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储 区中。必须注意:DUBUG 把键入的数字均看成十六进制数,所以如要键入十六进制数,则起后应加 以说明,如 100D。 7)反汇编命令 U(Unassemble) ,有两种格式。 .从指定地址开始,反汇编 32 个字节,其格式为: ―U[address] 例如: -u100 18E4:23801 MOV WORD PTR [ 18E4:20002 MOV WORD PTR [ 18E4:010C C MOV WORD PTR [38 .对指定范围内的存储单位经行反汇编,格式为: ―U[range] 例如: -u100 10c 18E4:23801 MOV WORD PTR [ 18E4:20002 MOV WORD PTR [ 18E4:010C C MOV WORD PTR [ 8)命名命令 N(Name) ,其格式为: ―N filespece[filespeces] 命令把两个文件标识符格式化在 CS:5CH 和 CS:6CH 的两个文件控制块中,以便在其后用 L 或 W 命令 把文件装入或存盘。Filespecs 的格式可以是: [d: ][path] filename[.ext] 例如, ―N myprog ―L ― 可把文件 myrong 装入存储器。 9)装入命令 L(Load) ,有两种功能。 。把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中。其格式为: L [address[drive sector sector] .装入指定文件,其格式为: ―L[address] 此命令装入已在 CS:5CH 中格式化了控制块所指定的文件中。如未指定地址,则装入 CS:0100 开始的 存储区中。 10)写命令 W(Write) ,有两种功能。 .把数据写入磁盘的指定扇区。其格式为: ―W address drive sector sector .把数据写入指定的文件中。其格式为: ―W [address] 此命令把指定的存储区中的数据写入由 CS:5CH 处的文件控制块所指定的文件中。如未指定地址则 数据从 CS:0100 开始。要写入文件的字节数应先放入 BX 和 CX 中。 11)退出 DEBUG 命令 Q(Quit) ,其格式为: ―Q 它退出 DEBUG,返回 DOS.本命令并无存盘功能,如需存盘应先使用 W 命令。附录二 EL 微机实验教学系统软件的安装与操作一、 概述39 8086 实验系统集成了编辑、编译、调试开环境,全中文友好界面,并具有准确提示代码语法错 误,极大的方便了程序的修改及调试。 二、 软件的运行环境及安装:1. 运行环境要求: 中文 Window98 操作系统,分辨率 800x600。 2、软件的组成: &―&主体程序。 tech.exe &二&编译模块,链接模块。 tasm.exe tlink.exe 3、系统的安装: 运行安装盘上的 Setup.exe 安装程序, 在安装过程中, 选择你的安装目录, 在要求输入 Serial Number 时,输入任意字符即可继续,直到安装完成。 4、系统的启动: 双击桌面上的 8086 实验系统图标,或是从开始菜单里,单击 8086 实验系统图标,即可运行。 5、系统运行结果: 运行 8086 实验系统,启动编译、链接菜单后,如果编译、链接没有错误,将生成几个以下后缀的文 件: 源文件前缀.obj 编译后生成的目标文件。 源文件前缀.lst 机器代码与源文件对照列表文件。 源文件前缀.com 链接后生成的二进制文件。 源文件前缀.sym 表符文件。 三、 软件使用提要。1、 使用本系统进行 8086 程序开发的步骤。 &一&启动本系统,并选择串口、波特率,如果没有设置好,只能进行编辑、编译、链接,但无法进 行调试。 &二&进入本系统后,首先建立一个新的文件,或是打开一个已经编辑好的文件,如果已经编译、链 接过,并与下位机处于连机状态,则打开文件时,自动下传程序,立即可以进行调试。 &三&如果进行编译后,需要进行编译、链接,如果没有错误,系统自动下传程序即可进行,全速运 行、单步调试、跟踪调试、运行到光标处、从光标处运行,在此过程中可以进行程序复位。如果下 位机处于全速运行状态时,只能进行系统复位。 &四&在编译、链接有错误,将在编译窗口里红色加亮错误行,并消息窗口里,详细提示错误信息。40 &五&如果想观察下位机的内存、变量值和寄存器的值。只要在相应的窗口,点击右在弹出菜单里, 选择相应的操作。 &六&如果下位机处于非素运行状态时,可修改下位机的寄存器的值和内存。 2、 软件快捷键介绍: (1) 、编译&ALT+C& (2) 、链接&ALT+L& (3) 、编译并链接&ALT+P& (4) 、全速运行&F5& (5)、运行到光标处&F6& (6) 、从光标处运行&F7& (7) 、单步运行&F8& (8)、跟踪调试&F9& (9) 、设置清除断点&F10& 四、 软件的详细操作说明。1、通用的操作说明。 A、波特率设置:运行 8086 实验系统,进入主界面,即弹出串行口可选 COM1 或 COM2,波特率可选
波特。 B、若要修改寄存器的值,只要在寄存器窗口,用鼠标在相应的地方点击。输入值,按 ENTER 即可。 C、若要下位机的内存值,现在内存窗口,按鼠标在右键,出现的菜单时,选择,设置观察内存地址。 然后在内存窗口中修改相应的地址值,按 ENTER 即可。如果大量修改时,可用方向键来回修改,但 是最后按 ENTER 即可。 D、若要察看变量值,可在观察变量窗口,按鼠标右键,在出现的菜单,选择相应的操作。 2、各菜单的详细说明。 [1]、文件[ALT+F]。 &1&、新建文件[ALT+N],只要输入新建的文件名,就可进入编辑状态。 &2&、打开文件[ALT+O]打开文件 在弹出的对话框里,只要选择要打开的文件名,点击&打开&按钮,即可进入编辑状态。如果对 应的*.com,*.sym 文件存在,并且处于正常的通讯状态下,软件自动,载入*.sym,并下传对应*.com 下位机,并且自动复位程序。 &3&、保存[ctrl+s] 保存当前编辑的文件。 &4&、另存为 可以将当前编辑的文件另为别的提高扩展名的文件。 &5&、打印[ctrl+p] 可以直接当前编辑的文件。 &6&、打印预览41 可以对当前编辑的文件进行打印预览,观效果后再进行打印。 &7&、打印设置 设置打印参数,如打印份数等。 &8&、退出[ALT+X] 关闭程序。 [2]编辑[E] &1&、撤销[CTRL+Z] 退回上一步的操作。 &2&、剪切[CTRL+X] 剪切选择的字符串。 &3&、复制[CTRL+C] 复制选择的字符串。 &4&、粘贴[CTRL+V] 粘贴当前粘贴板中的字符串到当前位置。 [3][运行] &1&、连接设置。 如果运行程序时,没有设置端口,可以点击此菜单,进行端口设置。包括端口 COM1 或 COM2, 波特率可选
波特。 &2&、程序复位。 选择此项,使用户的被调试程序复位,即程序指针指向初始值。即 IP=100H,CS=0x100H. &3&、系统复位。 开发系统硬件复位。执行此菜单项,当出现请求复位信息后,用户必须按试验箱上的 RST 复位 键,复位开发系统,系统才能正常操作。此项操作一般在系统出现通讯错误后,使系统复位继续进 行正常工作,执行此菜单,将出现复位提示,这时按一下复位键 RST,即可恢复系统正常工作。 &4&、运行程序[F5]。 &5&、运行到光标处[F6]。 运行到光标行,过程中将忽略程序中的所有断点。如果光行执行不到,程序失去控制。 <6>从光标处运行[F7] 。 可从光标行运行,过程中遇到断电后,返回监控。无端点时,程序将失控制。此项菜单执行 将忽略光标行之前的程序行。 <7>单步运行[F8] 单步执行程序,不跟踪子程序。 <8>跟踪运行[F9] 跟踪执行程序,跟踪子程序。 <9>设置或清除断点[F10] 在光标行设置断点,当光标行不是可执行指令时,系统将不显示黄色的端点行。当前光标行 已设置断点时,将清除此端点。 <10>清除所有断点 清除所有已设置的断点。42 [4]编译 <1>编译[ALT+C] 编译当前文件,如果有错误发生,则在相应的代码行,显示红色的错误警告行。如果是格式 不对,则在消息框里提示。 <2>链接[ALT+L] 链接当前文件,生成可执行文件和调试符号文件,并自动载入。 <3>编译并链接[ALT+P] 此操作等效于前面两项的操作。 [5]窗口 <1>工具栏 显示或隐藏工具栏。 <2>状态栏 显示或隐藏状态栏 <3>内存窗口 显示内存窗口 <4>寄存器窗口 显示寄存器窗口 <5>观察变量窗口 显示观察变量窗口 <6>消息窗口 显示消息窗口 <7>波形窗口 显示波形窗口。 (必须先设置端点) 。其中窗口,可以在AX,BX,CX中选择存放数据 的寄存器,或在内存范围内,填写入存放数据的地址。在波形中,可以用游标来度量其中的任一点 的值。可以按下右键进行缩放,向上拖为放大,向下拖为缩小。此外,还可以打印波形。 [6]帮助附录 3EL 实验系统通用接口板介绍1 输出显示电路 1) 数码显示电路 该电路由 6 位共阴极数码管,3 片 75452,2 片 74SL07 组成,74SL07 为段驱动器,相应输入插孔为 CZ4,75452 为位驱动器,相应输入插孔为 CZ3 (LD1,LD2,LD3,LD4,LD5,LD6) 2) LED 灯显示电路 该 电 路 由 2 片 74LS04,12 支 绿 色 二 极 管 组 成 .12 只 红 , 黄 , 绿 色 二 极 管 相 应 的 输 入 插 孔 为43 CZ2(LI1,LI2,LI3,LI4,LI5,LI6,LI7,LI8,LI9 ,LI10,LI11,LI12). 2 信号发生电路 1) 开关量输入电路 该电路由 8 支开关组成,每只开关有两个位置,一个位置代表高电平,一个位置代表低电.该电路 得输出插孔为 CZ1(K1,K2,K3,K4,K5,K6,K7,K8). 2) 时钟输入电路: 该电路由 1 片 74SL161 组成: 当 CPU 为 PC 总线时,输入时钟为 AT 总线的 CLK, 当 CPU 为 C198/C196 时,CLK 的输入时钟为晶振频率。 当 CPU 为 8086 时,CLK 是 2MZ 输出时钟为该 CLK 的 2 分频(CLK0) 分频(CLK1) 分频(CLK2) ,4 ,8 ,16 分频(CLK3) ,相应输 出插孔 CZ47(CLK0,CLK1,CLK2,CLK3) 3) 单脉冲发生器电路 该单脉冲发生器由一个按钮,1 片 74SL04,74SL132 组成,具有消颤动能,正反相脉冲,相应输 出插孔 CZ35(P0,P1) 。 4)模拟量输入电路 该电路由 3 只可变电位器组成,输出为 0----5V 连续可调。相应的输出插孔 CZ29,CZ28,CZ27 (KB1,KB2,KB3) 。 5)键盘输入电路 该电路由 28 支通用键 1 只SHFT键,1只CTRL键组成,28只通用键采用8根列扫线, 4根行扫线,无外部信号输入时,匀为高电平,有外部信号输入时,电平状态由外部输入信号 决定,作键盘实验时,一般行、列扫线分别定义为输入、输出,即8根列扫线的插孔为CZ6 (KA0,KA1,KA2,KA3,KA4,KA5,KA6,KA7) ,4根行扫线的插孔 为CZ5(KB0,KB1,KB2,KB3) 。 6)复位电路 按动复位键,将对8255,8279,8250复位,对8051,80C198,808 6CPU板起复位作用。 3可编程定时器8253电路 该电路由1片8253组成,8253的片选输入端插孔CS8253、数据口,地址,读写 线均已接好,T0,T1时钟输入为CLK3,T2的时钟用户可自己接。定时器输出,GA TE控制孔对应如下:OUT0,GATE1,OUT1,GATE1,OUT2,GATE 2,CLK2。 注:GATE信号无输入时为高电平。EL-1型T2的时钟为CLK3。 4 可编程并行口8255电路: 该电路由1片8255组成,8255的数据口,地址,读写线,复位控制线均已接好,片选 输入端插孔为CS8255,A,B,C三端口的插孔分别为 A:CZ16(PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7) B:CZ15(PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7) C:CZ17(PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7) 5可编程键盘显示控制器 该电路由1片8279,74LS138组成,8279的数据口,地址,读写线,复位,时44 钟,片选都已经接好,显示输出 ,键盘行列扫描线均有插孔输出。 两组显示输出的插孔号与芯片标号一致。键盘行扫描线译码线插孔标号为CZ21,CZ25 (完全相同)相应标号为(KS0,KS1,KS2,KS3,KS4,KS5,KS6,K S7) 另外该电路在进行实验还要用到一组反相器,该反相器是输入插孔标号CZ24(S0, S1,S2,S3,S4,S5) 。输出插孔标号CZ23(S0、S1、S3、S4、S5) 6可编程串行口8250电路 该电路由一片1488,1489组成 ,该电路中8250的输入线均已接好,窜行口 输入输出插座为J1,T为发送,R为接收。 7简单数字量输出缓存实验电路 该电路由两片74LS273及一片74LS04,74LS02组成,该电路中74L S273的输入均已接好数据线,所存端片选入控制,两片74LS273的片选输入插孔标 号分别为CSU8,CSU9,输出插孔标号分别为(SO1,SO2,SO3,SO4,S O5,SO6,SO7,SO8,SO9,SO10,SO11,SO12,SO13,SO 14,SO15) 8简单数字量输入缓冲实验电路 该电路由一片74LS244,一片74LS02构成,该电路中,74LS244的输 入均已接在数据总线上,输入端接着插线孔,其标号CZ9(SI0,SI1,SI2,SI 3,SI4,SI5,SI6,SI7) ,片选控制端插孔标号(CSU10) 。 9八路八位A/D实验电路 该电路由一片ADC0809,一片74LS02组成,该电路中,ADC00809的 参考电压,数据总线输出,通道控制线均已接好,其它信号线由插孔接入,ADC0809的 片选控制插孔标号为CZ31(CS0809) ,转换结束标志输出插孔标号为CZ26(EO C) ,模拟量输入通道孔标号为(IN0,IN1,IN2,IN3,IN4,IN5,IN6, IN7) 10八位双缓冲D/A实验电路0832 该电路由一片DAC0832。一片74LS00,一片LM324组成,该电路中除D AC0832的片选未接好外,其它信号均已接好 ,片选插孔标号CZ32(CS0832) 。 输出插孔标号CZ33(VOUT) 。该电路为非偏移二进制DA转换电路,通过调节KB4 , 可调节DA转换器的满偏值,调节KB5,可调节DA转换器的零偏值。 11存储器扩展实验电路: 该电路由一片 62256 和一片 6264 组成,该电路的所有信号线均已接好,可直接进行存储器读 写实验.对 8051 和 8098 实验来说,62256 的起始地址为: 4000H,长度为 32K,6264 系统已使 用.8051 和 8098 的数据与存储区都为统一编址 64K,其中 0----16K 为系统使用,后 48K 用户作为 仿真或实验用. 8086CPU 系统资源说明 1 系统监控 6264 仿真高八位 0―O3FFF 寄地址: DMA 传送奇地址 0---3FFFH 实验程序用 RAM 6264 仿真低八位 0―03FFF 偶地址:DMA 传送偶地址 0---3FFFH 实验程序用 RAM 2764 监控高八位 FFFF---FC000 奇地址有效 2764 监控低八位 FFFFF―FC000 偶地址有效45 CS0 04A0---04AF 偶地址有效 实验程序 I/O 口地址 CS1 04B0―04BF 偶地址有效 实验程序 I/O 口地址 CS2 04C0―04CF 偶地址有效 实验程序 I/O 口地址 CS3 04D0―04DF 偶地址有效 实验程序 I/O 口地址 CS4 04E0―04EF 偶地址有效 实验程序 I/O 口地址 CS5 04F0―04FF 偶地址有效 实验程序 I/O 口地址 CS6 0000―01FF 偶地址有效 实验程序 I/O 口地址 CS7 0200―03FF 偶地址有效 实验程序 I/O 口地址 CS8F 偶地址有效 实验程序 I/O 口地址 CS9F 偶地址有效 实验程序 I/O 口地址 2 8086CPU 系统的硬件实验 (1)CS0―CS7 的口地址以以上说明为准。I/O 口访问可按字或字节进行,低八位有效。例 如:IN AX,DX; OUT DX,AX;IN AL,DX ;通用实验板的芯片必须都用偶地址、低八 位访问。 (2)硬件部分流程图见以后章节。 (3) 8086CPU的8086实验系统的硬件实验的软件操作手册、 含 键盘监控操作见附录。 (4)上位机监控是进入实验系统子目录后运行DB86。 (5)所有实验程序的起始地址为01100H,CS=0100H,IP=0100H, 代码段、数据段 、堆寨段在同一个64K的地址空间中。 注意:功能实验板上监控芯片(EPROM)的跳线应跳在8098位置。 3 8086CPU板系统的软件实验 (1)软件实验应脱离8086最小系统进行,直接利用PC机,进入实验系统子目录后, 运行IDE86,进入集成环境,具体操作见《微机实验教学系统实验指导书》 ,软件部分程序 流程图见《微机实验教学系统实验指导书》的软件部分,该书的硬件部分为PC总线的扩展实 验,与含8086CPU实验系统不副,请注意。附录四键盘和显示的DOS功能调用返回参数 AH=字符 AL=字符 (如果准备好) AL=0 (未准备好) AL=字符 AL=字符 DS:DX=缓冲区首址表9.5 DOS键盘操作(INT21H) AH 功能 调用参数 1从键盘输入一个字符并回显在屏幕上 6读键盘字符 DL=0FFH7从键盘输入一个字符,不回显 8从键盘输入一个字符,不回显 检测CtrLBreak A输入字符到缓冲区46 B 读键盘状态C 清除键盘缓冲区,并调用一种键盘功能 9.1.3.1 单字符输入 DOS21H 中断的功能 1,7,和 8 都能从键盘读一字符送入 AL 寄存器。功能 1 能把字符显示出 来并检验是否按下了 CtrlBreak 键,就自动调用中断 23H 并结束程序。21H 的功能 7 不能回打字符 或检验 CtrlBreak。21H 的功能 8 检验 Ctrlbreak,但是不回显 。 在交互程序中常常需要用户对一个提示做出应答,或通过输入一个字母或数字对菜单的各项进 行选择,这时就要用到 21H 的单字符输入功能。例如程序显示出一蹿信息,要求你回答 Y 或 N,回 答 Y,程序将转入标号为 Yes 的程序段,而 N 使程序转入标号为 NO 的程序段,按下其他键程序就等 待。这样的工作由下面的程序段来完成 GET-KEY: MOV AH,1 Read a key with echo INT 21H CMP AL,Y Is it Y? JE YES If so,jump to Yes CMP AL,N Is it N ? JE NO If so,jump to NO JNE GET-KEY otherwise,wait for Y or N 测试 Y,N 或其他字母,数字和符号可直接把他们写在 CMP 指令中,用引号括起来。但是如果想 检测 Enter(Return)键,就要在指令中写出它的 ASC11 码 0D(16 进制)或 13(十进制) 。例如, 要求程序在按下 Return 键后才继续运行,用下面的指令: WAIT HERE; MOV AH 7 WAIT FOR ENTER INT 21 H CMP AL , 0DH JNE WAIT―HERE 这里用 AH=7 代替 AH=1,差别只是不把按下的键显示出来,或不执行键的特定功能。 如果要求程序能接受功能或数字组合键必须进行两次DOS调用,第一次回送00,第二次回送 扫描码。例如,程序显示出一个菜单,要求用户通过键入F1,F2或F3来选择1,2或3 项, 按其它键则产生错误信息序的应答检测部分如下: MOV AH,7 ;Wait for key INT 21H CMP AL,0 ;Is it a function key? JE GET_EC ;yes, read the scan code JMP ERROR ;No, display error message GET_EC: MOV AH,7 INT 21H CMP AL,3BH ;F1? JE OPTION1 CMP AL,3CH ;F2? JE OPTION2 CMP AL,3DH ;F3?AL=0FFH 有键入 AL=00 无键入 AL= 键盘功能号(1,6,8,7 或 A)47 JE OPTION3 JMP ERROR;Invalid key ,error message9.1.3.2 输入字符串 在许多应用程序中,要求用户输入姓名、地址或其它字符串,21H 中断的功能 A 能从键盘读入 一串字符并把它存入用户定义的缓冲区中。缓冲区的第一个字节保存最大字符数,这个最大字符数 由用户程序给出。如果键入的字符数比此数大,那就会发出“嘟嘟”声,而且光标不再向右移动。 第二个字节是实际输入字符的个数,这个数据是由功能 A 填入的,而不是由用户填入。在这两 个字节之后,字符串就按字节存入缓冲区,最后结束字符串的回车符 0DH 还要占用一个字节,因此 整个缓冲区的字节空间应为最大字符数(包括 Return 在内)加 2。 MAXLEN DB 32 ACTLEN DB ? STRING DB 32 DUP(?) 输入字符串的指令如下: LEA DX,MAXLEN ;Make DX point to buffer MOV AH,0AH ;Input the string INT 21H 如果我们键入字符串: By brooks too broad for leapingL 此时缓冲区 MAXLEN 的各存储单元图示如图 9.4。 20 l f B y b r o o k s t o o b r o a d f o r l e a p i n g 0ds s s s s s s s 字符串开始 s s s 实际键入的字符数 s 最大字符数 图 9.4 字符缓冲区 INT 21 的功能 A 把实际字符数(不包括 Return)填入缓冲区的第二个字节,并保持 DS:DX 指 向缓冲区的第一个字节。如果想把实际字符数放入 CX 寄存器,并把指针(DS:DX)指向字符串的第一 个字符,图 9.5 的程序可完成这个工作。 ;Read a strin this procedure read up to 50~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ dseg segment user_string db 50,0,50 dup(?)- - - - - - - - - - - - - - - - - - - - - - - - - - - -48 csegsegment assume cs:cseg,ds:dseg read_keys pro far push ds sub ax,ax push ax mov ax,dseg mov ds,ax lea dx,user_string mov ax,0ah int 21h sub ch,ch mov cl,user_string+1 add dx,2 ret read_ - - - - - - - - - - - - - - - - - - - - - - - - - - - C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ end 图 9.5 输入字符串程序 9.1.3.3 清除键盘缓冲区 从键盘输入的字符实际上先放在一个 16 字节的键盘缓冲区内,功能 1,7,8 和 0AH 实际上是从 键盘缓冲区取得字符。 INT 21H 的功能 0CH 能清除键盘缓冲区,然后执行在 AL 中指定的功能,AL 指定的功能可以是 1, 6,7,8 或 0AH,使用 0CH 可以使程序在输入一个字符之前,将以前键入的字符清除掉。 功能 0CH 的用法如下: MOV AH,0CH MOV AL,08H INT 21H 这几条指令实际提供的输入功能是 8,它不回打,但要检测 Ctrl_Break。如果不想用 Ctr_ INT 10H ;video ROM call MOV AH,8 ;read char and attr MOV BH,0 ;page 0 INT 10H ;video ROM call 9.2.3 DOS 显示功能调用 表 9.7 为 INT 21H 的显示操作,其中有两个是显示单字符的功能,另一个是显示字符串 功能,这些功能都自动向前移动光标。 表 9.7 INT 21H 显示操作49 AH 功能调用参数2 显示一个字符 (检验 Ctrl_Break) 6 显示一个字符 (不检验 Ctrl_Break)DL=字符光标跟随字符移动DL=字符光标跟随字符移动9 显示一个字符DS:DL=串地址串必须以$结束,光标跟随字符移动AH=9 的功能是显示字符串,它要求被显示输出的字符必须以$字符(24h)作为定界符,此功能 是用$作为标记来计算串的长度的。有些 ASXII 码,如控制码,不能出现在该字符串中。显示字符串 时,如果希望光标能自动换行,那么可在字符串结束之前加上回车和换行的 ASCII 码。 MESSAGE DB ‘The sort operation is finished.’,13,10,’$’ 要显示输出的信息一般定义在数据段。输出该字符串的指令为: MOV AH,9 MOV DX,SEG MESSAGE MOV DS,DX MOV DX,OFFSET MESSAGE INT 21H 使用赋值伪操作可以使程序的可读性更好,另外也可以根据显示格式的要求使用 TAB 符,TAB 的 ASCII 码为 09。 CR EQU 13(CR EQU 0DH) LF EQU 10(LF EQU 0AH) TAB EQU 09 MESSAGE DB TAB,’The sort operation is finished’ DB CR,LF,’$’ 使用 INT 21H 显示字符串,一定要在显示串之后加上定界符$丢失定界符可能在屏幕上引起意想 不到的后果。50
更多相关文档

我要回帖

更多关于 卷内文件页码编写位置 的文章

 

随机推荐