微机原理与接口技术实验指导(2010版)

更新时间:2023-04-15 09:23:01 阅读量: 实用文档 文档下载

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

微型计算机原理与接口技术实验指导(上)

微机应用实验室

2010年9月

前言

本课程是为了配合《微机原理与接口技术》的学习开设的实验课程,目的在于通过实践加深同学们对理论知识的认知和理解,熟悉汇编语言程序的编制和调试,熟悉通用的微机接口电路,为今后的学习和工作打下基础。

由于课程时间安排比较紧,有一些程序设计的基础知识需要同学们自行预习并掌握,主要内容都在本讲义的附录中,这里简单的列举一下,便于大家查找:

1、DOS的使用初步(这一部分由实验辅导教师讲授)

2、Turbo Assembler 的使用

3、Turbo Debugger 的使用

4、接口实验所采用的实验平台TPC-H的基本构成

5、基于TPC-H系统的汇编语言程序设计

2

目录

实验要求及实验报告书写规范 (4)

第一部分汇编语言程序设计 (5)

实验一汇编语言程序的编辑与调试 (6)

实验二顺序程序设计 (8)

实验三循环程序的设计 (11)

实验四分支程序的设计 (19)

实验五子程序结构的设计方法 (25)

实验六图形方式程序设计基础 (30)

第二部分接口技术实验 (49)

实验七可编程定时器/计数器(8253) (52)

实验八中断 (54)

实验九可编程并行接口(8255) (59)

实验十数/模转换器 (64)

实验十一模/数转换器 (66)

实验十二串行通信 (69)

附录一 (71)

附录二 (91)

3

实验要求及实验报告书写规范

实验要求:

1、实验前有预习并写有预习报告(程序框图和源程序)

2、熟悉实验仪器,操作规范、安全

3、能独立完成实验

4、能独立分析并解决实验中出现的问题

5、能独立回答指导教师实验中提出的问题

实验报告书写规范:

实验报告应包括下面内容,可以打印,每次实验上交上次实验的实验报告

1、实验内容

2、实验目的

3、实验原理

4、实验采用的电路图(部分实验没有)

5、程序的流程图

6、源程序

7、实验结果及分析

8、思考题(未布置的省略)

4

实验评分标准

5

第一部分汇编语言程序设计

这一部分含六个实验,同学们可以根据自己的进度适当调整实验的进程,总的原则是要熟练掌握汇编语言程序设计的方法,掌握使用TD进行程序调试的方法,相关内容见附录一。

6

实验一汇编语言程序的编辑与调试【预习准备】

预习附录一的内容,特别是TD的使用部分。

【实验目的】

学习汇编源程序的编辑、编译、链接、执行全过程。

学习编辑文件、TASM、TLINK的使用方法以及汇编语言的语法规则。

学习使用TD对程序进行调试的方法。

【实验1.1】阅读附录一的内容,根据附录一【例1.1】的步骤,将例程输入并完成编译、链接等工作;按照【例1.1】后面的提示,启动TD并进行各项动态调试,逐步熟悉TD的用法;在实验报告上为源程序增加注释。

【实验1.2】下面的程序采用比较法,将一个8位二进制数转换成十进制数显示,其设计方法拙劣,语法错误很多,希望以它为蓝本,练习源程序的编辑、编译、链接和调试。同学应照原样编辑源程序,汇编之后,必定给出若干错误信息,再根据错误提示,修改源程序,直到汇编后没有错误时为止,然后进行链接、执行。正确的执行结果是在屏幕上显示:

100 + 9 = 109

[程序清单]:

;FILENAME:EXA111.ASM

DATA SEGMENT

N1 DW 0809H , AB

N2 DB 100

SUN DB ?

MESG DB ?100+9='

DB 30H , 30H , 30H ; 3个0的ASCII码

DATA ENDS

CODE SEGMENT

7

ASSUME CS: CODE , DS: DATA

BEG: MOV DS , DATA ; 段基址→DS MOV BX , OFFSET SUM

MOV AH , N1 ; 9→AH

MOV AL , N2 ; 100→AL

ADD AH , AL

MOV [BX] , AH ; 和数→SUM单元

CALL N2_10

MOV AH , 9

MOV DX , OFFSET MESG

