Надо написать простую функцию на ассемблере. В этом я ничего не понимаю. Вот файл s.s: .intel_syntax noprefix .global lol .type lol, @function lol: push ebx ret Результат: $ cc s.s s.s: Assembler messages: s.s:6: Error: ambiguous operand size or operands invalid for `push'
Код (Text): .intel_syntax noprefix .global lol .type lol, @function lol: mov rax, [rsp+4] ret Код (Text): #include <stdio.h> extern int lol ( int i ); //main.c int main() { printf ( "%d", lol ( 8 ) ); return 0; } хм, печатает 0. А хочется чтобы 8. Что тут нужно исправить? rsp - адрес возврата, а rsp+1 - адрес первого аргумента? Возвращаемое значение лежит в rax? Или тут всё вообще по-другому? )
коляколя, вы в курсе, что на amd64 размер указателя равен 8 байтам? То есть адрес возврата в стеке -- это восемь байт. То есть адрес первого аргумента -- это `%rsp + 8' Во-вторых. sizeof (int) == 4. То есть если lol имеет указанный заголовок: int lol (int), то выглядеть она должна например так: Код (Text): lol: xorq %rax, %rax movl $8(%rsp), %eax ret Из стека берём четыре байта и складываем в %eax. ps. кстати. Я не силён во всех этих amd64, не вникал. Но пару раз разглядывал вывод `gcc -S', у меня сложилось устойчивое впечатление, что аргументы передаются в регистрах. Читать доки лень, поставил эксперимент: Код (Text): int lol (int i) { return i; } после `gcc -Os -S' превратился в Код (Text): .globl lol .type lol, @function lol: .LFB2: movl %edi, %eax ret .LFE2: .size lol, .-lol Но это правда linux. Если ты на бзд, то не факт, что там так же.