-
实验目的
1.能够认知循环指令和循环结构。
2.能够设计循环程序,并运行调试。
3.培养严谨、求真的科学作风。
-
实验内容
-
计算 S=1+2×3+3×4+4×5+…+N(N+1),直到 N(N+1)项大于 200 为止。编写实验程序,计算上式的结果。
-
求某数据区内负数的个数设数据区的第一单元存放区内单元数据的个数,从第二单元开始存放数据,在区内最后一个单元存放结果。为统计数据区内负数的个数,需要逐个判断区内的每一个数据,然后将所有数据中凡是符号位为 1 的数据的个数累加起来,即得到区内所包含负数的个数。
-
实验步骤
-
1.(1)根据实验内容1画出流程图,如下图所示:
-
-
(2)根据流程图编写实验程序,编译、链接无误后装入系统。 (3)运行程序,待程序运行停止。(4)运算结果存储在寄存器 DX 中,查看结果是否正确。(5)可以改变 N(N+1)的 条件来验证程序功能是否正确,但要注意,结果若大于 0FFFFH 将产生数据溢出。
-
2.(1)根据实验内容2画出流程图,如下图所示:
-
-
(2)按实验流程编写实验程序。(3)编译、链接无误后装入系统。(4)键入 E3000,输入数据如下:3000=06(数据个数);3001=12;3002=88;3003=82;3004=90;3005=22;3006=33。(5)先运行程序,待程序运行停止。(6)查看 3007 内存单元或寄存器 BL 中的内容,结果应为 03。 (7)可以进行反复测试来验证程序的正确性。
-
实验程序
-
;任务1程序: SSTACK SEGMENT STACK DW 64 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:SSTACK START: MOV DX,0001H MOV BX,0002H A1: MOV AL,BL INC BL MUL BL ADD DX,AX CMP AX,00C8H JNA A1 MOV AX,4C00H INT 21H CODE ENDS END START
;任务2程序: SSTACK SEGMENT STACK DW 64 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:SSTACK START:XOR AX,AX MOV DI,3000H ;数据区首地址 MOV CL,[DI] ;数据个数 MOV CH,00H ;CH置0 MOV BL,00H ;BL置0 INC DI ;DI增1 A1: MOV AL,[DI] TEST AL,80H ;数据首位=1? JZ A2 INC BL A2: INC DI LOOP A1 MOV [DI],BL ;保存结果 MOV AX,4C00H INT 21H CODE ENDS END START
-
实验结果
-
1.(4)运算结果存储在寄存器 DX 中,查看结果是否正确。
由程序运行结果可知,DX的结果为045FH,转化为十进制为1119,根据数学知识,当N(N+1)不大于200,此时N =BL-2,此时S=1+2×3+3×4+4×5+…+13×14+14×15=1119,验证结果正确。
-
1.(5)可以改变 N(N+1)的条件来验证程序功能是否正确,但要注意,结果若大于 0FFFFH 将产生数据溢出。
使N(N+1)不大于0C78H,此时N=BL-2=56,56×57=0C78H,根据S=1+2×3+3×4+4×5+…+N(N+1)=,
-
与程序运行结果中DX一致,所以程序功能正确。
-
2(6)查看 3007 内存单元或寄存器 BL 中的内容,结果应为 03。
程序运行结果BX为CC03H,即BL为03,根据二进制有符号数的表示方法可知负数分别为88,82,90。结果正确。
思考题
1.分析 N(N+1)累加程序中,N 能取的最大值是多少?
DX结果若大于 0FFFFH 将产生数据溢出。所以让DX最高位无进位即可,程序见上实验程序——思考题1程序,实验结果如下图,N的最大值=BL-2-1=3BH-2-1= 56。当N=56时,DX=FDF9H,CF=0; 当N=57时,DX=0B57H,CF=1,溢出。所以N的最大值是56。
;思考题1程序:
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:SSTACK
START: MOV DX,0001H
MOV BX,0002H
A1: MOV AL,BL
INC BL
MUL BL
ADD DX,AX
JNC A1
MOV AX,4C00H
INT 21H
CODE ENDS
END START
2. 求某数据区内负数个数程序中,如果同时要统计正数和零的个数,程序应如何修改,试编程验证
数据区除了负数就是正数和零,所以可以在判断负数的步骤加个储存正数和零的分支程序,流程图如下,程序见四实验程序——思考题2程序,
;思考题2程序:
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:SSTACK
START: XOR AX,AX
XOR SI,AX ;SI置0
XOR BH,BH
MOV DI,3000H ;数据区首地址
MOV CL,[DI] ;数据个数
MOV CH,00H ;CH置0
MOV BL,00H ;BL置0
INC DI ;DI增1
A1:
MOV AL,[DI]
TEST AL,80H ;数据首位=1?
JZ A2
INC BL
JMP A4
A2: CMP AL,00H
JZ A3
INC SI
JMP A4
A3: INC BH
A4: INC DI
LOOP A1
MOV [DI],BL ;保存结果
MOV [DI],SI
MOV [DI],BH
MOV AX,4C00H
INT 21H
CODE ENDS
END START
实验结果如下图,SI为0003H,BH 为00H,BL为03H,所以正数的个数为3,零的个数为0,负数个数为3.
-
实验心得
通过本次循环程序设计实验中,在进行程序编写之前一定要先画流程图,根据流程图进行程序编写可以更好梳理编码逻辑和找出错误,寄存器储存结果若大于 0FFFFH 将产生数据溢出。循环程序设计有3个组成部分(1)循环初始部分——为循环的开始准备必要的条件,如循环次数、循环体需要的数值等(2)循环体部分——也就是重复执行的代码,其中要包括对循环条件等的修改程序段(3)循环控制部分——判断循环条件是否成立,才决定是否循环。
标签:CODE,DI,BL,程序,MOV,微机,循环,SSTACK,程序设计 From: https://blog.csdn.net/qq_62665087/article/details/140755158