源数 据块
目的数 据块
源 数 据 块 数 据 块
目的
2)实验步骤
(1)编写程序。
(2)在DEBUG下键入程序并检查(程序可存放于2000H-8000H单元)。
(3)确定源数据块和目的数据块区不重叠时的首址,确定数据块个数为16个。并在源数据区送入任意16个数据。
(4)运行程序后,检查目的数据区的内容。
(5)确定源数据块和目的数据块区重叠时, 源区首址>目的区首址时的首址, 以及数据块个数为16个,并在源数据区送入任意16个数据。运行程序后,检查目的数据区的内容。
(6)确定源数据块和目的数据块区重叠时, 源区首址<目的区首址时的首址, 以及数据块个数为16个,并在源数据区送入任意16个数据。运行程序后,检查目的数据区的内容。
3、无序数据块的递增排序
1)程序设计思想和要求
在首址为3000H 的数据区中存放着一组无符号数, 数据的长度存于3500H单元内,要求用冒泡法对该区中的数据按递增次序排列。
冒泡法的基本思想是从最后一个数(或从第一个数)开始,依次把相邻两个数比较,即第N个数与第N-1个数比较?,若大则交换,否则不交换,直到N个数都比较完为止。此时,其中最小数排在最前列。然后将剩下的N-1个数再按前述方法进行,找到N-1个数中最小的数。以后重复进行,直到全部按序排列。 2)实验步骤
(1)编写程序。
(2)在DEBUG下键入程序并检查(程序可存放于2000H-8000H单元,只要不与数据区重叠即可)。
(3)确定数据个数并输入3500H单元中,在首址为3500H的数据区中存入任意无符号数。 (4)运行程序并检查运行结果。
(6)反复修改数据个数和数据区中的数,运行程序、观察结果,验证程序的正确性。
4、求数的平方根
11
1)程序设计思想和要求
减奇数法是一种求取近似平方根和平方根的整数部分的方法。有公式:
n
2
?(2K-1)=N
k=1
若要求数S的平方根?S, 则可以从S中减去奇数1、3、5?直到减为零或不够减下一个奇数为止,然后统计减去的奇数个数,它就是S的近似平方根。
被开方数为一个足够大的二进制数, 存于首址为4000H的单元内,它的方根存放在以4500H为首的单元内。
2)实验步骤
(1)编写程序。
(2)在DEBUG下输入程序并检查(程序可存放于2000H-8000H单元,和数据存放单元不要重叠)。
(3)在4000H为首的单元中存入一个任意大的数。 (4)运行程序并检查运行结果。
(6)反复修改被开方数,运行程序、观察结果,验证程序的正确性。
5、思考题
① 如果二进制加数和被加数不限于四字节而为任意字节时,程序应作如何改动? ② 修改原有的无符号数的排序程序为带符号数的排序程序。
③ 被开方数是一压缩型的BCD码十进制数时,程序应作如何修改?
(二)MASM汇编程序和LINK连接程序的使用操作
在DEBUG中,使用A命令建立程序,一般不能使用标号和伪指令,并不能保存汇编语言源程序,适用于简单程序。MASM宏汇编程序可以将编辑程序建立的源程序文件进行汇编,汇编后在盘上建立目标文件、列表文件和交叉参考文件。而目标文件经LINK程序连接以后成为可执行的文件,它可以在DOS下执行也可在DEBUG下调试。
1、计算机钢琴程序
1)实验内容
根据乐曲中不同的音符是由输出不同频率的声波而产生的原理,通过设置PC机中 8253定时器不同的计数值,可由扬声器发出不同的曲调。 以下是实现PC机作为一架可弹奏的钢琴演奏预定的曲调。程序中采用了INT 21H软中断调用了DOS的常用子程序。 源程序为:
DATA SEGMENT
12
MESS DB ‘Push any key to stop!’,0dH,0aH,’$’ TABLE DW 524,588,660,698,784,880,988,1048,1176,1320,0
TABLEL DB 31H,31H,32H,31H,34H,33H,3BH DB 31H,31H,32H,31H,35H,34H,3BH DB 31H,31H,38H,36H,34H,33H,32H,3BH DB 36H,36H,36H,34H,35H,34H,3BH,0AAH DATA ENDS
STACK SEGMENT PARA STACK ‘STACK’ STA DB 256 DUP(?) STACK ENDS CODE SEGMENT
ASSUME CS: CODE, DS: DATA, SS: STACK, ES: DATA
START PROC FAR DIV WORD PTR [TABLE+BX] PUSH DS MOV BX, AX XOR AX, AX MOV AL, 10110110B PUSH AX OUT 43H, AL MOV AX, DATA MOV AX, BX MOV DS, AX OUT 42H, AL MOV ES, AX MOV AL, AH MOV AH, 09H OUT 42H, AL LEA DX, MESS IN AL, 61H INT 21H OR AL, 03H KK: LEA SI, TABLEL OUT 61H, AL CALL DELAY IN AL, 61H AND AL, 0FCH OUT 61H, AL QQ: INC SI SING: MOV AH, 06H JMP SING MOV DL, 0FFH FINISH: RET
INT 21H START ENDP JNE FINISH
MOV AL, [SI] DELAY PROC NEAR ; 延时子程序 CMP AL, 3BH PUSH CX JNE DDD PUSH AX
CALL DELAY MOV AX, 500H ; 大循环次数 JMP QQ X1: MOV CX, 0FFFFH ; 小循环次数 DDD: CMP AL, 0AAH X2: DEC CX JE KK JNZ X2 SUB AL, 31H DEC AX SHL AL, 01H JNZ X1
13
MOV BL, AL POP AX MOV AX, 0000H POP CX MOV DX, 12H RET
MOV BH, 00H DELAY ENDP CODE ENDS END START
2)实验步骤 (1)利用EDIT 全屏幕编辑程序或TURBO PASCAL中的编辑功能或任何一款文本编辑程序输入以上程序,以文件名为 PLAYPIA..ASM存盘。 (2)在DOS系统下执行子目录MASM中的执行文件MASM.EXE ,用宏汇编程序将PLAYPIA.ASM.汇编成目标文件PLAYPIA.OBJ。操作过程如下:
显示 键入
C:\\MASM> MASM ? MICROSOFT(R) ???? COPYRIGHT(C)?????
SOURCE FILENAME [.ASM] PLAYPIA ? OBJECT FILENAME [PLAYPIA.OBJ] SOURCE LISTING[NUL.LST] PLAYPIA ?
CROSS-REFERENCE[NUL.CRF]
WARNIING ERRORS 0 SEVERE ERRORS 0
如ERRORS 均为0 表示汇编正确,如不为0,则必须在编辑状态下重新修改源程序。
(3)运行子目录DOS下LINK执行文件将目标文件PLAYPIA.OBJ连接成为可执行的文件PLAYPIA.EXE。操作如下:
显示 键入
C:\\ LINK ? MICROSOFT(R)?????????? COPYRIGHT(C)??????????
OBJECT MODULES[.OBJ]: PLAYPIA ? RUN FILE[PLAYPIA.EXE] ?
14
LIST FILE[NUL.MAP] PLAYPIA ? LIBRARIES[.LIB] ?
C:\\
(4)在DOS下直接键入由MASM宏汇编和LINK连接程序生成的可执行文件文件名PLAYPIA,运行程序观察运行结果。
(6) 修改程序中延时子程序的循环次数,重新汇编、连接后运行。
2、求数据块的最小值和最大值
1)实验内容
在以BUFFER为首址的内存中存放了若干个带符号数, 其个数存放在首单元,寻找出它们最大值放到存储单元MAXVAL中, 最小值放到存储单元MINVAL中。汇编语言源程序如下: DATA SEGMENT
BUFFER DB 10,22,33,-80,127,-76,0,90,-45,60,-1 MINVAL DB ? MAXVAL DB ?
DATA ENDS
STACK SEGMENT PARA STACK ‘STACK’ STA DB 100 DUP(?) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START PROC FAR PUBH DS MOV AX, 0 PUSH AX
MOV AX, DATA MOV DS, AX MOV ES, AX
LEA BX, BUFFER MOV CH, 0 MOV CL, [BX] INC BX
MOV AL, [BX] MOV MINVAL, AL MOV MAXVAL, AL INC BX DEC CX
AGAIN: MOV AL, [BX]
15