linux - 如何在 Linux 上用汇编在屏幕上显示图片?

标签 linux assembly drawing

我想用 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 交互会变得更加复杂。

关于linux - 如何在 Linux 上用汇编在屏幕上显示图片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10130833/

相关文章:

c - 什么是 __i686.get_pc_thunk.bx?为什么我们需要这个电话?

c# - 视觉风格独立绘图

sql - 为什么显示的 sed 命令行显示 "extra characters after command"错误?

c - 是否可以 LD_PRELOAD 具有不同参数的函数?

linux - 日期/时间参数不正确

assembly - QWORD 在 64 位机器上的大小是多少?

c++ - 为什么 MSVC C++ 编译器将一个简单的 Hello World 扩展为 4000 行汇编代码?

c++ - SDL_TTF 绘图 int 到字符串内存泄漏?

c# - 检索 Graphics.DrawString 结果的宽度

c - long long 和 long 在 64 位机器的 C 中有相同的范围吗?