Assembly 我试图在8086 masm中的数组中实现二进制搜索,但是我得到了一个错误,如;通过之间的相位误差;
这是我的asm代码。在语句Assembly 我试图在8086 masm中的数组中实现二进制搜索,但是我得到了一个错误,如;通过之间的相位误差;,assembly,x86,binary-search,masm,Assembly,X86,Binary Search,Masm,这是我的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 TEM
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