0

我试图在 x86 程序集中迭代地找到 GCD。不知何故,循环在第一次迭代后继续终止,因为余数 = 0。任何想法为什么?

;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
4

1 回答 1

0

我敢打赌remainder,在您达到 的第一次迭代之前设置为 0 calculation_loop,这就是它立即跳出的原因calculation_loop。那是您的问题,但是解决方案呢?

您应该以不同的方式对代码进行排序,因此它的功能类似于 ado-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 中整数除法是如何完成的,所以我不能说是否有任何其他代码可能是错误的。但我确实认为我解决了与条件跳转的顺序有关的问题。

最后,还有一个提示。如果您正在编写这种数字运算代码,查找错误的好方法是一次单步执行您的代码指令并查看寄存器如何更改(通过调试器)。如果您还没有这样做,我强烈建议您这样做。

于 2013-06-13T01:41:34.720 回答