AT & T x86 64-битная вычислительная мощность - PullRequest
0 голосов
/ 29 сентября 2018

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

...