我有汇编语言的二进制搜索程序。我不明白为什么在再循环中使用语句ADD SI,SI
。
DATA SEGMENT
ARR DW 0000H,1111H,2222H,3333H,4444H,5555H,6666H,7777H,8888H,9999H
LEN DW ($-ARR)/2
KEY EQU 7777H
MSG1 DB "KEY IS FOUND AT "
RES DB " POSITION",13,10," $"
MSG2 DB 'KEY NOT FOUND!!!.$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV BX,00
MOV DX,LEN
MOV CX,KEY
AGAIN:
CMP BX,DX
JA FAIL
MOV AX,BX
ADD AX,DX
SHR AX,1
MOV SI,AX
ADD SI,SI
CMP CX,ARR[SI]
JAE BIG
DEC AX
MOV DX,AX
JMP AGAIN
BIG: JE SUCCESS
INC AX
MOV BX,AX
JMP AGAIN
SUCCESS: ADD AL,01
ADD AL,'0'
MOV RES,AL
LEA DX,MSG1
JMP DISP
FAIL: LEA DX,MSG2
DISP: MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
答案 0 :(得分:1)
在该循环中,AX
被赋予数组中元素的索引,然后该索引被移动到SI
。
数组声明为ARR DW ...
。 W
中的DW
代表 Word ,因此数组中的每个元素都是一个字,在x86平台上是2个字节。因此,在使用索引从数组中读取之前,需要将索引乘以2。这就是ADD SI,SI
所做的事情(SI + SI
== SI * 2
)。