2

这是用 .com 文件编写的 16 位机器的汇编代码:它是 gcd 计算的代码,有 2 个函数:calc_gcd 调用 clac_mod。calc_mod 工作正常,我假设 calc_gcd 也是如此,但是 calc_gcd 中的打印将数字 2(BTW 正确答案)无限次打印到屏幕上。这是为什么?

        org 100h
        mov ax,0006
        mov bx,0002

        call calc_gcd
        mov ah,4Ch
        int 21h 
        msg dw ' ','$'

        calc_mod:   
           start_mod:
           cmp ax, bx
           jbe end_mod
           sub ax,bx
           jmp start_mod
    end_mod: 
        ret

        calc_gcd:

       cmp bx,0000h
       je end_gcd
       call calc_mod
       xor ax, bx
       xor bx, ax
       xor ax, bx
       add ax, '0'
       mov [msg], ax
       mov dx,msg
       mov ah,9
       int 21h  

      call calc_gcd
        end_gcd: 
         ret
4

1 回答 1

0

您的代码中有一些逻辑错误:

mov ax,0006        ;ax = 6
mov bx,0002        ;bx = 2
[...]
calc_mod:          ;you don't need 2 labels, choose 1
start_mod:
cmp ax, bx         ;6 = 2?
jbe end_mod        ;exit call
sub ax,bx          ;ax = 6-2 = 4
jmp start_mod      ;loop until ax=bx=2

所以在这段代码中你声明了 2 个变量 x=6 和 y=2

然后减去 xy 直到 x <= y

所以此时,使用您使用的数字,AX=2 和 BX=2

calc_gcd:
    cmp bx,0000h         ;BX=2 and is never touched in the code
    je end_gcd           ;jmp never taken
    call calc_mod
    xor ax, bx           ;AX = 2 xor 2 = 0
    xor bx, ax           ;BX = 2 xor 0 = 2
    xor ax, bx           ;AX = 0 xor 2 = 2
    add ax, '0'          ;AX = 32h
    mov [msg], ax
    mov dx,msg           ;msg = '2'
    [...]
    call calc_gcd        ;do this again and again
end_gcd:
    ret

在 google 上搜索“gcd 程序集”会为您提供大量代码示例来计算 gcd。

从那里开始。

于 2011-11-06T03:58:16.450 回答