Мне нужна помощь в создании программы, которая имеет два целых числа в качестве входных данных и выводит 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 умножается на первое целое число.

0 ответов

Другие вопросы по тегам