В вашем коде есть несколько логических ошибок:
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.
Начните оттуда.