2014-11-06 132 views
0

我有一個彙編語言的二進制搜索程序。我不明白爲什麼在再次循環中使用ADD SI,SI聲明。二進制搜索ALP

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

在這循環中,AX被分配的元素的索引陣列中,然後該索引被移入SI

該陣列被宣佈爲ARR DW ...WDW代表,所以數組中的每個元素都是一個字,它在x86平臺上是2個字節。因此,在使用它從數組讀取數據之前,需要將索引乘以2。這就是ADD SI,SI所做的(SI + SI == SI * 2)。