2012-04-12 3 views
3

Я хочу сделать игру в сборке Linux. Есть ли способ показать (или нарисовать) изображение на экране с помощью системных вызовов ядра Linux?Как показать картинку на экране с сборкой на Linux?

Я искал его, но все результаты, которые я получаю, касаются языка ассемблера DOS.

+0

для окон http://showmedo.com/videotutorials/video?name=3200020&fromSeriesID=320 – 0x90

+0

+1 для попытки кодирования игры в сборке. :) –

ответ

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, а также номер syscall.

Вы можете найти номера системного вызова в ядрах Linux, включая/asm-generic/unistd.h.

Теперь, когда вы знаете, как звонить на системные вызовы с сборки, вам все равно нужно знать, какие системные вызовы вызывать, конечно. Я бы предложил прочитать на Linux Framebuffer. Взаимодействие с X будет еще сложнее.

0

Когда я был ребенком, я записывал материал на ассемблере как любитель. Теперь я считаю это слишком медленным и неспортивным - наверняка, вы хотите, чтобы ваша игра запускалась на телефоне ARM? Но сборка на самом деле не дает вам этого, если вы полностью не перепишете программу после ее написания для x86 и, возможно, x86-64.

Если вы действительно хотите сделать ассемблер, вы, вероятно, обнаружите, что ваше самое большое препятствие - это выяснить, как вызвать различные функции C-API, потому что почти все в Linux использует API C на том или ином уровне. Лучший способ справиться с этим, вероятно, чтобы написать маленькую программу C, которая делает то, что вам нужно, а затем скомпилировать его:

gcc -S t.c 

Это должно дать вам ассемблер что-то похожее на то, что вам нужно сделать, в файл с именем t.s.

Смежные вопросы