Вызов SDL / OpenGL из кода сборки в Linux - PullRequest
3 голосов
/ 12 июня 2010

Я пишу простую графическую программу на ассемблере для целей обучения; для этого я намеревался использовать либо OpenGL, либо SDL. Я пытаюсь вызвать функцию OpenGL / SDL из сборки.

Проблема в том, что, в отличие от многих руководств по сборке и OpenGL / SDL, которые я нашел в Интернете, OpenGL / SDL на моей машине, очевидно, не использует соглашение о вызовах языка Си. Я написал простую программу на C, скомпилировал ее в ассемблер (используя ключ -S), и, очевидно, код ассемблера, сгенерированный GCC, вызывает функции OpenGL / SDL, передавая параметры в регистры, а не помещается в стек. 1003 *

Теперь вопрос в том, как мне определить, как передавать аргументы в эти функции OpenGL / SDL? То есть как мне определить, какой аргумент соответствует каким регистрам?

Очевидно, что поскольку GCC может компилировать код C для вызова OpenGL / SDL, поэтому должен быть способ выяснить соответствие между аргументами функции и регистрами. В соглашениях о вызовах C правило простое: сдвигать параметры назад и возвращать значения в eax / rax, я могу просто прочитать их документацию на C и легко понять, как передать параметры. Но как насчет этого?

Есть ли способ вызова OpenGL / SDL с использованием соглашения о вызовах C?

Кстати, я использую yasm с gcc / ld в качестве компоновщика в Gentoo Linux amd64.

Ответы [ 3 ]

5 голосов
/ 12 июня 2010

В системе x86-64 linux для вызовов функций используется стандартное соглашение x86-64 ABI.В двух словах:

  • Первые шесть целочисленных аргументов / указателей передаются в rdi, rsi, rdx, rcx, r8, r9 в указанном порядке.
  • Первые восемь плавающихаргументы точек передаются в виде скаляров в формате xmm0-xmm7.
  • Остальные аргументы, которые не уместились, помещаются в стек в порядке C.Стек дополняется по мере необходимости, чтобы rsp был выровнен до 16 байтов.
2 голосов
/ 12 июня 2010

Я написал простую программу на C, скомпилировал ее в ассемблер (используя ключ -S), и очевидно, что ассемблерный код, сгенерированный GCC, вызывает функции OpenGL / SDL, передавая параметры в регистрах, а не передавая их в стек.

Это совершенно нормально: на x86-64 регистры максимально используются при передаче параметров.

Я считаю, что этот документ содержит наиболее полную информацию.

0 голосов
/ 12 июня 2010

Я верю, что это поможет:

http://en.wikipedia.org/wiki/X86_calling_conventions#Borland_fastcall

Evaluating arguments from left to right, it passes three arguments via EAX, EDX, ECX. Remaining arguments are pushed onto the stack, also left to right.
...