Вызов SDL/OpenGL из ассемблерного кода в Linux

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

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

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

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

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

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


person Lie Ryan    schedule 12.06.2010    source источник


Ответы (3)


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

  • Первые шесть целочисленных аргументов/указателей передаются в rdi, rsi, rdx, rcx, r8, r9 в указанном порядке.
  • Первые восемь аргументов с плавающей запятой передаются как скаляры в xmm0-xmm7.
  • Остальные аргументы, которые не подошли, помещаются в стек в порядке C. Стек дополняется по мере необходимости, чтобы rsp был выровнен по 16 байтам.
person slacker    schedule 12.06.2010
comment
спасибо, эта информация помогла мне понять, как вызывать все нужные мне функции. - person Lie Ryan; 13.06.2010

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

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

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

person Bastien Léonard    schedule 12.06.2010
comment
Я вижу, это имеет смысл, с огромным количеством регистров x86-64 передача параметров через регистры с помощью fastcall была бы намного удобнее. - person Lie Ryan; 13.06.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.
person Dr. Snoopy    schedule 12.06.2010