2

これは 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
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 を宣言します。

次に、 x <= y になるまで xy を減算します

したがって、この時点で、使用した数値では、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 に答える