2011年微机原理课程上机实验指导书1 下载本文

内容发布更新时间 : 2024/5/1 18:10:17星期一 下面是文章的全部内容请认真阅读。

使用察看存储器数据段命令—D,观察存储器数据段内数值。

再使用连续执行命令—G,执行程序,检查结果是否正确,若不正确可使用DEBUG的设置断点,单步执行等功能发现错误所在并加以改正。

程序清单:

多字节非压缩型BCD数除法 (96875/5=19375) DATA SEGMENT

A DB 9,6,8,7,5 B DB 5

C DB 5DUP (0) N EQU 5 DATA ENDS CODE SEGMENT

ASSUME CS:CODE;DS:DATA;ES:DATA, START MOV AX,DATA MOV DS,AX MOV ES,AX CLD

LEA SI,A(地址传送指令) LEB DI,C MOV CX,N

MOV AH,0 LP1: LODSB(取字节串) AAD

DIV B

STOSB(存字节串) LOOP LP1 MOV CX,N LEA DI,C

LP2: MOV DL,[DI]

MOV AH,2 开始 INT 21H

DEC DI 设置被除数、商的地址指针 LOOP LP2 设置单位除法次数计数器 MOV AH,4CH

INT 21H 取被除数一位作十进制调整 CODE: ENDS

END START 作字节除法、存商

N 被除数各位已除完? Y 显示运算结果 (范例程序,缺注释——不低于50%) 需要逻辑流程图,右边!

11

结束 三。实验报告要求:

1)写出本次试验报告的实验目的,内容,正确的程序清单,适当的中文注释以及程序框图。

2)指出本实验给出的源程序错误,并加以改正。 3)给出实验结果。 4)调试的心得体会。

实验二 设计汇编语言程序

要设计汇编语言程序,我们先复习一些基本的指令。 1.加法指令

(1)ADD---加法指令

格式:ADD 目的操作数,源操作数

功能:目的操作数 目的操作数+源操作数 (2)ADC---带进位的加法指令 格式:ADC 目的操作数,源操作数

功能:目的操作数 目的操作数+源操作数+CF(CF=1,有进位) (3)INC---增量指令 格式:INC 目的操作数

功能:目的操作数 目的操作数+1 2.减法指令

(1)SUB——减法指令

格式:SUB 目的操作数,源操作数

功能:目的操作数 目的操作数-源操作数 (2)SBB——带借位的减法指令 格式:SBB 目的操作数,源操作数

功能:目的操作数 目的操作数-源操作数-CF (3)DEC——减量指令 格式:DEC 目的操作数

功能:目的操作数 目的操作数-1 (4)NEG 求补指令 格式:NEG 目的操作数

功能:目的操作数 0-目的操作数 3.乘法和除法指令

(1)MUL——无符号数乘法 格式:MUL 源操作数

功能:8位源操作数时:AX (AL)×源操作数

16位源操作数时:DX,AX (AX)×源操作数 32位源操作数时:EDX,EAX (EAX)×源操作数 (2)IMUL有符号数乘法 格式1: IMUL 源操作数

12

功能:8位源操作数时:AX (AL)×源操作数

16位源操作数时:DX,AX (AX)×源操作数 32位源操作数时:EDX,EAX (EAX)×源操作数 格式2: IMUL 目的操作数, 源操作数

功能:目的操作数 目的操作数×源操作数

格式3: IMUL 目的操作数,源操作数1,源操作数2 功能:目的操作数 源操作数1×源操作数2 (3)DIV ——无符号除法 格式:DIV 源操作数 功能:8位源操作数时:(AX)÷源操作数,AL 商,AH 余数 16位源操作数时:(DX,AX )÷源操作数,AX 商,DX 余数 32位源操作数时:(EDX,EAX)÷源操作数,EAX 商 ,EDX 余数 (4)IDIV——有符号除法 格式:IDIV 源操作数 功能:8位源操作数时:(AX)÷源操作数,AL 商,AH 余数 16位源操作数时:(DX,AX )÷源操作数,AX 商,DX 余数 32位源操作数时:(EDX,EAX)÷源操作数,EAX 商 ,EDX 余数

