微机实验讲议_16开_201310

更新时间:2023-04-20 04:51:01 阅读量: 实用文档 文档下载

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

微机原理与接口技术实验

关旭箭编

暨南大学信息科学技术学院

电子工程系

2013 年8 月

目录

8086汇编语言上机调试方法………………………………………………( 2 )

软件部分实验

实验一两个多位十进制数相加的实验………………………………… ( 11 ) 实验二两个数相乘的实验………………………………………………( 15 )实验三二进制到BCD转换………………………………………………( 18 ) 实验四二进制到ASCII码转换…………………………………………( 20 ) 实验五内存块移动………………………………………………………( 22 ) 实验六数据排序…………………………………………………………( 24 ) 实验七字符匹配程序……………………………………………………( 26 ) 实验八字符串匹配程序…………………………………………………( 30 )实验九从键盘输入数据并显示的程序…………………………………( 34 )实验十字符和数据的显示程序…………………………………………( 38 )实验十一将键盘输入的小写字母转换成大写字母的程序………………( 42 )

硬件部分实验

实验一8255可编程输入、输出接口实验……………………………( 46 )

实验二并行口控制的模拟交通灯实验………………………………( 51 )实验三点阵LED的显示实验…………………………………………( 56 ) 实验四 8253可编程计数器实验………………………………………( 61 ) 实验五8253可编程定时器实验………………………………………( 66 ) 实验六电子琴(8253定时器应用实验)……………………………( 68 ) 实验七六位七段数码管显示…………………………………………( 73 ) 实验八键盘扫描及显示的接口实验…………………………………( 79 )

实验九8259可编程外部中断实验……………………………………( 86 )

实验十 A/D0809模数转换实验………………………………………( 92 )

实验十一 D/A0832数模转换实验……………………………………( 100 )

实验十二 8251A串行通讯实验…………………………………………( 105 ) 实验十三温度测量实验………………………………………………( 113 )

附录1 ASCⅡ编码表……………………………………………( 118 )附录2 DOS功能调用( INT 21 )一览表………………………( 120 )附录3动态调试程序DEBUG .EXE的使用…………………( 125 )

附录4 实验系统的地址空间分配表………………………………( 136 ) 附录5 W A VE 仿真器开发环境简介………………………………( 137 )

- 1 -

8086汇编语言上机调试方法

1、用鼠标点击“网上邻居”;

2、输入ftp://202.116.6.197

3、将服务器上“MASM”文件夹中的所有内容复制到E:盘上。

4、进入E:\MASM\UltraEdit v9.00c\文件夹创建“Uedit32.exe”文件的快捷方式,将

“Uedit32快捷方式”复制到桌面。

5、双击“Uedit32快捷方式”启动文本编辑软件UltraEdit,输入汇编语言程序( 注

意:在最后一行的“END”输入完后要按一次回车键,保存源文件的扩展名一定要是ASM 如: EXAMPLE.ASM )。

6、“编译”、“连接”和“调试程序”程序。

方法一、

①、双击“Uedit32快捷方式”启动文本编辑软件UltraEdit,打开\MASM\MASM1文件

夹中的“Example.ASM”源程序。

②、移动光标到UltraEdit工具栏的“高级(A)”处,点击里面的“编译”,若无错误

则继续点击“连接”和“调试程序”,“调试程序”是直接进入“DEBUG”中

对汇编语言程序进行调试。

方法二、

①、用 Windows XP 的命令行方式(在运行程序栏中输入command 并按回车键)

进入\MASM\MASM1文件夹,文件夹中有 MASM.EXE, LINK.EXE , DEBUG.EXE 3个主要的工具软件和Example.ASM 源程序。

②、在 DOS 提示符下进行汇编、连接、动态调试等操作。

例如: 对源文件 EXAMPLE.ASM 进行的操作

E:\MASM\MASM1\MASM EXAMPLE; 汇编源程序操作

E:\MASM\MASM1\LINK EXAMPLE; 连接并生成扩展名为 .EXE 的可执行文件

E:\MASM\MASM1\DEBUG EXAMPLE.EXE 对可执行文件进行调试

7、“DEBUG”中常用的调试命令

U - 反汇编命令

用法: -U 代码段地址:起始偏移地址如:-U CS:100

D - 显示内存中的数据命令

用法: -D 数据段地址:存放数据的偏移地址如:-D DS:00 20

