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


Мультиплексорное прерывание - часть 9


; шаг 2.2: вывод собственно таблицы mov dx,16 ; счетчик строк mov аl,-1 ; выводимый символ display_loop4: ; цикл по строкам add di,(80-33)*2 ; увеличить DI до начала push ax ; следующей строки mov al,0B3h stosw ; вывести первый символ (0B3h) pop ax mov cx,16 ; счетчик символов в строке display_loop3: ; цикл по символам в строке inc al ; следующий ASCII-символ stosw ; вывести его на экран push ax mov al,20h ; вывести пробел stosw pop ax loop display_loop3 ; и так 16 раз push ax sub di,2 ; вернуться назад на 1 символ mov al,0B3h ; и вывести 0B3h на месте stosw ; последнего пробела pop ax dec dx ; уменьшить счетчик строк jnz display_loop4

; шаг 2.3: вывод последней строки add di,(80-33)*2 ; увеличить DI до начала следующей строки mov сх,33 ; счетчик символов в строке mov si,offset display_line2 ; DS:SI - адрес строки display_loop2: mov al,byte ptr [si] ; прочитать символ в AL stosw ; вывести его с атрибутом на экран inc si ; увеличить адрес символа в строке loop display_loop2

; шаг 3: подсветка (изменение атрибута) у текущего выделенного символа mov al,byte ptr current_char ; AL = текущий символ mov ah,0 mov di,ax and di,0Fh ; DI = остаток от деления на 16 ; (номер в строке) shl di,2 ; умножить его на 2, так как на экране ; используется слово на символ, ; и еще раз на 2, так как ; между символами - пробелы shr ах,4 ; АХ = частное от деления на 16 ; (номер строки) imul ax,ax,80*2 ; умножить его на длину строки на экране, add di,ax ; сложить их, add di,START_POSITION+2+80*2+1 ; добавить адрес начала окна + 2, ; чтобы пропустить первый столбец, + 80*2, ; чтобы пропустить первую строку, + 1, ; чтобы получить адрес атрибута, ; а не символа mov al,071h ; атрибут - синий на сером stosb ; вывод на экран ret display_all endp

int09h_handler endp ; конец обработчика INT 09h

; буфер для хранения содержимого части экрана, которая накрывается нашим окном screen_buffer db 1190 dup(?)

; первая строка окна display_line1 db 0DAh,11 dup (0C4h),'* ASCII *',11 dup (0C4h),0BFh

; последняя строка окна display_line2 db 0C0h,11 dup (0C4h),'* Hex ' hex_byte1 db ? ; старшая цифра текущего байта hex_byte2 db ? ; младшая цифра текущего байта db ' *',10 dup (0C4h),0D9h




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