我正在尝试在 8086 masm 的数组中实现二进制搜索,但是我收到类似 "phase errors between passes" 的错误



这是我的asm代码。 我还在语句中收到错误"不正确的操作数类型" CMP [SI+CI],SEARCH

.MODEL SMALL
.STACK 100H
.DATA
        MATR1 DW 0001H,0002H,0003H,0004H,0005H,0006H,0007H,0008H,0009H,000AH
        SEARCH DW 0003H
        LOWER DW 0000H
        HIGHER DW 000AH
        MID DW 0000H
        TEMP DW 0000H
    CI DW 0000H
        MSG1 DB 'NUMBER FOUND','$'
        MSG2 DB 'NUMBER NOT FOUND','$'
.CODE
MAIN PROC FAR
        MOV AX,@DATA
        MOV DS,AX
        MOV BX,0002H
        LEA DI,MATR1
        LEA SI,MATR1+0014H
NEXT:   MOV AX,LOWER
        MOV DX,HIGHER
        CMP AX,DX
        JGE TERM2
        MOV AX,0
        MOV DX,0
        MOV AX,LOWER
        ADD AX,HIGHER
        DIV BX
        MOV SI,0000H
        MOV SI,AX
        ;MOV AL,SEARCH
    MOV CI,AX
    MUL BX
    MOV CX,AX
    MOV AX,CI
    MOV CI,CX
        CMP [SI+CI],SEARCH
        JGE AGAIN
        MOV HIGHER,AX
        JMP NEXT
AGAIN:  MOV SI,0000H
        MOV SI,AX
        MOV DX,AX
    MOV CI,AX
    MUL BX
    MOV CX,AX
    MOV AX,CI
    MOV CI,CX
    MOV AX,0
        CMP [SI+CI],SEARCH
        JE TERM
        MOV LOWER,DX
        JMP NEXT
TERM:   LEA DX,MSG1
        MOV AH,09H
        INT 21H
        MOV AH,4CH
        INT 21H
TERM2:  LEA DX,MSG2
        MOV AH,09H
        INT 21H
        MOV AH,4CH
        INT 21H
MAIN ENDP
END

您的CI是内存中的值,SEARCH也是如此。因此,CMP [SI+CI],SEARCH被赋予了两个内存操作数,这在 x86 程序集中不受支持。您可以通过首先将其中一个操作数加载到寄存器中,然后继续比较来解决此问题,例如:

MOV CX, [SI+CI]
CMP CX, SEARCH

相关内容

最新更新