Мне нужна помощь в создании программы, которая имеет два целых числа в качестве входных данных и выводит 1-е целое число, возведенное в степень 2-го числа в коде сборки X86
.text
Assignment: .asciz "Assignment 1b: inout\n" #string
.global main
formatstr: .asciz "%ld" #long interger 64 bits long
printstr: .asciz "%ld\n" #long interger plus next line
main:
movq $Assignment, %rdi #address of string
movq $0, %rax #no vector arguments for printf
call printf #prints the string
call power #call the subroutine inout
movq $0, %rdi #load zero into rdi (register)
call exit
power:
pushq %rbp #push base pointer
movq %rsp, %rbp #move stack pointer to base pointer
subq $8, %rsp #reserve stack space for variable
movq $formatstr, %rdi #load first argument of scanf
leaq -8(%rbp), %rsi #load adress of stack var in rsi
movq $0, %rax #no vector refisters for scanf
call scanf #calls scanf
movq -8(%rbp), %rbx #moves scanned interger (base) into rbx
movq %rbp, %rsp #moves rstackpointer to basepointer
popq %rbp #takes basepointer from stack
pushq %rbp #push basic pointer
movq %rsp, %rbp #moves stack pointer to basepointer
subq $8, %rsp #reserve stack space for 2nd variable
movq $formatstr, %rdi #load first argument of scanf
leaq -8(%rbp), %rsi #load adress of stack var in rsi
movq $0, %rax #no vector refisters for scanf
call scanf #calls scanf
movq -8(%rbp), %rcx #moves scanned interger (exp) into rcx
movq %rbp, %rsp #moves basepointer to stackpointer
popq %rbp #takes basepointer from stack
movq %rbx, %rax #moves 1st var into rax
movq $1, %rdx #sets rdx to 1
jmp loop #jumps to loop
loop:
incq %rdx #increments rdx by 1
mulq %rbx #multiplies rax by rbx
cmpq %rdx, %rcx #checks if rdx < rcx
jl loop
movq $printstr, %rdi #load first argument for printf
movq -8(%rax), %rsi #load 2nd argument (number) for printf
movq $0, %rax #no vector argument
call printf #prints
movq %rbp, %rsp #moves rsp to rbp
popq %rbp #takes rbp from stack
ret #return from subroutine
сканирование для функции ввода работает, так как я проверил это, поставив функцию printf после функции сканирования. но поместить два целых числа в цикл и вывести результат не получится. цикл продолжается до тех пор, пока rax меньше второго целого числа. и каждый раз, когда цикл запускается, rax умножается на первое целое число.