2013-06-13 6 views
0

Я пытаюсь найти GCD итеративно в сборке x86. Так или иначе, цикл продолжает заканчиваться после первой итерации, потому что остаток = 0. Любые идеи почему?GCD Итеративно в x86 intel Assembly

;while r > 0 do 
; Set b = a 
; Set a = r 
; Set r = b % a 
;Output a 


calculation_loop: 
    cmp  remainder, 0     ;check if remainder is 0 
    je  end_of_calc      ;if it is, value in intA is GCD 

    mov  ecx, intA      ;set b = a 
    mov  intB, ecx 

    mov  ecx, remainder     ;set a = r 
    mov  intA, ecx 

    mov  edx, 0       ;clearing remainder 

    mov  ecx, intA      ;process remainder and store in variable 
    div  ecx 
    mov  remainder, edx 


    mov  eax, remainder 
    call WriteInt 
    call Crlf 

    jmp  calculation_loop 

end_of_calc: 

    call Crlf 
    mov  eax, intA 
    mov  edx, OFFSET outputPrompt 
    call WriteString 
    call WriteInt 
    call Crlf 

ответ

0

Держу пари remainder установлен на 0, прежде чем достичь первой итерации calculation_loop, и именно поэтому он выпрыгивает из calculation_loop немедленно. Это ваша проблема, но как насчет решения?

Вы должны заказать свой код по-другому, поэтому он функционирует как do-while вместо цикла while. Я заказана ваши инструкции, так что функции коды подобно do-while цикла:

; calculation loop 
calculation_loop: 
    ; set b to a 
    mov ecx, intA 
    mov intB, ecx 
    ; set a to r 
    mov ecx, remainder 
    mov intA, ecx 
    ; clear remainder (I don't think this is nessesary, can't say for sure) 
    mov edx, 0 
    ;process remainder and store in variable 
    mov ecx, intA      
    div ecx 
    mov remainder, edx 
    ; write data 
    mov eax, remainder 
    call WriteInt 
    call Crlf 
    ; if the remainder != 0, go again 
    cmp remainder, 0 
    jne calculation_loop 

Обратите внимание, как я делаю остаток проверки скачка в конце цикла, после остатка были рассчитаны. Надеюсь, это решит вашу проблему.

Примечание: Я не помню, как целочисленное деление выполняется в x86, поэтому я не могу сказать, является ли какой-либо другой код потенциально ошибочным. Но я действительно думаю, что я решил проблемы, связанные с упорядочением ваших условных прыжков.

И наконец, еще один отзыв. Если вы пишете такой код с хрустом числа, отличный способ найти ошибки - это шаг за шагом по кодовой инструкции и просмотр изменений регистра (через отладчик). Если вы еще этого не делаете, я предлагаю это.