まず、5時間で答えを見つけようとしたと言いたかったのです。
アレイAとアレイBが設定されました。TEST1という名前のプロシージャは、値Vを取得し、その値が配列Bに存在するかどうかを返します。もしそうなら-インデックスをPに保存し、そうでなければ、-1をPに保存します(私はこれに対する答えを見つけましたが、次のセクションではそれを使用する必要があります)今難しい問題:次のセクションで彼らは私に使用してほしかったこの手順-TEST1は、配列aが配列bに同じ順序で存在するかどうかを確認します。
(配列aは配列bに連続して見つかります)
最後のセクションの私の考えは次のとおりです。
DBのサイズで3つの変数を定義します:Flag(0)、Count(0)、Check(0)。配列aの値を変数Vに渡します。プロシージャを「呼び出し」、変数Pが-1と異なるかどうかを確認するたびに、変数Flagは1ずつ増加します。
プログラムは、フラグが1に等しいかどうかをチェックします。等しい場合、フラグは1に減少し、カウントは1に増加します。プロシージャを呼び出した後、初めてフラグが0に等しくなると、カウントは変数Checkに保持されます。 。変数Countが0になる前に、プログラムは変数Checkと変数Countを比較します。変数チェックは変数カウントの最大値になり、変数カウントがリセットされます。これはすべて、約100回実行されるループになります。変数Checkが10に等しい場合、配列Aは同じ順序で配列Bに存在します。
注意:配列Bの長さは常に配列Aの長さよりも長いため、どちらが長いかを確認する必要はありません。
プログラムは、次のデータで開始する必要があります。
ARR_B DB 100 DUP()
ARR_A DB 10 DUP ()
V DB ?
P DB ?
このアイデアを実装しようとしても、それは機能しませんでした(実行しようとすると、無効なインデックスとメモリ不足のエラーメッセージが表示されます-エラーを修正しようとすると、プログラムは数字ですが、配列aが配列b)に存在する場合、マッサージを行う前にスタックします。
理解しにくい高度なコマンドではなく、jump、cmp、interruptsなどの基本的なコマンドを使用してください。この問題のより良い解決策はありますか?何?
私の解決策:(それでも機能しません)
Data Segment
ARR_B DB 100 DUP(?)
ARR_A DB 10 DUP(?)
V DB ? P DB ?
FLAG DB (0)
Message1 DB 'Array A found in array B','$'
Message2 DB 'Array A is not found in array B','$'
DATA ends
Code Segment Assume CS:CODE,DS:DATA
IntakeB PROC
MOV AH,1H
INT 21H
MOV ARR_B[SI],AL
INC SI
RET
endp
IntakeA PROC
MOV AH,1H
INT 21H
MOV ARR_A[SI],AL
INC SI
RET
endp
TEST1 PROC
MOV AH,1
NEG AH
MOV P,AH
SEARCH:
MOV DL,ARR_B[BX]
CMP V,DL
JE EQUAL
INC BX
LOOP SEARCH
JMP RETURN
EQUAL:
MOV P,BL
RETURN:
RET
endp
FIND PROC
SEARCH2:
CMP V,ARR_B[BX]
JE EQUAL2
RET
MOV FLAG,0
EQUAL2:
INC BX
INC FLAG
LOOP SEARCH2
endp
START:
MOV AX,DATA
MOV DS,AX
MOV SI,0H
MOV CX,100
ValuesB:
CALL IntakeB
LOOP ValuesB
MOV SI,0H
MOV CX,10
ValuesA:
CALL IntakeA
LOOP ValuesA
MOV BX,0H
MOV CX,100
MOV SI,0H
CHECK:
MOV V,ARR_A[SI]
CALL TEST1
MOV CH,-1
CMP P,CH
JNE FIRST
JMP FINISH
FIRST:
MOV AH,0
MOV CX,10
MOV BX,0H
MOV AL,P
MOV V,ARR_B[AX]
CALL FIND
MOV AH,0
CMP FLAG,AH
JE EQUAL5
MOV BL,0H
MOV AH,9H
MOV DX,OFFSET Message2
INT 21H
JMP FINISH
EQUAL5:
MOV BL,1H
MOV AH,9H
MOV DX,OFFSET Message1
INT 21H
FINISH:
MOV AX,4C00H
INT 21H
END START
CODE ENDS