Как создать C-вызываемую функцию на ассемблере

Я изучаю ассемблер по книге Джеффа Дантемана. Я пытаюсь понять, как написать функцию, которую можно вызвать на C.

Скажем, например, что я хочу реализовать следующую функцию в ассемблере:

int my_function(int a, int b)
{
      return a+2*b
}

Как мне это написать? Как получить доступ к аргументам и как сообщить C, что возвращаемое значение является целым числом?

РЕДАКТИРОВАТЬ: я делаю это на старой 32-битной Ubuntu.


person tst    schedule 29.01.2021    source источник
comment
Вам необходимо изучить соглашение о вызовах вашей целевой архитектуры.   -  person Eugene Sh.    schedule 29.01.2021
comment
agner.org/optimize/calling_conventions.pdf   -  person Arthur Kalliokoski    schedule 29.01.2021
comment
Единственный способ сообщить компилятору C, что возвращает внешняя функция и какие параметры типа она принимает, — предоставить прототип функции.   -  person 0___________    schedule 29.01.2021
comment
Я знаю, что регистры ebx, esp, ebp, esi и edi нельзя изменить и что возвращаемое значение сохраняется в eax и, возможно, также в edx. Я не могу понять, по какому смещению хранятся аргументы   -  person tst    schedule 29.01.2021
comment
Параметры помещаются в стек справа налево в 32-битной System V ABI (которую использует 32-битный Linux). Инструкция call (или эквивалентная) поместит адрес возврата в стек. Все это означает, что когда функция впервые начинает выполняться, первый 32-битный целочисленный параметр функции класса имеет значение [ESP+4], второй — [ESP+8], третий — [ESP+12] и т. д. [ESP+0] обратный адрес   -  person Michael Petch    schedule 29.01.2021
comment
Нам действительно нужен канонический вопрос для такого рода вещей. Питер Кордес, может это он?   -  person fuz    schedule 29.01.2021
comment
@fuz: Да, если его еще нет. Вызов функции NASM в C имеет попытку, которая лишь немного нарушает соглашение о вызовах, поэтому детали соглашения о вызовах рассматриваются только в комментариях. На stackoverflow.com/tags/x86/info уже есть ссылки на руководства и учебные пособия, но не знаю, насколько они хороши. Большинство вопросов с такими заголовками являются попыткой с какой-то случайной ошибкой, так что это все ответы. например вызов ассемблерных функций из c AT&T push foo вместо push $foo или от 1   -  person Peter Cordes    schedule 29.01.2021
comment
@fuz: Вызовы функций и сборка были закрыты как слишком широкие. Но да, это может быть достойным местом для написания канонических вопросов и ответов / учебника для 32-битного соглашения о вызовах аргументов стека (i386 System V). Есть больше вопросов и ответов о x86-64, потому что я думаю, что больше людей впервые переключились на него и изучили его в первые дни Stack Overflow.   -  person Peter Cordes    schedule 29.01.2021