T - 单步执行程序命令

用法: -T 要执行的指令条数如:-T 3

G - 连续执行程序命令

用法: -G=代码段地址:指令的起始偏移地址指令的结束偏移地址

如: -G=CS:100 106

注意: 结束地址一定要是操作码的所在地址

R - 查看和修改寄存器数据命令

用法: -R 回车如:-R AX

F - 对内存单元填充数据命令

用法: -F 数据段地址:偏移首地址偏移未地址填入的数据

如: -F DS:100 120 ff

Q - 退出”DEBUG“应用程序命令

- 2 -

8、应用例子及操作步骤

题目要求:将 AX 中的十六进制数拆为三个 BCD 码, 并存入 Result_1, Result_2, Result_3 的三个单元中。

⑴、输入源程序

DATA SEGMENT ; 数据段

RESULT_1 DB 1

RESULT_2 DB 1

RESULT_3 DB 1

DATA ENDS

STACK SEGMENT STACK ; 堆栈段

STA DB 64 DUP(0)

STACK_TOP DB 0

STACK ENDS

CODE SEGMENT ; 代码段

ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK

START:

; 程序开头必须要有的五条指令

MOV AX, DATA

MOV DS, AX ; 设置数据段

MOV AX, STACK

MOV SS, AX ; 设置堆栈段

LEA SP, STACK_TOP ; 设置栈顶指针

; 程序的中间部分

MOV AX, 587

MOV CL, 100

DIV CL

MOV RESULT_1, AL ; 除以 100, 得百位数

MOV AL, AH

MOV AH, 0

MOV CL, 10

DIV CL

MOV RESULT_2, AL ; 余数除以 10, 得十位数

MOV RESULT_3, AH ; 余数为个位数

; 程序结束必须要有的两条指令

MOV AX,4C00H ;

INT 21H ;

CODE ENDS

END START ; 最后一行要按回车键

- 3 -

⑵、对源程序进行汇编产生OBJ文件

E:\MASM\MASM1>MASM EXAMPLE; ( 输入MASM EXAMPLE; 并按回车键 ) Microsoft (R) Macro Assembler Version 5.00

Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.

51514 + 408822 Bytes symbol space free

0 Warning Errors

0 Severe Errors

⑶、对目标文件进行连接产生EXE文件

E:\MASM\MASM1>LINK EXAMPLE; ( 输入 LINK EXAMPLE; 并按回车键 )

Microsoft (R) 8086 Object Linker Version 3.05

Copyright (C) Microsoft Corp 1983, 1984, 1985. All rights reserved.

⑷、对可执行文件进行调试

E:\MASM\MASM1>DEBUG EXAMPLE.EXE ( 输入DEBUG EXAMPLE.EXE 并按回车键 ) -U CS:0000 用反汇编命令“U 代码段地址:起始偏移地址”显示出程序的表示符

-U 0 2C ( 按回车键 )

160D:0000 B80716 MOV AX,1607 ; 程序的起始地址是 160DH:0000H 160D:0003 8ED8 MOV DS,AX

160D:0005 B80816 MOV AX,1608

160D:0008 8ED0 MOV SS,AX

160D:000A 8D264100 LEA SP,[0041]

160D:000E B84B02 MOV AX,024B

160D:0011 B164 MOV CL,64

160D:0013 F6F1 DIV CL

160D:0015 A20000 MOV [0000],AL

160D:0018 8AC4 MOV AL,AH

160D:001A B400 MOV AH,00

160D:001C B10A MOV CL,0A

160D:001E F6F1 DIV CL

160D:0020 A20100 MOV [0001],AL

160D:0023 88260200 MOV [0002],AH

160D:0027 B8004C MOV AX,4C00 ; 程序的结束地址是 160DH:0027H 160D:002A CD21 INT 21

160D:002C 9E SAHF

-

执行程序前观察内存中的数据

-D DS:0000 ; 用显示内存中的数据命令 D显示内存中的数据。

命令格式:“D 数据段地址:存放数据的偏移地址”

-D DS:0 30 ( 按回车键 )

15F7:0000 CD 20 00 A0 00 9A F0 FE-1D F0 3C 03 5D 0F 77 03 . ........<.].w. 15F7:0010 5D 0F 04 03 5D 0F 4C 0F-01 01 01 00 02 FF FF FF ]...].L......... 15F7:0020 FF FF FF FF FF FF FF FF-FF FF FF FF E6 15 4C 01 ..............L. -

