2015-09-04 84 views
1
[org 0x100] 
;This code is for counting the size 
     mov di, 0   ; to be used for indexing 
     mov bp, s_a 
     mov cx, 0 
     jmp count 

j1:  inc cx    ; storing the size in cx 
count: mov ax, [bp+di] 
     add di, 2 
     cmp ax, -1   ;-1 is the ending condition 
     jne j1 
;=================================; 

     mov si, cx   ;Moving the size in si 
     mov cx, 2   ;using cx for division number 

;This code is for finding the centre point by division 
j2:  mov ax, si 
     mov bx, 0 
     mov bx, cx 
     div bl 
;=================================; 
     inc cx 
     inc cx 
     cmp al, 0   ;If al has 0 then the number is not in array 
     je nfound 
     mov dl, al 
     mov di, 0 

;Increasing bx to point to the required number 
j3:  inc di 
     inc di 
     dec dx 
     cmp dx, 0 
     jne j3 
;=================================; 
     mov ax, [bp+di] ;Moving the centre number in array to ax 
     mov dx, [b_s]  ;The number to be found 

     cmp dx, ax 
     je found    

     cmp dx, ax 
     jl below 

     cmp dx, ax 
     jg above 

above: add bp, di 
     jmp j2 

below: jmp j2 

found: mov cx, bp 
     add cx, di 
     jmp exit 

nfound: mov ax, [bp]  ;This code is for the first element 
     mov di, 0 
     cmp ax, [b_s] 
     je found    
     ;=================; 
     mov cx, 0xffff 
exit: 

mov ax, 4c00h 
int 21h 

s_a: dw 1, 2, 3, 4, 5, -1 
b_s: dw 5 

這是我的代碼二進制搜索其工作罰款的所有數字在這裏除了'1'和'5'。我已經處理了'1'。請建議'5'的解決方案。這意味着最後的號碼。 '-1'不被搜索。二進制搜索排序陣列在彙編語言

+0

使用「bp」作爲地址寄存器的默認段是堆棧段,但不是數據段。爲了修復代碼,您可以額外使用DS段覆蓋前綴。例如:mov ax,DS:[bp + di] –

+0

爲什麼在等效的「shr 1」中使用非常昂貴的指令「div」? –

+1

當您的代碼跳回到* j2 *標籤時,它使用的CX值太高,無法找到中心點*。總是除以2,或者右移一次。 –

回答

2

我看到了你的代碼可能失敗的一些原因。

  • 您爲DL分配一個字節值,但稍後比較DX中的字值而不確定DH包含的值。

    mov dl, al 
    mov di, 0 
    ;Increasing bx to point to the required number 
    j3: 
    inc di 
    inc di 
    dec dx 
    cmp dx, 0 
    jne j3 
    

    明確地清除DH或僅與DL進行遞減/比較。

  • 當元素未找到時,您只需跳回標籤j2。這是錯誤的,因爲您將使用SI中包含的相同數量的元素。您應該重新計算左/右分區中的元素數量。既可以使用(SI/2)或(SI/2 + 1)

參照由德克沃爾夫岡Glomp

  • 眼看[org 0x100]將意味着這是一個.COM可執行文件和這樣所有的評論段寄存器應該具有相同的值。那麼沒有必要編寫DS:使用[bp+di]時。

請清理你的代碼

  • 寫在一排2 inc說明應成爲add ..., 2
  • 沒有必要在寄存器與另一寄存器加載之前移動爲零。 mov bx, 0mov bx, cx
+0

當調試器開始它的值時,關於dx已經是0,但我按照你的說法清除它。但仍然是同樣的事情。關於si,如果我在j1上跳躍,那麼它的工作原理是一樣的嗎? –

+0

只需將'jmp j2'改成'jmp j1'即可解決問題。作爲標籤的例子:_你需要以下內容:'shr si,1''mov cx,2''jmp j2' – Fifoernik