INT 21H

MOV AH , 4CH

INT 21H

N2_10 PROC ; 二进制数→十进制数ASCII码LAST: CMP [BX] , 100 ; 和数与100比较JC NEXT1 ; 小于100转

SUB [BX] , 100 ; 否则,和数减10O

INC [BX+7] ; 百位数加1JMP LAST

JMP LAST

NEXT1: CMP [BX] , 10 ; 余数与10比较JC NEXT2 ; 小于10转

SUB [BX] , 10 ; 否则,余数减10

INC [BX+8] ; 十位数加1

JMP NEXT1

NEXT2: ADD [BX+9] , SUM ; 生成个位数

RET

N2_10: ENDP

CODE ENDS

END BEG

8

实验二顺序程序设计

【实验目的】

学习汇编语言基本操作指令和伪指令的应用;了解编程的基本方法。

1.示例

【例2.1】变量X,Y为二位数字的ASCII码串,请编写程序计算并显示出下式的值:

Z←X+(Y-15)

解:求一个代数式(或表达式)的值,一般的做法是根据运算符的优先级顺序进行计算,如上式先计算(Y-15),再与X相加,将其结果存放在Z变量中,最后可用DOS功能调用将结果显示出来。程序流程见图2.1。

[程序清单]:

TITLE ASCDAT(COM) ; add &sub ASCII numbers CODESG S EGMENT

ASSUME CS: CODESG, DS: CODESG

ORG 100H

BEGIN: JMP SHORT MAIN

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

X DB '60' ; ASCII number

Y DB '24'

Z DB ?000‘ , '$‘

MAIN PROC NEAR

MOV DX , CODESG ; initialize DS

MOV DS , DX

MOV AH , 0 ; clear AH

MOV AL , Y+1 ; load Y‘s low order

SUB AL , 05 ; sub low order digit

AAS ; adjust for sub

MOV Z+2 , AL ; put result in Z‘s low order

MOV AL , Y ; load y's high order

图2.1例2.1的程序框图

9

SBB AL , 01 ; sub digit with carry

AAS ; adjust for sub

XCHG AL , Z+2 ; exchange lower-order in AL

ADD AL , X+1 ; add lower-order in AL

AAA ; adjust for add

XCHG AL , Z+2 ; exchange high_order in AL

ADC AL , X ; add high_order digit

AAA ; adjust for add

MOV Z+1 , AL ; store high_order result

MOV Z , AH ; store carry

OR Z , 30H ; string should be

OR Z+1 , 30H ; ASCII string

OR Z+2 , 30H

MOV DX , OFFSET Z ; offset of string Z

MOV AH , 9 ; display string function

INT 21H ; call DOS

MOV AX , 4C00H ; return

INT 21H

MAIN ENDP

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

CODEG ENDS

END BEGIN

10

2.实验题

【实验2.1】编写程序,计算(a + b) – 2 * (a AND b),结果送入S单元。(a,b为字变量)

【实验2.2】设有两个带符号整数变量A和B,求A和B之差并判断结果是否溢出。

【实验2.3】定义一个双字变量VOLUME,从键盘输入长方体的长(a),宽(b)和高(h),计算它的体积,并保存在VOLUME中(注意判断溢出)。

要求:①上述实验中的各变量单元要在数据区定义;②用TD(或debug)调试,运行并修改各变量的值,观察结果存放单元。

11

12

实验三 循环程序的设计

【实验目的】 学习并掌握循环程序的设计方法。

1. 示例

【例3.1】 表格查找tabsrch 仓库管理中,总共存有有关库存品的编号、名称、数量、价格等情况的表格,根据用户提供的编号可以找到有关材料。假设表格中共有6种库存品,表格的格式为:

STOKTAB

DB ?05' , ?Excavatos‘

DB ?08‘ , ?Lifters‘ ┇

试编写一程序,根据用户提供的编号在终端上显示其名称。

根据题目的要求,程序可由三部分组成:

① 输入:接收用户键入的库存品号; ② 查表:根据给定编号在表格中查找

所要求的库存品名称;

③ 输出:显示找到的库存品名称。

