Assembly I';我是汇编语言的新手。如何打破递归循环?
我不熟悉汇编语言。我正在用AT&T x64/GNU语法创建一个素因子分解函数 这是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存储在某个地方(在未修改的寄存器中或堆栈上),然后在返回
当我试着打印一个素数分解数时,它说 二, 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