- 4 -

连续执行程序

-G=CS:0000 0027 ;( 按回车键 )

命令格式:G=代码段地址:指令的起始偏移地址指令的结束偏移地址

AX=0708 BX=0000 CX=000A DX=0000 SP=0041 BP=0000 SI=0000 DI=0000

DS=1607 ES=15F7 SS=1608 CS=160D IP=0027 NV UP EI PL NZ NA PO NC

160D:0027 B8004C MOV AX,4C00

-

执行完程序后,显示出CPU 内的各寄存中的数据和当前的标志状态(见表1-1所示)

执行程序后观察内存中的数据(结果)

-D DS:0000 ; 用显示内存中的数据命令“ D 数据段地址:存放数据的偏移地址”显示内存中的数据

-D DS:00 ; 观察内存中的数据

1607:0000 05 08 07 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1607:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1607:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -

-R IP 修改IP寄存器中的数据

IP 0027 显示修改前的数据

:00 输入修改的数据

-

-T ;单步执行程序命令(执行一条指令)

AX=1607 BX=0000 CX=000A DX=0000 SP=0041 BP=0000 SI=0000 DI=0000

DS=1607 ES=15F7 SS=1608 CS=160D IP=0003 NV UP EI PL NZ NA PO NC

160D:0003 8ED8 MOV DS,AX

-

- 5 -

-T3 ;执行3条指令

AX=1607 BX=0000 CX=000A DX=0000 SP=0041 BP=0000 SI=0000 DI=0000

DS=1607 ES=15F7 SS=1608 CS=160D IP=0005 NV UP EI PL NZ NA PO NC

160D:0005 B80816 MOV AX,1608

AX=1608 BX=0000 CX=000A DX=0000 SP=0041 BP=0000 SI=0000 DI=0000

DS=1607 ES=15F7 SS=1608 CS=160D IP=0008 NV UP EI PL NZ NA PO NC

160D:0008 8ED0 MOV SS,AX

AX=1608 BX=0000 CX=000A DX=0000 SP=0041 BP=0000 SI=0000 DI=0000

DS=1607 ES=15F7 SS=1608 CS=160D IP=000E NV UP EI PL NZ NA PO NC

160D:000E B84B02 MOV AX,024B

-

-R ; 查看寄存器数据命令

AX=0302 BX=0000 CX=000A DX=0000 SP=0014 BP=0000 SI=0000 DI=0000

DS=1607 ES=1607 SS=12A0 CS=129D IP=0028 NV UP EI PL NZ NA PO NC

129D:0028 B8004C MOV AX,4C00

-R AX ;查看和修改寄存器数据命令

AX 0302

:FFFF

-R ; 查看寄存器数据命令

AX=FFFF BX=0000 CX=000A DX=0000 SP=0014 BP=0000 SI=0000 DI=0000

DS=1607 ES=1607 SS=12A0 CS=129D IP=0028 NV UP EI PL NZ NA PO NC

129D:0028 B8004C MOV AX,4C00

-

-F 数据段地址:偏移首地址偏移未地址填入的数据

-F DS:0000 0030 DF ; 对内存单元填充数据

-D DS:00 ; 观察内存中的数据

