1、实验一 系统认知实验实验目的:了解汇编语言的设计、编写和调试程序的方法,掌握 DEBUG 的使用。实验设备:装有 DOS 系统和 MASM5.0 的微机一台,或 TDN86/88 微机原理教学实验系统一台。实验内容:编程实现在屏幕上显示一个大写字母“A”或字符串 “HOW ARE YOU?”,用DEBUG 调试程序实验要求:1、上机前做好充分准备,包括源程序清单、调试步骤等; 2、用 DEBUG 来调试程序,熟悉 DEBUG 的使用。实验步骤:1、编写程序并输入,检查无误后,经汇编、连接后运行,用 DEBUG 装入。2、用 U 命令反汇编程序,应用 R、G 等命令,观看运行情况。3、用 D、E
2、、A 等命令查看、修改源数据,用 G 命令查看运行结果。4、用 Q 命令退出 DEBUG上机过程 1.建立源文件 使用 EDIT 软件,得到扩展名为 ASM 的汇编语言源程序文件。( 扩展名 .asm 勿忘加! ) 2.汇编源程序 使用汇编程序 MASM 对源程序进行汇编,生成OBJ、LST 和 CRF 文件(后两种一般不需要,可直接回车) 。如程序有错,可以根据提示信息,重新编辑、汇编源程序,直到没有严重错误为止。 3.连接程序 使用连接程序 LINK,对汇编程序产生的目标文件进行连接,产生可执行的程序 EXE。 4.调试或运行程序具体过程如下: 1. 编辑 C:MASMEDIT 文件名.A
3、SM 2. 汇编 C: MASM masm 文件名.ASM 3. 连接 C: MASM link 文件名.obj 4. 调试 C: MASM debug 文件名.exe -U 反汇编,记下程序首地址和结束地址 -D 段地址: 偏移地址 察看内存单元内容 -E 段地址 :偏移地址 修改内存单元内容:空格修改下一个 , 回车结束修改 -G=起始地址 结束地址 运行程序参考源程序:(1) 屏幕上显示一个大写字母“A”STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODESTART: MOV AH, 02HMOV DL,4
4、1HINT 21HINT 20HCODE ENDSEND START(2) 屏幕上显示字符串“HOW ARE YOU? ”DATA SEGMENTBUF DB HOW ARE YOU?$DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFMOV AH,09HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START实验二 分支程序设计实验一、实验目的1.掌握分支程序的结构。2.掌握分支程序的设计、调整方法。二、实验设备TDN86/88 教学实验系统
5、一台。三、实验内容及步骤设计一数据块间的搬移程序设计思想:程序要求把内存中一数据区(称为源数据块)传送到另一存储区(成为目的数据块) 。源数据块和目的数据块在存储中可能有三种情况,如图 3-1 所示。图 3-1 源数据块与目的数据块在存储中的位置情况对于两个数据块分离的情况,如图 3-1(a) ,数据的传送从数据块的首地址开始,或从数据块的末地址开始均可。但是对于有重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭到破坏,可有如下结论:当源数据块首地址目的块首地址时,从数据块末地址开始传送数据,如图 3-1(b)所示。当源数据块首地址目的块首地址时,从数据块首地址开始传送数据,如图 3-1
6、(c)所示。参考流程:如图 3-2 所示。图 3-2 程序流程图实验程序STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODESTART: MOV CX, 0010HMOV SI, 3100HMOV DI, 3200HCMP SI, DIJA A2ADD SI, CXADD DI, CXDEC SIDEC DIA1: MOV AL, SIMOV DI, ALDEC SIDEC DIDEC CXJNE A1JMP A3A2: MOV AL, SIMOV DI, ALINC SIINC DIDEC CXJNE A2A3
7、: JMP A3CODE ENDSEND START实验步骤(1)输入程序并检查无误,经汇编、连接后装入系统。(2)用 E 命令在以 SI 为起址的单元中填入 16 个数。(3)G= ,运行实验程序。(4)用 D 命令查看 DI 为起址的单元中的数据是否与 SI 单元中数据相同。(5)试改变 SI、DI 的取值,观察在三种不同的数据块情况下程序的运行。四.思考题为什么当源数据块首址目的块首址时,应从数据块首地址开始传送数据。而当数据块首址= XBX+2Y交换 XBX和 XBX+2的值ADD BX,2C=0MOV CX,DIC=0YYNNN结束断的定义STRING1 DB Y,0DH,0AH,$
8、STRING2 DB N ,0DH,0AH,$ DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV CX,10XOR AX,AXMOV AX,00HMOV BX,0LOOP1: CMP AX,XBXJZ LOOP2INC BXLOOP LOOP1JMP LOOP3LOOP2: MOV DX,OFFSET STRING1MOV AH,09H ;输出相应的字母INT 21H JMP EXITLOOP3: MOV DX,OFFSET STRING2MOV AH,09H ;输出相应的字母INT 21H EX
9、IT: MOV AH,4CHINT 21H CODE ENDS END START三、实验内容1.将编写好的程序 1 输入、汇编、连接并通过 Debug 调试和检查运行结果。无序数组 X:24H,32H,01H,02H,44H,32H,05H,00H,12H,11H排序后的数组从 DS:0000-0010 从大到小排列:2.将编写好的程序 2 输入、汇编、连接并通过 Debug 调试和检查运行结果。测试的数据 00H 保存在 AX 寄存器中:开始段的定义MOV CX,10 MOV AX,00H MOV BX,0AX=XBXYINC BXC=0显示“Y”显示“N”结束NYN四、实验报告要求1.整
10、理出运行正确的源程序清单(加以注释) ,并画出程序流程图。2.如何修改程序 1 对数据由小到大排序。只要把程序中 JGE LOOP3,JGE(=)条件改成 JBS(=)3.说明多重循环程序设计中应该注意的问题。应该注意循环的条件和循环的次数,注意别出现死循环4.上机调试过程中遇到的问题是如何解决的。此次实验较为简单,因为排序算法书上有,只出现一个小问题,就是输入的时候,调用 OIH 中断,只能输入一个字符存在 AX 中。而不能把输入的数字存在 AX 中。只会存储相应 ACLL 码排序程序设计实验(1)写出汇编、连接、及运行程序查看结果的步骤如下:1、程序源代码:data segmentvar1
11、 db 09h,08h,07h,06h,05h,04h,03h,02h,01h,00hvar2 db ?data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov cx,000ah ;指定数据个数及循环次数lea si,var2 ;取数据区 VAR2 的偏移地址l1:dec cxjz aapush si push cxcc: dec si mov al,sidec sicmp al,si ;取相邻的两个数进行比较ja bbxchg al,si mov si+01,albb:inc siloop ccpop c
12、xpop sijmp l1aa:mov ah,4chint 21hcode endsend start2、汇编3、连接4、运行程序第一次数据区的数值一次为:09h,08h,07h,06h,05h,04h,03h,02h,01h,00h运行结果第二次数据区的数值一次为:02h,03h,05h,01h,04h,06h,0Ah,0Bh,09h,08h运行结果(2)本次实验程序的流程图YN开 始初始化循环次数CX置内循环次数SIAiA i+1Ai Ai+1NYNY(3)1、内循环部分:cc: dec si mov al,sidec sicmp al,si ;取相邻的两个数进行比较ja bbxchg a
13、l,si mov si+01,al外循环部分:l1:dec cxjz aapush si push cx2、程序中对 SI,CX 压栈及弹栈的意义:对 SI、CX 进行修改地址指针指向下一单元修改内循环次数 SI-1=SISI=0?修改外循环次数 CX-1=CXCX=0?结 束保护。(4)实验小结通过此次实验使我进一步了解了汇编语言编程过程。对于汇编的常用指令有更深的理解了。实验五 8255 并行接口应用实验一实验目的1. 掌握 8255 工作方式的编程设计。2. 8255 与外部设备进行连接的应用。二.实验设备与材料:TDN86/88 教学实验系统一台,扁平插线若干。三.实验原理: INTE
14、L8255 是一种通用的可编程并行 IO 接口芯片,是专为 INTEL 公司的微处理器设计的,也可用于其它系列的微型机系统中。利用 8086 汇编指令系统,编制初始化程序,可以变更 8255 的工作方式,通用性强,使用灵活。8255 具有 3 个带锁存或缓冲的数据端口,它的并行数据宽度为 8 位。可与外设并行进行数据交换。A 口和 B 口内具有中断控制逻辑,在外设与 CPU 之间可用中断方式进行信息交换。 8255 能与许多外部设备连接,例如:键盘、显示器、打印机等。(a)工作方式控制字 (b)C 口按位置位/复位控制字四.实验内容及步骤18255 的一般输入输、出方式本系统中的 8255 芯
15、片 8255 的数据线、地址线、读写控制线等分别与系统总线相连,其 A、B、C 三个端口以排针形式引出,供 8255 实验使用,其线路如图 1 所示。图 1 8255 接口实验中端口地址如表 1 所示表 1接口实验单元中的开关和发光二极管电路信号线 寄存器 编址A 口 60HB 口 61HC 口 62HIOY3控制寄存器 63H按图所示实验线路,8255 端口 A 工作在方式 0 并作为输出口,端口 B 工作在方式 0 并作为输入口。用一组开关信号接入端口 B, 端口 A 输出线接至一组发光二极管上,通过对 8255 编程来实现输入输出功能。实验步骤图 2 8255 输入输出方式实验接线图注:
16、圆圈处是要求接的连线。(1)按图 2 接线。用扁平线(8 头)分别插在 8255 的 A 口和发光二极管的插针上。用扁平线 分别插在 8255 的 B 口和拨动开关的插针上。(2)输入源程序,汇编、连接后装入系统。 参考程序 1 STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODESTART: MOV AL,82H ;设 8255 方式字 10000010 A 位输出,B 口位输入。OUT 63H,ALA1: IN AL,61HOUT 60H,ALJMP A1CODE ENDSEND START(3)执行程序后,
17、拨动开关组 K0-K7,观察发光二极管 LED0-LED7 变化,它应是与开关组 K0-K7 的值是一一对应的变化。28255 的选通输入、输出方式按图 3 所示实验线路,8255 端口 A 工作在方式 0 并作为输出口,端口 B工作在方式 1 并作为输入口。从端口 C 的 PC2 成为选通信号输入, 端 STBb,PC0成为中断请求信号输出端 INTRb。当 B 口数据就绪后,通过发口 STBb 信号来请求 CPU 读取端口 B 数据并送 A 口输出显示。实验步骤图 3 8255 选通方式实验接线图(KK1-初态为“1”)注:圆圈处是要求接的连线。(1) 按图 3 接线。用扁平线(8 头)分
18、别插在 8255 的 A 口和发光二极管的插针上。用扁平线 分别插在 8255 的 B 口和拨动开关的插针上。8255 的 PC0 插针接 8259 的 IRQ7 插针上, 8255 的 PC1 插针接 KK1-插针上。(2) 输入源程序,汇编、连接后装入系统。 参考程序 2STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODESTART: CLIMOV AL,0A6HOUT 63H,ALMOV AL,05HOUT 63H,ALPUSH DSMOV AX,0000HMOV DS,AXMOV AX,OFFSET IR
19、Q7 ADD AX,2000HMOV SI,003CHMOV SI,AXMOV AX,0000HMOV SI,003EHMOV SI,AXPOP DSIN AL,21H ;读 IMRAND AL,7FH ;开 IRQ7 中断OUT 21H,ALA1: STIHLT ;等待中断请求信号JMP A1IRQ7: IN AL,61H ;读开关信息OUT 60H,AL ;输出开关信息MOV AL,20HOUT 20H,ALIRETCODE ENDSEND START (3) 执行程序后,拨动开关组 K0-K7(即设定一输入值),按一下拨动开关 KK1, 观察发光二极管 LED0-LED7 变化,它应是与
20、开关组 K0-K7D的设定值一一对应 。3运用 8255 设计的键盘及显示接口图中用并行接口 8255A 作为微机与键盘间的接口,采用逐行扫描法识别键。将键盘中的列与 PA0-PA3 相连,A 口为输出;将行与 C 口的 PC0-PC1 相连,C 口为输入口; PB0-PB7 与七段代码显示器连接 B 口为输出。程序执行过程如下:识别是否有键按下,方法是使 PA0-PA3 输出全 0,读 C口(行值) 中只要有一位为 0,就说明有键按下,在检测到有键按下后,延迟一段时间,根据找到的键号,转去执行显示七段代码显示器的程序,这时七段代码显示器就显示与该键相同的数值。实验步骤 图 4 8255 接口
21、的应用键盘及显示接线图注:圆圈处是要求接的连线。(1)按图 4 接线。(2)输入源程序,汇编、连接后装入系统。(3)执行程序后, 按一下键盘,7 段代码就会显示相应的数字。 参考程序 3STACK SEGMENT STACKDW 64 DUP(?) STACK ENDSDATA SEGMENTTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,3000HMOV AL,00HMOV SI,AL ;清空存放数据的缓冲区
22、MOV SI+1,ALMOV SI+2,ALMOV SI+3,ALMOV DI,3003HMOV AL,81H ;8255 方式字定义 选择 0 方式,A 口为输出;B 口为输出;C 口为输入OUT 63H,ALBEGIN: CALL DIS ;显示七段代码管数据的子程序CALL CLEAR ;七段代码管清 0 子程序 CALL CCSCAN ;检测是否有键按下子程序JNZ INK1 ;JMP BEGININK1: CALL DISCALL DALLY ;子程序为延时,消抖动CALL DALLYCALL CLEARCALL CCSCANJNZ INK2JMP BEGININK2: MOV CH
23、,0FEHMOV CL,00HCOLUM: MOV AL,CHOUT 60H,ALIN AL,62HTEST AL,01HJNZ LONEMOV AL,00HJMP KCODELONE: TEST AL,02HJNZ NEXTMOV AL,04HKCODE: ADD AL,CLCALL PUTBUFPUSH AXKON: CALL DISCALL CLEARCALL CCSCANJNZ KONPOP AXNEXT: INC CLMOV AL,CHTEST AL,08HJZ KERRROL AL,1MOV CH,ALJMP COLUMKERR: JMP BEGINCCSCAN: MOV AL,0
24、0HOUT 60H,ALIN AL,62HNOT ALAND AL,03HRETCLEAR: MOV AL,00HOUT 61H,ALRETDIS: PUSH AXMOV SI,3000HMOV DL,0F7HMOV AL,DLAGAIN: OUT 60H,ALMOV AL,SIMOV BX,OFFSET TABLE ;取七段代码首址AND AX,00FFHADD BX,AXMOV AL,BXOUT 61H,ALCALL DALLYINC SIMOV AL,DLTEST AL,01HJZ OUTROR AL,1MOV DL,ALJMP AGAINOUT: POP AXRETDALLY: PUSH CXMOV CX,0010HT1: MOV AX,0010HT2: DEC AX