如何修复以下 mod、gcd 和 prime 函数?

问题描述 投票:0回答:0

我正在尝试实现一个包含三个函数的程序——模数、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
assembly x86-64 modulo att
© www.soinside.com 2019 - 2024. All rights reserved.