求出首地址爲DATA的字數組中的最小偶數,並將它放在AX中

;求出首地址爲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
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章