почему эта сборка .com файла печатает 2 нон-стоп? - PullRequest
2 голосов
/ 05 ноября 2011

это код сборки, записанный в файле .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

1 Ответ

0 голосов
/ 06 ноября 2011

В вашем коде есть несколько логических ошибок:

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 </p>

Итак, на данном этапе с использованными вами числами 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" в Google дает вам много примеров кода для вычисления gcd.

Начните оттуда.

...