如何在Linux上使用程序集在屏幕上显示图片?

时间:2012-04-12 19:57:17

标签: linux assembly drawing

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

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

3 个答案:

答案 0 :(得分:0)

这是可能的,但这些天看起来像是一种令人难以置信的繁琐而缓慢的方法来开发软件。

假设您在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

这假设所有的syscall参数以及系统调用号都已加载到堆栈中。

您可以在Linux内核包含/ asm-generic / unistd.h文件中找到系统调用号。

既然你知道如何从程序集中调用系统调用,你仍然需要知道哪个系统调用当然。我建议你阅读Linux Framebuffer。与X的交互将变得更加复杂。

答案 1 :(得分:0)

当我还是个孩子的时候,我常常把汇编程序中的东西写成业余爱好者。现在我认为它太慢而且不可移植 - 你肯定希望你的游戏也能在基于ARM的手机上运行吗?但是汇编并没有真正给你这个,除非你在为x86和x86-64编写程序后完全重写程序。

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

gcc -S t.c

这应该在名为t.s的文件中为汇编程序提供类似于您需要的内容。

答案 2 :(得分:0)

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