4.试编程统计数据区中正数、零和负数的个数。 ①.程序算法流程图。
开始初始化数循环计数值i=0;O=0;Z=0;F=0是X[i]=0否否X[i]>0O++(0数加1)是F++(负数个数加1)Z++(正数个数加1)i=i+1否循环计数值=0?是结束 ②.源程序清单。
DATA SEGMENT
X DB 5,6,7,8,0,-1,-2,-3,-4;数据定义 Y DB 9;存放循环计数值 Z DB 0;存放正数个数 O DB 0;存放0个数 F DB 0;存放负数个数
MESSAGE1 DB 'positive number:$';输出正数个数提示符 MESSAGE2 DB 'negative number:$';输出负数个数提示符 MESSAGE3 DB 'zero number:$';输出数为0个数提示符 DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA
6
START:MOV AX,DATA
MOV DS,AX;段寄存器定义
LEA DI,X;将X数组放到DI寄存器 MOV CL,Y;初始化循环计数值 NEXT:
MOV AL,[DI];开始取数组里的值 CMP AL,0;与0比较
JE ZERO;等于0 则转ZERO JG ZHENG;大于0 则转ZHENG JMP FUSHU;小于0 则转FUSHU ZERO:
INC [O];0的个数加一 ADD DI,1;到数组下一个数 JMP LOOP_HERE ZHENG:
INC [Z];正数个数加一 ADD DI,1;到数组下一个数 JMP LOOP_HERE FUSHU:
INC [F];负数个数加一 ADD DI,1;到数组下一个数 LOOP_HERE:
LOOP NEXT;循环计数自动减一,循环计数不为0继续循环
MOV AH,9;输出正数个数 MOV DX,OFFSET MESSAGE1 INT 21H MOV DL,Z ADD DL,30H MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H
MOV AH,9;输出0个个数 MOV DX,OFFSET MESSAGE3 INT 21H MOV DL,O ADD DL,30H MOV AH,2 INT 21H MOV DL,0AH
7
MOV AH,2 INT 21H
MOV AH,9;输出负数个数 MOV DX,OFFSET MESSAGE2 INT 21H MOV DL,F ADD DL,30H MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H
MOV AH,4CH;退出 INT 21H CODE ENDS
END START ③.程序运行结果。
④.调试过程中遇到的问题和解决的方法。
对loop指令的跳转不熟悉,以至程序出错;一开始使用BX来缓存数据,但数组不跳转,使用DI指针寄存器来解决。
5. 编程求无符号数字节序列中最大值和最小值。 ①.程序算法流程图。
8
开始初始化数循环计数值i=0BL=X[i](最大值)DL=X[i](最小值)是X[i]>BL否BL=X[i]X[i]
DATA SEGMENT
X DB 5,6,7,8,0;数据定义 Y DB 5
MESSAGEMAX DB 'max number:$';输出最大值提示符 MESSAGEMIN DB 'min number:$';输出最小值提示符 DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA
MOV DS,AX ;段寄存器定义
LEA DI,X;将X数组放到DI寄存器
9
MOV CL,Y;初始化循环计数值 MOV BL,X[DI];初始化最大值 MOV DL,X[DI];初始化最小值 NEXT:
MOV AL,X[DI];取数组里的数 CMP AL,BL
JG MMAX;大于最大值 转MMAX CMP AL,DL
JL MMIX;小于最小值 转MMIX ADD DI,1;到数组下一个数 JMP LOOP_HERE MMIX:
MOV DL,AL;更新最小值 ADD DI,1;到数组下一个数 JMP LOOP_HERE MMAX:
MOV BL,AL;更新最大值 ADD DI,1;到数组下一个数 JMP LOOP_HERE LOOP_HERE:
LOOP NEXT;循环计数自动减一,循环计数不为0继续循环 MOV CL,DL;输出用到DL,将值存在CL里 MOV AH,9;输出最大值
MOV DX,OFFSET MESSAGEMAX INT 21H MOV DL,BL ADD DL,30H MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H
MOV AH,9;输出最小值
MOV DX,OFFSET MESSAGEMIN INT 21H MOV DL,CL ADD DL,30H MOV AH,2 INT 21H
MOV AH,4CH;退出 INT 21H CODE ENDS
END START ③.程序运行结果。
10