2013-02-10 6 views
0

나는 운동으로 거품 정렬의 시작을 yasm에 씁니다. 그러나 나는 아래의 마지막 명령에서 항상 매번 segfaulting하고 있는데, 나는 왜 그런지 이해하지 못합니다.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는 리피트의 컨텍스트에서 사용되지만 여기에서도 작동 할 것이라고 생각했습니다. 어떤 도움을 주셔서 감사합니다!

답변

2

CMPSB 두 레지스터의 내용을 비교하지 않습니다. 즉, 보통 CMP의 내용과 비교됩니다. 대신 레지스터를 주소로 처리하고 해당 레지스터가 가리키는 두 값을 비교합니다. 다음과 같이 시도하십시오.

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

고맙습니다. – user2022444