4、求数的平方根
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的常用子程序。 源程序为:
11
DATA SEGMENT
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
12
SHL AL, 01H JNZ X1 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] ?
13
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]
14
CMP AL, MINVAL JE NEXT JG A1
MOV MINVAL, AL JMP NEXT
A1: CMP AL, MAXVAL JL NEXT
MOV MAXVAL, AL NEXT: INC BX DEC CX JNE AGAIN RETF START ENDP CODE ENDS
END START
2)实验步骤
(1)用编辑程序建立源程序文件,文件名自定。
(2)用MASM宏汇编程序和LINK连接程序将源程序文件汇编生成以EXE为扩展名的执行文件。 (3)用DEBUG调试程序将由上产生的EXE可执行文件送入内存,先用反汇编命令检查程序内容和首末地址,然后检查以BUFFER为首址的存储单元中数据块和MINVAL、MAXVAL单元的内容。BUFFER 地址单元的段地址和偏移地址是由系统在汇编和连接时指定的。各个不同的系统都不一样,一般来说,偏移地址为零,段地址可在反汇编程序时,根据指令MOV AX, DATA 对应机器码中DATA的值来确定。
(4)在DEBUG下运行程序,检查运行结果。
(5)修改源程序中BUFFER数据区的各数据,重新汇编后再运行,检查结果。
3、从无序数列中删除一个元素
1)实验内容
在BUFFER为首址的内存区中存放了一个无序字符串,其长度存放在第一个字节单元,在KEY单元内存放了要删除的一个字符,查找此无序字串,若找到则删除并作相应调整,若字串中无此字符则在FLAG单元内置FFH标志。其程序流程图如下。
2)实验步骤
(1)按以上框图编写程序,并任意设定字符个数和字符串。 (2)输入汇编语言源程序,文件名自定。
(3)用MASM和LINK程序汇编和连接生成EXE执行程序。 (4)运行该程序,并检查结果。
(5)修改字符串及其个数,再运行程序,验证程序的正确性。
15