这是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
答案 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。
从那里开始。