;求出首地址为DATA的字数组中的最小偶数,并将它放在AX中
DATAS SEGMENT
DATA DW 1 DUP(1,1,1,1,1,2) ;随便设置的数据,可换为其他数据
COUNT DW ($-DATA)/2 ;COUNT保存数组的字个数,数据全部为正时,有偶数时程序正常显示最小偶数
NOEN DB "NO EVEN NUMBERS!",'$' ;当出现负偶数时,程序将负偶数放在AX中,但不
SUCCESS DB "MIN EVEN MATCH!",'$' ;能正确显示负偶数,因为负偶数没有对应的ASCII码
CRLF DB 0AH,0DH,'$' ;换行
DATAS ENDS
STACK SEGMENT PARA STACK
DW 128 DUP(?)
TOP LABEL WORD
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATAS
MAIN PROC FAR
START:MOV AX,DATAS
MOV DS,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
LEA SI,DATA
SUB SI,2
MOV CX,COUNT
MOV AX,1 ;当作标记,用于判断是否找到第一个偶数
MOV BX,1 ;当作标记,用于判断是否找到第二个偶数
L1: CMP CX,0 ;遍历数组后则跳转到是否找到偶数的判断
JZ L5
ADD SI,2
MOV DX,[SI]
DEC CX
TEST DL,01H ;判断是否为偶数,最后一位为1时不是偶数,否则为偶数
JNZ L1
MOV AX,DX ;将第一个偶数放在AX当中
L3: CMP CX,0 ;寻找第二个偶数
JZ L5
ADD SI,2
DEC CX
MOV DX,[SI]
TEST DL,01H
JNZ L3
MOV BX,DX ;将第二个偶数放在BX当中
JMP L7 ;比较两个偶数大小,AX大则需交换,AX始终存放最小偶数
L5: CMP AX,1
JZ L6 ;如AX=1,则证明数组中没有偶数
CMP BX,1 ;若执行到此步骤,则证明至少数组存在一个最小偶数,且已在AX中
JZ L9
JMP L9
L6: MOV AH,9
LEA DX,NOEN ;显示没有偶数的提示信息
INT 21H
JMP L2
L7: CMP AX,BX
JG L8
JMP L3
L8: MOV AX,BX
JMP L3
L9: MOV DL,AL ;显示最小正偶数,负偶数不能显示
ADD DL,30H ;而是显示了0对应ASCII码前面的字符
MOV AH,2
INT 21H
MOV AH,9
LEA DX,CRLF ;换行
INT 21H
MOV AH,9
LEA DX,SUCCESS ;显示找到偶数的提示信息
INT 21H
JMP L2
L2: MOV AH,4CH
INT 21H
CODE ENDS
MAIN ENDP
END START
DATAS SEGMENT
DATA DW 1 DUP(1,1,1,1,1,2) ;随便设置的数据,可换为其他数据
COUNT DW ($-DATA)/2 ;COUNT保存数组的字个数,数据全部为正时,有偶数时程序正常显示最小偶数
NOEN DB "NO EVEN NUMBERS!",'$' ;当出现负偶数时,程序将负偶数放在AX中,但不
SUCCESS DB "MIN EVEN MATCH!",'$' ;能正确显示负偶数,因为负偶数没有对应的ASCII码
CRLF DB 0AH,0DH,'$' ;换行
DATAS ENDS
STACK SEGMENT PARA STACK
DW 128 DUP(?)
TOP LABEL WORD
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATAS
MAIN PROC FAR
START:MOV AX,DATAS
MOV DS,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
LEA SI,DATA
SUB SI,2
MOV CX,COUNT
MOV AX,1 ;当作标记,用于判断是否找到第一个偶数
MOV BX,1 ;当作标记,用于判断是否找到第二个偶数
L1: CMP CX,0 ;遍历数组后则跳转到是否找到偶数的判断
JZ L5
ADD SI,2
MOV DX,[SI]
DEC CX
TEST DL,01H ;判断是否为偶数,最后一位为1时不是偶数,否则为偶数
JNZ L1
MOV AX,DX ;将第一个偶数放在AX当中
L3: CMP CX,0 ;寻找第二个偶数
JZ L5
ADD SI,2
DEC CX
MOV DX,[SI]
TEST DL,01H
JNZ L3
MOV BX,DX ;将第二个偶数放在BX当中
JMP L7 ;比较两个偶数大小,AX大则需交换,AX始终存放最小偶数
L5: CMP AX,1
JZ L6 ;如AX=1,则证明数组中没有偶数
CMP BX,1 ;若执行到此步骤,则证明至少数组存在一个最小偶数,且已在AX中
JZ L9
JMP L9
L6: MOV AH,9
LEA DX,NOEN ;显示没有偶数的提示信息
INT 21H
JMP L2
L7: CMP AX,BX
JG L8
JMP L3
L8: MOV AX,BX
JMP L3
L9: MOV DL,AL ;显示最小正偶数,负偶数不能显示
ADD DL,30H ;而是显示了0对应ASCII码前面的字符
MOV AH,2
INT 21H
MOV AH,9
LEA DX,CRLF ;换行
INT 21H
MOV AH,9
LEA DX,SUCCESS ;显示找到偶数的提示信息
INT 21H
JMP L2
L2: MOV AH,4CH
INT 21H
CODE ENDS
MAIN ENDP
END START