首先,我想说的是,我花了 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