我正在Assembly中编写一个简单的基于图形的程序用于学习目的;为此,我打算使用 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,gcc/ld 作为 Gentoo Linux amd64 上的链接器。