Я пытаюсь написать программу, которая читает 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 => return 1. экспонента равна 1 => return base.экспонента больше 1 => используйте jmp, decq и imulq для вычисления окончательного значения.