在Linux上从汇编代码中调用SDL/OpenGL

3
我正在编写一个简单的基于图形的程序,以汇编语言为学习目的;为此,我打算使用OpenGL或SDL。我试图从汇编中调用OpenGL/SDL的函数。
问题是,与我在互联网上找到的许多汇编和OpenGL/SDL教程不同,我的机器上的OpenGL/SDL显然没有使用C调用约定。我用C编写了一个简单的程序,将其编译为汇编(使用-S开关),显然由GCC生成的汇编代码通过在寄存器中传递参数而不是被推入堆栈来调用OpenGL/SDL函数。
现在,问题是,如何确定如何传递参数给这些OpenGL/SDL函数?也就是说,我该如何找出哪个参数对应哪个寄存器?
显然,由于GCC可以将C代码编译为调用OpenGL/SDL的代码,因此必须有一种方法来确定函数参数和寄存器之间的对应关系。在C调用约定中,规则很简单,向后推参数并在eax/rax中返回值,我只需阅读它们的C文档,就可以轻松地确定如何传递参数。但是这些如何处理呢?
是否有一种方法可以使用C调用约定调用OpenGL/SDL?
顺便说一下,我正在使用yasm,在Gentoo Linux amd64上使用gcc / ld作为链接器。
3个回答

6
在x86-64 Linux系统中,遵循标准的x86-64 ABI约定进行函数调用。简而言之:
  • 前六个整数/指针参数按顺序通过rdi、rsi、rdx、rcx、r8、r9传递。
  • 前八个浮点参数作为标量在xmm0-xmm7中传递。
  • 未能容纳的其余参数被推送到堆栈中,按C顺序排列。需要填充堆栈以保持rsp对齐到16字节。

谢谢,那个信息帮助我弄清楚了如何调用我需要的所有函数。 - Lie Ryan

2
我用C语言写了一个简单的程序,将其编译为汇编代码(使用-S开关),显然,由GCC生成的汇编代码通过在寄存器中传递参数来调用OpenGL/SDL函数,而不是将它们推送到堆栈中。这是完全正常的:在x86-64上,尽可能多地使用寄存器来传递参数。
我发现这个文档包含了最全面的信息。

我明白了,使用x86-64庞大数量的寄存器,通过fastcall将参数传递到寄存器中会更加方便。 - Lie Ryan

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接