Assembly I';我是汇编语言的新手。如何打破递归循环?

Assembly I';我是汇编语言的新手。如何打破递归循环?,assembly,x86,primes,att,Assembly,X86,Primes,Att,我不熟悉汇编语言。我正在用AT&T x64/GNU语法创建一个素因子分解函数 这是 当我试着打印一个素数分解数时,它说 二, 2. 2. 2. 2. 2. 2. 2. 对不起。我是新来的。你能解释为什么这是打印2无限?打印素数因子分解需要做什么?事实打印的调用方假定eax寄存器不会更改,但情况并非如此。当fact\u print返回时,eax将具有printf返回的值(输出的字符数) 在调用fact\u print之前,您需要将eax存储在某个地方(在未修改的寄存器中或堆栈上),然后在返回

我不熟悉汇编语言。我正在用AT&T x64/GNU语法创建一个素因子分解函数

这是



当我试着打印一个素数分解数时,它说

二, 2. 2. 2. 2. 2. 2. 2.


对不起。我是新来的。你能解释为什么这是打印2无限?打印素数因子分解需要做什么?

事实打印的调用方假定
eax
寄存器不会更改,但情况并非如此。当
fact\u print
返回时,
eax
将具有
printf
返回的值(输出的字符数)


在调用
fact\u print
之前,您需要将
eax
存储在某个地方(在未修改的寄存器中或堆栈上),然后在返回时将其还原。

为什么会有所有这些零偏移跳转(跳转到作为下一条指令的标签)?。。。或者使用x86-64调用约定中的任意一个保留调用的寄存器,而不是堆栈。
.data
.text
.global main
.prime_end: .string "End\n"
.fact_end: .string "Finish\n"
.fact_print: .string "%d\n"

prime: 
mov %rsi, %rax
    mov $0, %rdi
    cmp $2, %rax
    jl prime_end

    jmp prime_base

prime_base:    # r10 = 1
    mov $1, %r10
    jmp prime_start

prime_start:    # r10 + 1 = 2
    inc %r10
    jmp prime_check

prime_check:
    cqto
    div %r10    # rsi = 10, rax = 10, rax / r10 = 10/2 

    cmp $0, %rdx    # rdx = 0, rax = 5
    jne prime_start

    jmp fact_check

fact_check:    # rsi = 10, rax = 10
    mov %rsi, %rax
    cqto
    div %r10    # 10 / 2 

    jmp prime_fact

prime_fact:
    cmp %r10, %rax    # to end function
    jl fact_end

    call fact_print     # where I think it should be printed

    mov %rax, %rsi    # rax = 5, rsi = 5
    add %rdx, %rsi    # rdx = 0, rsi = 5

    cmp $1, %rsi    # if 5 = 1, end function
    jne prime_base    

    jmp fact_end

fact_print:
    mov $.fact_print, %rdi
    mov %r10, %rsi
    xor %rax, %rax
    call printf
    ret

fact_end:
    mov $.fact_end, %rdi
    xor %rax, %rax
    call printf
    ret

prime_end:
    mov $.prime_end, %rdi
    xor %rax, %rax
    call printf
    ret

main:
    mov $10, %rsi    # check 10 ... expect 2 5
    call prime