其中,第二部分是程序的主体,显然它可以使用循环结构。由于在给定的表格中,编号及库存品名所占的字节数都是相等的,因此在查找时,只要根据编号的地址就可逐项查找。循环的结束条件应该是在找到用户所指定的项时就可退出循环,但还必须考虑在表格中未

查到所需编号的特殊情况。根据以上考虑可画出程序框图如图3.1所示。如用户给出的编号可在表格中查到,则显示出相应的库存品名。如用户不再需要查找,只需按一下??回车‘键就可结束程序。如表格中并无用户给出的编号,则显示Not in table !后结束程序。

图3.1 例3.1的框图

[程序清单]:

;.PROGRAM TITLE GOES

; HERE--tabsrch

; Table search

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

datasg segment para ? data‘

mess1 ld ?stock nember?‘ , 13 ,10 , ?$‘

stoknin label byte

max db 3

act db ?

stokn db 3 dup (?)

stoktab db ?05‘ , ?Excavators ‘

db ?08‘ , ? F Lifters ‘

db ?09‘ , ?Presses ‘

db ?12‘ , ? Valves ‘

db ?23‘ , ? Processors ‘

db ?27‘ , ? Pumps ‘

descrn db 14 dup (20h) , 13 , 10 , ?$‘

mess db ?Not in table ! ? , $‖

datasg ends

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

codesg segment para ?code‘

assume cs: codesg , ds: datasg , es: datasg main proc far

push ds ; save old

;data segment

sub ax , ax ; put zore

; in AX

push ax ; save it

; on stack

mov ax , datasg

mov ds , ax ; into DS

13

;register

mov es , ax ; into ES

; register

; MAIN PART OF PROGRAM GOES HERE

start : lea dx , mess1

; Prompt for stock number

mov ah , 09

int 21h

lea dx , stoknin

mov ah , 0ah

int 21h

cmp act , 0

Je exit

Mov al , stokn ; get stock#

Mov ah , stock+1

Mov cx , 06 ; No. of entries

Lea si , stoktab

a20: cmp ax , word ptr [si] ; stock#: table

je a30 ; equel exit

add si , 14 ; not equal increment

loop a20

lea dx , mess ; not in table

mov ah , 09h

int 21h

jmp exit

a30: mov cx , 07 ; length of descr‘n

lea di , descrn ; addr of descr‘n

rep movsw

lea dx , descrn

mov ah , 09h

int 21h

jmp start

14

exit: ret ; return to DOS

main endp

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

codesg ends ; end of code segment end main ; end of code assembly

[运行情况]:

C:\>tsrch

stock nember?

23 Processors

stock nember?

27 Pumps

stock nember?

05 Excavators

stock nember?

C:\>tsrch

stock nember?

09 Presses

stock nember?

08 Lifters

stock nember?

12 Valves

stock nember?Not in table!

15

16 【例3.2】建立学生名次表rank

以grade 为首地址的10个字的数组中保存了学生的成绩,其中grade+i 保存学号为i+1的学生的成绩。要求建立一个10个字的rank 数组,并根据grade 中的学生成绩将学生名次填入rank 数组中,其中rank+i 的内容是学号为i+1学生的名次(提示:一个学生的名次等于成绩高于该学生的人数加1)。

本题可以用两重循环结构来实现。内层对应于每个学生的名次计算,外层则解决所有学生的名次计算。由于数组的长度是确定的,因此内、外层均可用计数值来控制循环的结束。在设计多重循环结构时,必须注意内层循环结束后的重新初始化问题。现将寄存器的分配情况说明如下:

AX 存放当前被测学生的成绩;

BX 存放当前被测学生的相对地址指针; CX 内循环计数值;

DX 当前被测学生的名次计数值; SI 内循环测试时的地址指针;

DI 外循环计数值。

程序框图如图3.2所示。

[程序清单]:

datarea segment ; pdefine data segment grade dw 88, 75, 95, 63, 98

dw 78, 87, 73, 90, 60

rank dw 10 dup(?)

datarea ends

;---------------------------------------------------- prognam segment ; define code segment

;----------------------------------------------------- 图3.2 例3.2的程序框图

main proc far

; main part of program

assume cs: prognam , ds: datarea

start:

; Starting execution address, Set up stack

; for return

push ds

; Save old data segment

sub ax , ax ; put zero in AX

