二进制搜索ALP

时间:2014-11-06 08:10:22

标签: search assembly binary x86

我有汇编语言的二进制搜索程序。我不明白为什么在再循环中使用语句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

1 个答案:

答案 0 :(得分:1)

在该循环中,AX被赋予数组中元素的索引,然后该索引被移动到SI

数组声明为ARR DW ...W中的DW代表 Word ,因此数组中的每个元素都是一个字,在x86平台上是2个字节。因此,在使用索引从数组中读取之前,需要将索引乘以2。这就是ADD SI,SI所做的事情(SI + SI == SI * 2)。