我正在尝试编写一个程序,该程序从终端读取2个值,一个底数和一个指数(仅正),然后在终端中返回结果。
#textblock in which our program is written
.text
#constant .asciz/.string to store what we will print
formatstr: .asciz "%ld\n"
#the main label
.global main
#main routine
main:
call pow
movq $0, %rdi
call exit
pow:
pushq %rbp
movq %rsp, %rbp
subq $8, %rsp
leaq -8(%rbp), %rsi
movq $formatstr, %rdi
movq $0, %rax
call scanf
pushq %rsi
subq $8, %rsp
leaq -8(%rbp), %rsi
movq $formatstr, %rdi
movq $0, %rax
call scanf
pushq %rsi
popq %rcx #rcx holds the exponent
popq %rdx #rdx holds the base
movq (%rdx), %rbx
movq (%rcx), %rdi #load base into rdi
jmp hey
hey:
decq %rcx
cmpq %rcx, %rdi
imul %rdx, %rbx
jle hey
movq (%rdx), %rsi
movq $formatstr, %rdi
movq $0, %rax
call printf
movq %rbp, %rsp
popq %rbp
ret
到目前为止,这是我要扫描的2个输入,将它们压入堆栈,然后将其弹出到我的寄存器%rcx和%rdx中。然后,我将复制要乘以的基数以注册%rbx。还将指数移到另一个寄存器%rdi中,这样我就可以与指数进行比较,看看还需要循环多少。这是我不太了解的部分,我不确定循环函数,jmp,jle等如何工作。执行我的代码时,它要求我输入3个值,当我输入它们时,它返回一个分段错误。
编辑:我现在意识到我出了问题。现在,我的程序可以通过使用cmpq和jmp,jne,je和jge正常运行。同样重要的是要注意程序应具有3个流:指数为0 =>返回1。指数为1 =>返回基数。指数大于1 =>使用jmp以及decq和imulq来计算最终值。