Assembler - язык неограниченных возможностей


Взаимодействие между процессами - часть 4


; процедура display_line ; выводит на экран нашу змейку по координатам из кольцевого буфера line_coords display_line proc near mov di,word ptr coords_tail ; начать вывод с хвоста, continue_line_display: cmp di,word ptr coords_head ; если DI равен адресу головы, je line_displayed ; вывод закончился, call display_point ; иначе - вывести точку на экран, add di,4 ; установить DI на следующую точку and di,127 jmp short continue_line_display ; и так далее line_displayed: call display_point mov di,word ptr coords_tail ; вывести точку в хвосте push bx mov bx,0 ; нулевым цветом, call display_point ; то есть стереть pop bx ret display_line endp

; процедура display_point ; выводит точку из буфера line_coords с индексом DI display_point proc near mov cx,word ptr line_coords[di] ; строка mov dx,word ptr line_coords[di+2] ; столбец call putpixel ; вывод точки ret display_point endp

; процедура z_random ; стандартный конгруэнтный генератор случайных чисел (неоптимизированный) ; ввод: ЕВХ - максимальное число ; вывод: EDX - число от 0 до ЕВХ-1 z_random: push ebx cmp byte ptr zr_init_flag,0 ; если еще не вызывали, je zr_init ; инициализироваться, mov eax,zr_prev_rand ; иначе - умножить предыдущее zr_cont: mul rnd_number ; на множитель div rnd_number2 ; и разделить на делитель, mov zr_prev_rand,edx ; остаток от деления - новое число pop ebx mov eax,edx xor edx,edx div ebx ; разделить его на максимальное ret ; и вернуть остаток в EDX zr_init: push 0040h ; инициализация генератора pop fs ; 0040h:006Ch - mov eax,fs:[006Ch] ; счетчик прерываний таймера BIOS, mov zr_prev_rand,eax ; он и будет первым случайным числом mov byte ptr zr_init_flag,1 jmp zr_cont rnd_number dd 16807 ; множитель rnd_number2 dd 2147483647 ; делитель zr_init_flag db 0 ; флаг инициализации генератора zr_prev_rand dd 0 ; предыдущее случайное число

; здесь начинается код диспетчера, обеспечивающего многозадачность

; структура данных, в которой мы храним регистры для каждой нити thread_struc struc _ах dw ? _bx dw ? _cx dw ? _dx dw ? _si dw ? _di dw ? _bp dw ? _sp dw ? _ip dw ? _flags dw ? thread_struc ends




Начало  Назад  Вперед