使用察看存储器数据段命令—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