2013-02-10 39 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