0

まず、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 
4

0 に答える 0