2013-02-10 2 views
0

J'écris le début d'une sorte de bulle dans yasm, comme un exercice. Mais je me suis trompé à chaque fois à la dernière instruction ci-dessous et je ne comprends pas pourquoi.x86 yasm, segfault sur cmpsb; bon usage de 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 

Ma compréhension est cmpsb compare l'octet dans si et di. Pourquoi devrait-il segmenter? Ce doit être une erreur très simple de ma part mais je ne le vois pas. Habituellement cmpsb est utilisé dans le contexte d'un repe, mais je pensais que ça marcherait aussi ici. Merci pour toute aide!

Répondre

2

CMPSB ne compare pas le contenu de deux registres - c'est ce que CMP est pour. Au lieu de cela, il traite les registres comme des adresses et compare les deux valeurs qu'ils pointent. Essayez quelque chose comme:

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

Merci, cela le répare! – user2022444