Я хочу нарисовать цветную линию в 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 # возврат к основной процедуре