From a1d2058ed96dbc84869756907f42675911a37276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20A=2E=20Ortega?= Date: Tue, 7 Jun 2016 01:41:40 +0200 Subject: [PATCH] Trying to get the new ABI working here. --- src/power.asm | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/power.asm b/src/power.asm index 5e31758..0fce81b 100644 --- a/src/power.asm +++ b/src/power.asm @@ -4,22 +4,22 @@ .globl _start _start: - pushq $3 # push the second argument - pushq $2 # push the first argument + movq $3, %rsi # second argument + movq $2, %rdi # first argument call power # call the function - addq $16, %rsp # move the stack pointer back - pushq %rax # save the first answer on stack - pushq $2 # push the second argument - pushq $5 # push the first argument + ;addq $16, %rsp # move the stack pointer back + pushq %rax # save the first answer on stack + movq $2, %rsi # push the second argument + movq $5, %rdi # push the first argument call power # call the function - addq $16, %rsp # move the stack pointer back + ;addq $16, %rsp # move the stack pointer back - popq %rdi # the second answer is still in %rax, + popq %rdi # the second answer is still in %rax, # so we can put the first one from the # stack to %rdi to keep both answers - addq %rax, %rdi # add them together and store result + addq %rax, %rdi # add them together and store result # in %rdi - movq $60, %rax # exit (%rdi is returned) + movq $60, %rax # exit (%rdi is returned) syscall #VARIABLES: @@ -31,28 +31,25 @@ _start: # .type power, @function power: - pushq %rbp # save old base pointer - movq %rsp, %rbp # make stack pointer the base pointer - subq $8, %rsp # get room for our local storage + pushq %rbp # save old base pointer + movq %rsp, %rbp # make stack pointer the base pointer + subq $8, %rsp # get room for our local storage - movq 16(%rbp), %rdi # put first argument in %rdi - movq 24(%rbp), %rsi # put second argument in %rsi - - movq %rdi, -4(%rbp) # store the current result + movq %rdi, -8(%rbp) # store the current result power_loop_start: - cmpq $1, %rsi # if the power is 1, don't do shit + cmpq $1, %rsi # if the power is 1, don't do shit je end_power - movq -4(%rbp), %rax # move the current result into %rax - imulq %rdi, %rax # multiply the current result by the + movq -8(%rbp), %rax # move the current result into %rax + imulq %rdi, %rax # multiply the current result by the # base number - movq %rax, -4(%rbp) # store the current result + movq %rax, -8(%rbp) # store the current result - decq %rsi # decrease the power (one down) + decq %rsi # decrease the power (one down) jmp power_loop_start # run for the next power end_power: - movq -4(%rbp), %rax # return value goes in %rax - movq %rbp, %rsp # restore the stack pointer - popq %rbp # restore the base pointer + movq -8(%rbp), %rax # return value goes in %rax + movq %rbp, %rsp # restore the stack pointer + popq %rbp # restore the base pointer ret