Помощь по VGA и putpixel intel x86 asm Синтаксис AT & T - PullRequest
3 голосов
/ 29 июля 2011

Я хочу нарисовать цветную линию в asm. Я должен использовать AT & T синтаксис на устройстве Intel x86 Linux. Я уже довольно далеко, но я хотел бы знать, как войти в режим VGA или Mode-X и как разместить пиксель на экране. Есть ли функция для этого в стандартной библиотеке C (например, printf)?

Большое спасибо за вашу помощь. :)

<pre></p> <p>.bss # Declaring uninitialized variables</p> <p>.data # Declaring initialized variables</p> <p>.text # Actual assembly code and constants</p> <pre><code>intro: .asciz "Draw a line in VGA\n\n" clr: .asciz "Give a color \n" optns: .asciz "red (1), blue (2), white (3)\n" res .asciz "%d" ent: .asciz "\n" .global main # Tell kernel where to start (visible from outside)

main: pushl% ebp # Push базовый указатель movl% esp,% ebp # Инициализировать базовый указатель pushl $ intro # Push адрес строки call printf # Вызов подпрограммы printf из библиотеки C addl $ 8,% esp

pushl $clr          # push color question on the stack
call printf         # Print it

subl $4, %esp               # Reserve stack space for variable
leal -4(%ebp), %eax             # Load address of stack var in eax
pushl %eax          # Push second argument of scanf
pushl $rets         # Push first argument of scanf
call scanf          # Call scanf

    movl 4(%ebp), %ecx              # mov the result in ecx
    cmpl $1, %ecx
    je red
    cmpl $2, %ecx
    je blue
    jne white

красный: # ... все еще работает над этим

    movl 0013h, %eax                # enter 320x200x256 mode
    int 10h                         # IS THIS CORRECT?

    movl $0, %ebx                   # set X to 0
    movl $0, %ecx                   # set Y to 0

    call draw                   # Call line routine

    movl 0003h, %eax                # IS THIS CORRECT?
    int 10h                         # return to text mode

    movl $0, (%esp)             # Make esp 0, indicating succesful termination
    call exit                       # Exit the program

рисовать:
позвонить putpixel # pushl% ebp # Push базовый указатель # movl% esp,% ebp # Инициализировать базовый указатель inc% ebx # инкремент X inc% ecx # инкремент Y cmpl $ 200,% ecx # проверить, если Y => 200 jge end # если Y => 200, перейти к концу jmp draw # loop

putpxl: # должен поместить пиксель в (% ebx,% ecx) и вернуться к рисованию # следует использовать цвет из основной процедуры

end: movl% ebp,% esp # Удалить локальные переменные popl% ebp # Удалить базовый указатель ret # возврат к основной процедуре

Ответы [ 2 ]

1 голос
/ 29 июля 2011

Лучшее, что вы можете сделать, это использовать библиотеку более высокого уровня, такую ​​как SDL или Allegro. Таким образом, ваша программа будет работать поверх X11 и без кадровых буферов VGA (например, отображения на встроенных устройствах на базе ARM).

Свгалиб позволял программировать для VGA и так называемых SVGA видеокарт. Его развитие прекратилось несколько лет назад.

Существует два способа доступа к оборудованию VGA:

  • Использование регистров
  • Использование VGA BIOS: это тот, который вы пробовали. VGA BIOS написаны для работы в реальном режиме. Чтобы вызвать их из защищенного режима, вам необходимо переключиться в режим vm86. именно это и сделал LRMI (интерфейс реального режима Linux, противоположный DPMI).
1 голос
/ 29 июля 2011

Вы не можете делать прямой вывод видео (графический режим) в linux (защищенная ОС).это было возможно только в DOS (ОС реального режима).

Вы можете использовать устройство с кадровым буфером или SDL, или libX11.Но нет никаких причин, по которым нужно работать с высокоуровневыми библиотеками из asm.

Int 10 не разрешен в linux напрямую (в пользовательском режиме; ядро ​​должно делать низкоуровневые обращения).

например, это 5-летний точно такой же разговор http://www.gamedev.net/topic/368196-linux-assembler-int-10h/

...