对以下数组 10,267,9,0,68,-516,3,85, 0FCH ,101,-32
1)计算数组中正数累加结果保存到变量 result 。
2)计算数组到负数为止的非负数累加结果保存到变量。
3)计算数组中零,正,负数,奇,偶数元素个数分别保存。
4)查找数组中最小元素,绝对值最大元素,排序数组。要求菜单提示选择,调试查看运行结果。
以下是简化段定义下的代码:
.MODEL SMALL
.STACK 4096
.DATA
ARRAY WORD 10,267,9,0,68,-516,3,85,0FCH,101,-32
CHANGELINE DB 13,10,'$'
MENU1 BYTE"Q1 Count the number of positive numbers;",0DH,0AH,'$'
MENU2 BYTE"Q2 Calculates the non-negative number of the array",0DH,0AH,'$'
MENU3 BYTE"Q3 Count the number of zeros, positive number, odd number and even number",0DH,0AH,'$'
MENU4 BYTE"Q4 Find the smallest element, the element with the largest absolute value",0DH,0AH,'$'
MENU5 BYTE"input number:",'$'
MENU6 BYTE"error! input number again:",'$'
RESULT WORD ?
MESS1 BYTE"ANSWER 1 IS: ",'$'
MESS2 BYTE"ANSWER 2 IS: ",'$'
MESS3 BYTE"ANSWER 3 ",0DH,0AH,'$'
MESS3_1 BYTE"ZERO: ",'$'
MESS3_2 BYTE"POSITIVE: ",'$'
MESS3_3 BYTE"NEGATIVE: ",'$'
MESS3_4 BYTE"ODD: ",'$'
MESS3_5 BYTE"EVEN: ",'$'
MESS4 BYTE"ANSWER 4 ",0DH,0AH,'$'
MESS4_1 BYTE"MIN number :",'$'
MESS4_2 BYTE"(absolute value) MAX number :",'$'
.CODE
MAIN PROC FAR
MOV AX,@DATA
MOV DS,AX
M:
CALL MENU
CP: CMP BL,1
MOV DX,OFFSET CHANGELINE
MOV AH,09H;输出换行
INT 21H
JE T1
CMP BL,2
JE T2
CMP BL,3
JE T3
CMP BL,4
JE T4
MOV DX,OFFSET MENU6
MOV AH,9H
INT 21H
MOV DX,OFFSET CHANGELINE
MOV AH,09H;输出换行
INT 21H
MOV DX,OFFSET CHANGELINE
MOV AH,09H;输出换行
INT 21H
JMP M
T1: CALL RESULT1
JMP M
T2:CALL RESULT2
JMP M
T3:CALL RESULT3
JMP M
T4:CALL RESULT4
JMP M
MOV AX,4C00H
INT 21H
MAIN ENDP
MENU PROC NEAR
MOV DX,OFFSET MENU1
MOV AH,9H
INT 21H
MOV DX,0
MOV DX,OFFSET MENU2
MOV AH,9H
INT 21H
MOV DX,OFFSET MENU3
MOV AH,9H
INT 21H
MOV DX,OFFSET MENU4
MOV AH,9H
INT 21H
MOV DX,OFFSET MENU5
MOV AH,9H
INT 21H
MOV AH,01H;键盘输入并回显,存在AL
INT 21H
MOV BL,AL
SUB BL,30H
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
RET
MENU ENDP
RESULT1 PROC NEAR
MOV CX,LENGTHOF ARRAY;保存数据个数
MOV SI,OFFSET ARRAY;分离出偏移地址
MOV AX,0
MOV DX,0
L1: MOV DX,[SI]
CMP DX,0
JL FU;小于则跳
ADD AX,[SI];正数则加
FU: ADD SI, TYPE ARRAY;下一个数据
LOOP L1
MOV RESULT,AX;保存到result
MOV DX,OFFSET MESS1
MOV AH,9H
INT 21H
MOV AX,RESULT
CALL PRINT
MOV DX,OFFSET CHANGELINE
MOV AH,09H;输出换行
INT 21H
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
RET
RESULT1 ENDP
PRINT PROC NEAR ; 输出带符号的ax
PUSH AX
TEST AX,8000H
JNS P1;sf不为1跳转,即无符号
PUSH AX
PUSH DX;保存现场
MOV AH,2
MOV DL,'-'
INT 21H
POP DX
POP AX
NEG AX;求补
P1:
CALL PRINT2
POP AX
RET
PRINT ENDP
PRINT2 PROC NEAR; 输出无符号的ax
PUSH AX;保存现场
PUSH BX
PUSH CX
PUSH DX
PUSHF;保存标志位
XOR CX,CX;zf=1
MOV BX,10
P1:;存余数
XOR DX,DX;zf=1
DIV BX
INC CX
ADD DX,30H
PUSH DX ;保存DX入栈,后续
CMP AX,0
JNE P1;不等于零则跳转
MOV AH,2
P2:;输出栈内所存数字
POP DX
INT 21H
LOOP P2
;MOV DL,32
;INT 21H
POPF
POP DX
POP CX
POP BX
POP AX
RET
PRINT2 ENDP
RESULT2 PROC NEAR
MOV CX,LENGTHOF ARRAY;保存数据个数
MOV SI,OFFSET ARRAY;分离出偏移地址
MOV DX,0
MOV AX,0
MOV BX,0
NEXT:
TEST WORD PTR[SI],8000H;正负,最高位是0还是1,0为正,1为负
PUSHF
ADD AX,[SI]
ADD SI, TYPE ARRAY
POPF
LOOPZ NEXT
JZ L;找到负数
L: SUB SI,TYPE ARRAY
SUB AX,[SI];减回一个
MOV BX,AX
MOV DX,OFFSET MESS2
MOV AH,9H
INT 21H
MOV AX,BX
CALL PRINT
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
RET
RESULT2 ENDP
RESULT3 PROC NEAR;0计数
MOV CX,LENGTHOF ARRAY;保存数据个数
MOV SI,OFFSET ARRAY;分离出偏移地址
MOV AX,0
MOV DX,0
NEXT1:;统计0
MOV AX,[SI]
CMP AX,0
JE L1
JMP L2
L1: INC DL
L2: ADD SI,TYPE ARRAY;下一个元素
LOOP NEXT1
MOV BL,DL
MOV DX,OFFSET MESS3
MOV AH,9H
INT 21H
MOV DX,OFFSET MESS3_1
MOV AH,9H
INT 21H
MOV DL,BL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
MOV CX,LENGTHOF ARRAY;保存数据个数
MOV SI,OFFSET ARRAY;分离出偏移地址
MOV AX,0
MOV DX,0
MOV BX,0
NEXT2:;统计正负
MOV AX,[SI]
CMP AX,0
JG L21
CMP AX,0
JL L22
JMP D
L21: INC DL;正数
JMP D
L22: INC DH;负数
D: ADD SI,TYPE ARRAY
LOOP NEXT2
MOV BX,DX
MOV DX,OFFSET MESS3_2
MOV AH,9H
INT 21H
MOV DL,BL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
MOV DX,OFFSET MESS3_3
MOV AH,9H
INT 21H
MOV DL,BH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
MOV CX,LENGTHOF ARRAY;保存数据个数
MOV SI,OFFSET ARRAY;分离出偏移地址
MOV AX,0
MOV DX,0
NEXT3:;统计奇偶
TEST WORD PTR[SI],1
JNZ L31;奇数跳
INC DL;
JMP L32;偶数跳
L31:INC DH
L32:ADD SI,TYPE ARRAY
LOOP NEXT3
MOV BX,DX
MOV DX,OFFSET MESS3_4
MOV AH,9H
INT 21H
MOV DL,BH
ADD DL,30H
MOV AH,2H
INT 21H
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
MOV DX,OFFSET MESS3_5
MOV AH,9H
INT 21H
MOV DL,BL
ADD DL,30H
MOV AH,2H
INT 21H
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
RET
RESULT3 ENDP
RESULT4 PROC NEAR
;冒泡排序
MOV CX,LENGTHOF ARRAY;保存数据个数
DEC CX
L1:
MOV DI,CX
MOV BX,0
L2:
MOV AX,ARRAY[BX]
CMP AX,ARRAY[BX+2]
JLE L3;小于等于
XCHG AX,ARRAY[BX+2]
MOV ARRAY[BX],AX
L3:
ADD BX,2
LOOP L2
MOV CX,DI
LOOP L1
MOV SI,OFFSET ARRAY
MOV CX,LENGTHOF ARRAY
DEC CX
MOV BX,0
MOV AX,[SI]
MOV BX,AX
MOV DX,OFFSET MESS4
MOV AH,9H
INT 21H
MOV DX,OFFSET MESS4_1
MOV AH,9H
INT 21H
MOV AX,BX
CALL PRINT
NEG AX
NEXT:
ADD SI,2
MOV CX,LENGTHOF ARRAY
DEC CX
CMP AX,[SI]
JL L4
MOV BX,0
JMP L5
L4:
ADD BX,2;
LOOP L4
L5:
MOV SI,OFFSET ARRAY
ADD SI,BX
MOV AX,[SI]
CMP AX,0
JL AB
JMP CON
AB: NEG AX; 绝对值
CON:MOV BX,AX
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
MOV DX,OFFSET MESS4_2
MOV AH,9H
INT 21H
MOV AX,BX
CALL PRINT
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
MOV DX,OFFSET CHANGELINE
MOV AH,09H
INT 21H;输出换行
RET
RESULT4 ENDP
END
欢迎批评指正