我想在Linux程序集中制作游戏。 有没有办法通过Linux内核系统调用在屏幕上显示(或绘制)图片?
我search了它,但是我得到的所有结果都是关于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: 在Linux下使用framebuffer设备 。 玩得开心=)
我小时候就习惯用汇编语言来写东西。 现在,我认为它太慢,不可移植 – 当然,你希望你的游戏也可以在基于ARM的手机上运行? 但是程序集并没有真正的给你,除非你在为x86或者x86-64编写程序之后完全重写程序。
如果你真的想做汇编程序,你可能会发现你最大的障碍就是搞清楚如何调用所需的各种C-API函数,因为几乎Linux上的所有东西都在一个层面上使用C API。 处理这个问题的最好办法可能是写一个很小的C程序来完成你所需要的,然后编译它:
gcc -S tc
这应该给你一个类似于你需要做的东西的汇编程序,在一个名为ts
的文件中。