1607:0000 DF DF DF DF DF DF DF DF-DF DF DF DF DF DF DF DF ................ 1607:0010 DF DF DF DF DF DF DF DF-DF DF DF DF DF DF DF DF ................ 1607:0020 DF DF DF DF DF DF DF DF-DF DF DF DF DF DF DF DF ................ 1607:0030 DF A2 01 00 88 26 02 00-B8 00 4C CD 21 0B A1 D6 .....&....L.!... 1607:0040 5D 48 50 E8 85 0C 83 C4-02 C6 14 00 00 00 28 00 ]HP...........(. -

-Q ; 退出”DEBUG“应用程序命令

- 6 -

方法三、使用用 Emu8086 仿真软件来调试 8086汇编语言程序

⑴、进入E:\MASM\Emu8086-v4.05\文件夹点击8086仿真安装文件“Emu8086-v4.05_Setup.exe ”安装Emu8086

⑵、第一次运行Emu8086 要进行注册,点击“please enter the registration

key”项

⑶、按下图进行注册

⑷、点击“NEW”创建新文件

- 7 -

⑸、选择扩展名为“EXE”点击“OK”

⑹、点击“Open”打开文件,装入Example.asm源程序;并点击

“Compile 对Example.asm源程序选择进行编译;

- 8 -

⑺、点击“保存”保存可执行文件;

⑻、点击“RUN”进入程序的仿真运行

- 9 -

⑼、进入调试汇编语言程序阶段

- 10 -

软件实验

实验一、两个多位十进制数相加的实验

1、实验目的

(1).学习数据传送和算术运算指令的用法。

(2).熟悉在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程。

2、实验内容

将两个多位十进制数相加。要求被加数均以ASCII码形式各自顺序存放在以DA TAl和DA TA2为首的5个内存单元中(低位在前),结果送回DA TAl处。

3

显示被加数和加数

被加数和加数以ASCII码表示的数字串形式

转化为由十六进制表示的数字串形式

计数值5一> CX

清除最低位进位

执行ADC带进位相加

AAA调整

结果送被加数区

调整偏移量

CX-1=

十六进制的结果转化为ASCII 码表示的数字串

显示结果

结束

- 11 -

4、参考程序:

DATA SEGMENT ;数据段

DATA1 DB 33H,39H,31H,37H,34H ; 47193的ASCII码作为被加数DATA2 DB 36H,35H,30H,38H,32H ; 28056的ASCII码作为加数DATA ENDS

STACK SEGMENT STACK ;堆栈段

STA DB 64 DUP(0)

SP_TOP DB 0

STACK ENDS

CODE SEGMENT ; 代码段

ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START: MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

LEA SP, SP_TOP

MOV SI,OFFSET DATA1 ; 送被加数地址

MOV BX,05 ; 送显示字符的个数

CALL DISPL ; 显示被加数

CALL CRLF ; 回车、换行

MOV SI,OFFSET DATA2 ; 送加数地址

MOV BX,05 ; 送显示字符的个数

CALL DISPL ;显示加数

CALL CRLF ; 回车、换行

MOV SI,OFFSET DATA1 ; 送被加数地址

MOV DI,OFFSET DATA2 ; 送加数地址

CALL ADDA ; 加法运算

MOV SI,OFFSET DATA1 ; 送结果地址

MOV BX,05 ; 显示加数

CALL DISPL ; 显示结果

CALL CRLF

MOV AX,4C00H

INT 21H ; 主程序结束

- 12 -

CRLF PROC NEAR ;回车、换行于功能

MOV DL,0DH ;回车(0DH为回车的ASCII 码)

MOV AH,02H ; 送DOS 的中断调用功能号

INT 21H ; DOS 的中断调用

MOV DL,0AH ;换行(0AH为换行的ASCII 码)

MOV AH,02H ; 送DOS 的中断调用功能号

INT 21H ; DOS 的中断调用

RET

CRLF ENDP

DISPL PROC NEAR ; 显示子程序

DSL: MOV AH,02 ; 送显示功能号

MOV DL,[SI+BX-1] ; 显示字符串中一字符(ASCII 码)

INT 21H ; DOS INT 21 功能调用

DEC BX ;修改偏移量

JNZ DSL

RET

DISPL ENDP

ADDA PROC NEAR

MOV BX,05

ADI: SUB BYTE PTR[SI+BX-1],30H

SUB BYTE PTR[DI+BX-1],30H

DEC BX ;将ASCII码表示的数转化为十六进制数

JNZ ADI

PUSH SI

PUSH DI

MOV CX,05 ;包括进位,共5位

CLC ;清进位位

AD2: MOV AL,[SI]

MOV BL,[DI]

ADC AL,BL ;带进位相加

AAA ;非组合BCD码的加法调整

MOV [SI],AL ;结果送被加数区

INC SI

INC DI ;指向下一位

- 13 -

LOOP AD2 ;循环

POP DI

POP SI

MOV BX,05H

AD3: ADD BYTE PTR [SI+BX-1],30H

ADD BYTE PTR [DI+BX-1],30H

DEC BX ;十六进制的数转化为ASCII码表示的数

JNZ AD3

RET

ADDA ENDP

CODE ENDS

END START

- 14 -

实验二、两个数相乘的实验

1、实验目的

掌握乘法指令和循环指令的用法

2、实验内容

实现十进制数的乘法,被乘数和乘数均以ASCII码形式存放在内存中,乘积在屏幕上显示出来。

3、程序框图

乘数->BL

BL中数由ASII码转化为十六进制数

SI指向被乘数

DI指向存储结果区域(预清0)

计数值5->CX

取被乘数[SI]单元与BL 相乘

AAM调整

结果低位与前次计算的进位[DI]相加

AAA调整

结果[DI]

DI+1指向下一单元

本次计算的进位-> [DI]

CX-l=

- 15 -

显示结果

结束

4、参考程序:

DATA SEGMENT

DATA1 DB 32H, 39H, 30H, 35H, 34H

DATA2 DB 33H

RESULT DB 6 DUP(00H)

DATA ENDS

STACK SEGMENT STACK

STA DB 30 DUP(0)

TOP DB 0

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA START: MOV AX, DATA

MOV DS, AX

MOV AX, STACK

MOV SS, AX

LEA SP, TOP

MOV SI, OFFSET DATA2

MOV BL,[SI] ; 乘数送BL

AND BL,0FH ;屏蔽高4位,ASCII码转十六进制数

MOV SI,OFFSET DATA1

MOV DI,OFFSET RESULT

MOV CX,05

LOOPl: MOV AL,[SI]

AND AL,0FH ;取被乘数将ASCII码转十六进制数

INC SI ; 指向被乘数的下一单元

MUL BL ;相乘

AAM ;AAM调整

- 16 -

ADD AL,[DI] ;结果低位与前次计算的进位加

AAA ;AAA调整

MOV [DI],AL

INC DI ;结果送存到下一单元

MOV [DI], AH

LOOP LOOPl ;计算结果高位进位送存

MOV CX,06

MOV SI,OFFSET RESULT + 5

DISPL: MOV AH,02

MOV DL,[SI]

ADD DL,30H

INT 21H

DEC SI

LOOP DISPL ;显示结果

MOV AX,4C00H

INT 21H ;结束

CODE ENDS

END START

- 17 -

实验三、二进制到BCD转换

1、实验要求:

将给定的一个二进制数,转换成二十进制(BCD)码

2、实验目的:

(1)掌握简单的数值转换算法

(2)基本了解数值的各种表达方法

3、实验说明:

计算机中的数值有各种表达方式,这是计算机的基础。掌握各种数制之间的转换是一种基本功。有兴趣的同学可以试试将BCD转换成二进制码。

4、程序框图:

给出要转换的二进制数

将数除以100,得百位数

保存百位数

将余数再除以10,得十位数

保存十位数

余数为个位数,将其保存

结束

- 18 -

5、参考程序:

; 将 AX 拆为三个 BCD 码, 并存入 Result 开始的叁个单元

DATA SEGMENT ; 数据段

RESULT_1 DB 1

RESULT_2 DB 1

RESULT_3 DB 1

DATA ENDS

STACK SEGMENT STACK ; 堆栈段

STA DB 64 DUP(0)

STACK_TOP DB 0

STACK ENDS

CODE SEGMENT ; 代码段

ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK START: MOV AX, DATA

MOV DS, AX ; 设置数据段

MOV AX, STACK

MOV SS, AX ; 设置堆栈段

LEA SP, STACK_TOP ; 设置栈顶指针

MOV AX, 123

MOV CL, 100

DIV CL

MOV RESULT_1, AL ; 除以 100, 得百位数

MOV AL, AH

MOV AH, 0

MOV CL, 10

DIV CL

MOV RESULT_2, AL ; 余数除以 10, 得十位数

MOV RESULT_3, AH ; 余数为个位数

MOV AX,4C00H ; INT 21H ; CODE ENDS

END START ; 最后一行要按回车键

- 19 -

实验四、二进制到ASCII码转换

1、实验要求:

给出一个BCD数,将其转换成ASCII值。

2、实验目的:

(1)了解BCD值和ASCII值的区别

(2)了解如何将BCD值转换成ASCII值

(3)了解如何查表进行数值转换及快速计算。

3、实验说明:

此实验主要让学生了解数值的BCD码和ASCII码的区别,利用查表功能可能快速地进行数值转换。进一步了解数值的各种表达方式。

4、程序框图:

给出要转换数BCD码

取出BCD码高四位

查表得到ASCII码

保存高位ASCII码

取出BCD码低四位

查表得到ASCII码

保存低位ASCII码

结束

- 20 -

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

Top