时间:2018-09-29 16:20:28

标签: assembly x86 att

我正在尝试编写一个程序,该程序从终端读取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来计算最终值。

0 个答案:

没有答案