2011-11-05 66 views
2

這是16位機器的.com文件中寫的彙編代碼: 它是一個gcd計算代碼,有2個函數:calc_gcd調用clac_mod。 calc_mod工作正常,我也假設calc_gcd,但calc_gcd中的打印將數字2(正確答案BTW)無限次數打印到屏幕上。 這是爲什麼?爲什麼這個程序集.com文件打印2不停?

 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

有你的代碼的一些邏輯錯誤:

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 

所以在此代碼聲明兩個變量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 

在搜索 'GCD組件' 的谷歌提供了大量的代碼示例計算最大公約數。

從那裏開始。