为什么这个程序集.com文件打印2不停?

时间:2011-11-05 18:43:55

标签: assembly x86 x86-16

这是16位机器的.com文件中编写的汇编代码: 它是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

1 个答案:

答案 0 :(得分: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

然后你减去x-y直到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

在谷歌上搜索'gcd assembly'会给你很多代码示例来计算gcd。

从那里开始。