我想用 Linux 程序集制作一个游戏。有没有办法通过 Linux 内核系统调用在屏幕上显示(或绘制)图片?
我搜索了它,但我得到的所有结果都是关于 DOS 汇编语言的。
这是可能的,但如今在汇编中开发软件似乎是一种非常乏味和缓慢的方法。
假设您在 i386 平台上运行(每个平台的系统调用 ABI 不同),请查看 uClibcs libc/sysdeps/linux/i386/syscall.S:
.text
.global syscall
.type syscall,%function
syscall:
pushl %ebp
pushl %edi
pushl %esi
pushl %ebx
movl 44(%esp),%ebp /* Load the 6 syscall argument registers */
movl 40(%esp),%edi
movl 36(%esp),%esi
movl 32(%esp),%edx
movl 28(%esp),%ecx
movl 24(%esp),%ebx
movl 20(%esp),%eax /* Load syscall number into %eax. */
int $0x80
popl %ebx
popl %esi
popl %edi
popl %ebp
cmpl $-4095,%eax
jae __syscall_error
ret /* Return to caller. */
.size syscall,.-syscall
这假设所有系统调用参数以及系统调用号都已加载到堆栈上。
您可以在 Linux 内核的 include/asm-generic/unistd.h 文件中找到系统调用编号。
既然您知道如何从程序集中调用系统调用,那么您当然还需要知道要调用哪些系统调用。我建议阅读Linux Framebuffer。与 X 的交互将变得更加复杂。
如果只想使用内核函数,则必须使用 vesa framebuffer: Using the framebuffer device under Linux。玩得开心 =)
当我还是个孩子的时候,我曾经作为一个业余爱好者在汇编程序中写东西。现在我认为它太慢且不便携——您肯定希望您的游戏也可以在基于ARM的手机上运行吗?但是汇编并没有真正给你这个,除非你在为 x86 或者 x86-64 编写程序之后完全重写程序。
如果你真的想做汇编程序,你可能会发现你最大的障碍是弄清楚如何调用所需的各种 C-API 函数,因为 Linux 上几乎所有东西都在一个或另一个层次上使用 C API。处理这个问题的最好方法可能是编写一个小型 C 程序来满足您的需要,然后编译它:
gcc -S t.c
这应该在名为t.s
.