2013-02-10 35 views
0

我正在寫一個yasm中的泡沫排序的開始,作爲一個練習。但是,我在下面的最後一條指令中每次都會暫停,我不明白爲什麼。x86 yasm,segfault on cmpsb;正確使用cmpsb?

segment .data 

arr  db  5,6,2,3,8,1 

    segment .text 
    global main 
main: 
    xor ecx, ecx    ; counter 
    mov rdx, 6     ; sizeof(arr) 
    cld 

_Do: xor eax, eax   ; set swapped = false 

for: 
    movzx esi, byte [arr+ecx] 
    movzx edi, byte [arr+ecx+1] 
    cmpsb      ; is a[i]>a[i+1]? <--- segfault here every time 
    ;jump to swap next, if I could get there 

我的理解是cmpsb比較si和di中的字節。爲什麼它應該是段錯誤?這一定是非常簡單的錯誤,但我看不到它。通常cmpsb用在repe的上下文中,但我認爲它也可以在這裏工作。謝謝你的幫助!

回答

2

CMPSB不比較兩個寄存器的內容 - 這正是CMP正常的用途。相反,它將寄存器視爲地址並比較它們指向的兩個值。嘗試像這樣:

lea esi, byte [arr + ecx] 
lea edi, byte [arr + ecx + 1] 
cmpsb 
+0

謝謝你,修復它! – user2022444 2013-02-10 17:38:00