0

首先,我想说的是,我花了 5 个小时试图找到答案。

设置了数组 A 和数组 B。一个名为 TEST1 的过程将获得一个值 V 并返回该值是否存在于数组 B 中。如果它确实将索引存储在 P 中,如果没有,则将 -1 存储在 P 中。(我找到了答案,但在下一节中你必须使用它)现在的难题:在下一节中,他们希望我使用此过程-TEST1 查找数组 a 是否以相同的顺序存在于数组 b 中。

(数组 a 将在数组 b 中连续找到)

我对最后一部分的想法是:

我们将定义 3 个 DB 大小的变量:Flag (0),Count(0),Check(0)。我们将数组 a 中的值传递给变量 V。每次我们将“调用”过程并检查变量 P 是否不同于 -1,如果是,变量 Flag 将增加 1。

程序会检查 Flag 是否等于 1,如果是,flag 会减 1,count 会增加 1。调用程序后第一次 flag 会等于 0,Count 会保存在变量 Check 中. 每次变量 Count 变为等于 0 之前,程序都会比较变量 Check 和变量 Count。变量 Check 必须为变量 Count 的最大值,然后变量 Count 将被重置。所有这些都将在一个循环中运行大约 100 次。如果变量 Check 等于 10,则数组 A 以相同的顺序存在于数组 B 中。

请记住:数组 B 的长度始终高于数组 A 的长度,因此无需检查哪个长度更大。

该程序应从以下数据开始:

ARR_B DB 100 DUP() 

ARR_A DB 10 DUP () 

V DB ? 

P DB ? 

无论我多么努力地尝试实现这个想法,它仍然不起作用(当我尝试运行它时,它会给出一个无效索引和内存不足的错误消息 - 当我尝试修复程序允许进入的错误时数字,但如果数组 a 存在于数组 b) 中,它会在给出按摩之前卡住。

请使用跳转、cmp、中断等基本命令,不要使用不难理解的高级命令。这个问题有更好的解决方案吗?什么?

我的解决方案:(仍然不起作用)

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