push ax ; save it on stack

; set DS register to current data's segment

mov ax , datarea

; datarea segment addr

mov ds , ax ; into DS register

; MAIN PART OF PROGRAM GOES HERE

mov di , 10

mov bx , 0

loop: mov ax , grade [bx]

mov dx , 0

mov cx , 10

lea si , grade

next: cmp ax , [si]

jg no_count

inc dx

no_count: add si , 2

loop next

mov rank [bx] , dx

add bx , 2

dec di

jne loop ; return to DOS

main endp ; end of main part of program ; -----------------------------------------------------------------------------------

17

prognam ends ; end of code segment

end start ; end assemly

使用debug或TD来查看程序的运行结果,可以看出主程序结束时,rank数组已存放了学生的名次。

2.实验题

【实验3.1】用表格形式显示ASCII字符。

实验要求:按15行×16列的表格形式显示ASCII码为10H - 100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。

提示:

(1) 显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下:

mov ah , 02h

mov dl , 输出字符的ASCII码

int 21h

本题中可把DI初始化为10H,然后不断使其加1(用INC指令) 以取得下一个字符时ASCII码。

(2) 显示空白符时,用其ASCII码0置入DI寄存器。每行结束时,用显示回车(ASCII 为0dh)和换行符(ASCII为0ah)来结束本行并开始下一行。

(3) 由于逐个显示相继的ASCII字符时,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用DI寄存器,为此可使用堆找来保存相继的ASCII字符。具体用法是:在显示空白或回车、换行符前用指令

push dx

把DI的内容保存到堆栈中去。在显示空白或回车、换行符后用指令

pop dx

恢复DI寄存器的原始内容。

【实验3.2】统计负数的个数

设数据段有8个有符号数:

18

NUM DB -19,+28,37,-46,+55,61,-74,+255

设计一个程序(不是两个程序)完成两项要求:

(1)统计并且显示负数的个数,存入N单元;找出真值最大的数,存入MAX单元。

(2)并以十六进制的形式,显示在屏幕上,显示格式为:

N=××H

MAX=××H

提示:

①正确的答案是有4个负数,如果你得到3个负数,肯定是错误的。

②最大的真值数应是3DH。

③为了理解汇编语言是怎样对数据进行汇编的,建议在对源程序进行汇编时,键入汇

编参数"/L",即键入:

TASM源文件名/L

键入汇编参数"/L"的目的,是在生成OBJ文件的同时,也生成LST文件。再用编辑文件显示LST文件的内容,就可以看到NUM单元的8个数经汇编后生成的机器数了。

【实验3.3】编程计算:S=1+2+3+…+N ≤100的最大项数N以及对应的和S。

实验要求:

①将最大项数与和数分别存入N和SUM单元,用TD调试,运行程序并检查结果;

②将结果在屏幕上以16进制数显示。显示格式:MAX N = ××H SUM = ××H。

19

实验四分支程序的设计

【实验目的】学习分支程序的结构,掌握具有分支结构程序的设计方法。

1.示例

【例4.1】统计学生成绩result。

设有10个学生的成绩分别为56、69、84、82、73、88、99、63、100和80分。试编制程序分别统计低于60分、60 ~ 69分、70 ~ 79分、80 ~ 89分、90 ~ 99分及100分的人数,并存放到s5、s6、s7、s8、s9及s10单元中。程序框图见图4.1,用debug (或TD)可检查程序运行结果。

[程序清单]:

; PROGRAM TITLE GOES

; HERE -- result

datarea segment

grade dw 56, 69, 84, 82

dw 73, 88, 99, 63

dw 100 ,80

s5 dw 0

s6 dw

图4.1 例4.1的程序框图

20

s7 dw 0

s8 dw 0

s9 dw 0

s10 dw 0

datarea ends

prognam segment

main proc far

assume cs: prognam,

ds: datarea

start:

push ds

sub ax ,ax

push ax

mov ax , datarea

mov ds , ax

; into DS register

; MAIN PART OF PROGRAM

; GOES HERE

mov s5 , 0

; initia1ize counter

mov s6 , 0

mov s7 , 0

mov s8 , 0

mov s9 , 0

mov s10 , 0

mov cx , 10

21

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

Top