我正在尝试实现一个包含三个函数的程序——模数、gcd 和素数——根据输入计算并返回两个输入的余数 gcd 以及所述 gcd 是否为素数。但是,似乎某处存在无限循环或溢出,以及直接错误的计算。我不知道从哪里开始调试。任何帮助将不胜感激。
功能如下:
modulo:
pushq %rbx
pushq %rcx
pushq %rdx
movq %rdi, %rax
movq %rsi, %rcx
xorq %rdx, %rdx
.L1:
cmpq %rcx, %rax
jl .L2
addq %rcx, %rcx
jno .L1
subq %rcx, %rax
incq %rdx
jmp .L1
.L2:
movq %rax, %rax
popq %rdx
popq %rcx
popq %rbx
ret
gcd:
pushq %rbx
pushq %rcx
pushq %rdx
cmpq $0, %rsi # check if b is zero
je .L7 # if yes, return a as GCD
movq %rsi, %rbx # save b in rbx
xorq %rdx, %rdx
call modulo
movq %rax, %rdi # assign modulo result to b
movq %rbx, %rsi # swap values of a and b
movq %rdi, %rdi
movq %rsi, %rsi
call gcd # call gcd with a = b and b = a % b
movq %rax, %rdi # assign gcd result to a
.L7:
movq %rdi, %rax # return GCD in rax
popq %rdx
popq %rcx
popq %rbx
ret
prime:
pushq %rbx
pushq %rcx
pushq %rdx
movq $2, %rsi
.L4:
cmpq %rdi, %rsi
jge .L5
movq %rsi, %rdi # move i to a
movq %rdi, %rbx # save a in rbx
movq %rdi, %rsi # move a to b
call gcd # call gcd function to calculate GCD of n and i
cmpq $1, %rax # check if GCD is 1
jne .L6 # if not, n is not prime
incq %rsi # increment i and continue loop
jmp .L4
.L5:
popq %rdx
popq %rcx
popq %rbx
ret
.L6:
popq %rdx
popq %rcx
popq %rbx
jmp .L4