Этот вопрос возникает из-за того, что я пишу игрушечный компилятор, но я не думаю, что нужно показывать компиляторную сторону этого вопроса - это строго проблема, потому что я не очень разбираюсь в сборке.
Я работаю над реализацией функций на моем языке. Я создал следующую сборку (AT&T), которая должна напечатать 6
. Ошибка программы по адресу call *%rax
, что, как я полагаю, означает, что я неправильно сохраняю адрес своей функции. Что должно произойти, так это то, что функция f0
должна прочитать аргументы из стека, умножить их и оставить результат в %rax
. Функция print
- это просто оболочка вокруг функции printf
из C для печати %rax
.
Я запускаю Ubuntu 20.04, и код был скомпилирован с gcc test.S -o test.out -no-pie
, на случай это имеет значение.
.data
numfmt:
.asciz "%d\n"
.text
print:
push %rbx
mov %rax, %rsi
mov $numfmt, %rdi
xor %rax, %rax
call printf
pop %rbx
ret
.globl main
main:
push %rbp
mov %rsp, %rbp
jmp s0
f0:
push %rbp
mov %rsp, %rbp
mov 16(%rbp), %rax
push %rax
mov 8(%rbp), %rax
pop %rcx
imul %rcx, %rax
mov %rbp, %rsp
pop %rbp
ret
s0:
mov $f0, %rax
push %rax
mov $1, %rax
push %rax
mov $2, %rax
push %rax
mov -8(%rbp), %rax
call *%rax
add 16, %rsp
call print
mov $0, %rax
mov %rbp, %rsp
pop %rbp
ret