ASM-使用过程查找阵列a是否存在于同一订单的数组b中

时间:2013-03-13 11:05:55

标签: assembly x86

首先,我想说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 

0 个答案:

没有答案