首先,我想说5个小时后我试图找到答案。
设置了阵列A和阵列B.名为TEST1的过程将获得值V,如果值Bs中存在值,则返回。 如果确实存在 - 将索引存储在P中,如果不存在,则将-1存储在P.(我找到了答案,但是对于以下部分,您必须使用它) 现在是一个难题:在接下来的部分中,他们希望我使用这个过程-TEST1来查找数组b是否存在于同一订单的数组b中。
(数组a将在数组b中连续找到)
我对上一节的想法是:
我们将定义DB大小的3个变量:Flag(0),Count(0),Check(0)。 我们将数组a中的值传递给变量V. 我们每次都会打电话给#34;程序并检查变量P是否不同于-1 如果是,变量Flag将在1中增加。
程序将检查Flag是否等于1, 如果是这样,旗帜将减少1,计数将增加1。 在调用过程后第一次该标志等于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