实验

2.1 简单程序设计

实验目的

理解各种指令的功能。 进一步学习程序的调试。

使用以上指令,我们可以进行一些表达式的计算。

练习1. 实验题目:编程计算下列表达式:A=90,B=-70,C=5,Y均为有符号数, 计算Y=2×(A+B)+(A×C)÷5

要编写一些稍微复杂的程序,我们会遇到一段程序被反复执行,这样,我们会用到LOOP指令。使用该指令时,需在CX中装入循环次数。

练习2.码转换程序设计

编制程序,把十进制数15786转化成二进制数。

提示:15786=1×10×10×10×10+5×103+7×102+8×10+6 循环CX=5

实验要求:1.绘出练习1和2的程序流程图。 2编写完整的程序,上机调试。

3使用DEBUG调试命令,查看中间结果,并查看最终结果。

大多数的程序,都有人机对话的过程。也就是说,我们从键盘上输入程序所需要的控制信息和数据,并把程序的运行结果和运行状态显示出来。这就涉及到字符及字符串的输入输出。

1. 字符的输出 (1)输出单个字符

DL 待输出字符的ASCII码

13

AH =02 INT 21H

输入的字符放在AL中,并显示在屏幕上。 (2)输出一个字符串

DS: DX 待输出字符串的首地址 AH=09H Int 21H

2.字符的输入 (1)输入单个字符 AH=01 INT 21H

输入的字符放在AL中 (2)AH=07 INT 21H

输入的字符放在AL中,不会显示在屏幕上(无回显)。 3.字符串的输入

DS:DX 输入缓冲区首地址 AH=0AH INT 21H

一行字符以回车键作为结束的标志。假如:一行最多不超过250个字符(不含回车键),输入缓冲区格式如下:BUFFER DB 250 ,? ,250 DUP(?)

缓冲区由3个部分组成:

第一字节 :输入字符存放区的大小。

第二字节:初始状态为空。从服务程序返回后,由服务程序填入实际的字符个数,不包括回车。

第三字节之后:输入字符存放区,存放输入的字符和回车。

练习3.编制程序,从键盘输入最多5个数,求他们的和,存入SUM。 实验要求:1.绘出程序流程图。

2编写完整的程序,上机调试。

3要求编制的程序最终求和的结果要显示在屏幕上。 4.写实验报告中程序要加中文注释。

实验2.2 汇编语言程序设计

---- 循环结构程序

几乎所有的应用程序都离不开循环结构。 循环结构一般有以下4个部分组成。

1初始化部分:为循环做准备,如累加器清零,设置地址指针和计数器的初始值。 2.工作部分:实现循环的基本操作,也就是需要重复执行的一段程序。 3.修改部分:修改指针,计数器的值,为下一个循环做准备。 4.控制部分:判断循环条件,结束循环或继续循环。

14

练习1.用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。

提示:用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。

对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。每一遍的排序由若干次邻元素的排序组成。

4遍排序中,邻元素的排序依次为4,3,2,1遍。完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。

外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DEC CX) 排序遍数 1 2 3 4 本遍排序前 第一次排序后 240,260 260,300 280,300 280,300 第二次排序后 240,260 260,300 280,300 第三次排序后 300,260 280,300 第四次排序后 260,300 300,250,280,250,300,280,250,280,300,250,280,240,250,280,240,240,260 260,300 280,300 280,300 250,280,240,250,280,240,250,240,280,250,240,260,250,240,260,250,240,260,240,250,260,240,250,260,240,250,260, 实验要求:1.编制程序,对这组数进行排序,并输出原数据及排序后数据;

2.利用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化;

3. 去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;

4. 用学过的压栈PUSH和出栈POP指令,将平均值按位逐个输出(即输出263);

5将平均值263转化为二进制串,并将这组二进制串输出。

6.所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi :

300等),所有数据结果能清晰地显示在屏幕上。

实验报告:

整理出运行正确的程序清单(加以注释)。并给出程序流程图。

15