4

我想用 Linux 程序集制作一个游戏。有没有办法通过 Linux 内核系统调用在屏幕上显示(或绘制)图片?

我搜索了它,但我得到的所有结果都是关于 DOS 汇编语言的。

4

3 回答 3

1

这是可能的,但如今在汇编中开发软件似乎是一种非常乏味和缓慢的方法。

假设您在 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 的交互将变得更加复杂。

于 2012-04-12T20:40:45.623 回答
0

如果只想使用内核函数,则必须使用 vesa framebuffer: Using the framebuffer device under Linux。玩得开心 =)

于 2012-04-13T17:22:59.233 回答
0

当我还是个孩子的时候,我曾经作为一个业余爱好者在汇编程序中写东西。现在我认为它太慢且不便携——您肯定希望您的游戏也可以在基于ARM的手机上运行吗?但是汇编并没有真正给你这个,除非你在为 x86 或者 x86-64 编写程序之后完全重写程序。

如果你真的想做汇编程序,你可能会发现你最大的障碍是弄清楚如何调用所需的各种 C-API 函数,因为 Linux 上几乎所有东西都在一个或另一个层次上使用 C API。处理这个问题的最好方法可能是编写一个小型 C 程序来满足您的需要,然后编译它:

gcc -S t.c

这应该在名为t.s.

于 2012-04-12T21:58:40.020 回答