Примеры небольших подпрограмм на Ассемблере
· Чтение строки с клавиатуры
· Перевод чисел в двоичную форму (в виде строки)
· Чтение значения счетчика времени
· Определение типа процессора
· Установка видеорежимов VGA
· Запись напрямую в видеопамять
· Рисование пиксела в различных режимах VGA
· Рисование в SVGA
· Линейные преобразования в системах с фиксированной точкой
· Функция синуса в 32-битной системе с фиксированной точкой
· Таблица расположения файлов FAT
· Выполнение дочерней программы
· Чтение параметров командной строки
· TSR: Завершаемся и остаемся в памяти
· Проверка готовности накопителя
KbdInput$ proc;POW35
; Входные данные: смещение строки в AX
; Выходные данные: строка ASCIIZ, прочитанная с клавиатуры. Регистры не сохраняются.
mov DI,AX;смещение строки
mov DX,AX;смещение буфера
mov CX,255;максимальное количество читаемых символов
mov BX,0;файловый хэндл клавиатуры
mov AH,3Fh;читаем из файла (фактически - с клавиатуры)
int 21h
jc Input$_error;если ошибка
dec AX;убираем символ RETURN
add DI,AX;смещение байта, расположенного в конце строки
Input$_error:
mov [DI],BL;завершаем строку, записывая 0 в конец строки
ret
KbdInput$ endp
Перевод чисел в двоичную форму (в виде строки)
Данная процедура конвертирует 16-битное слово в строку ASCIIZ, т.е. число 7 преобразовывается в строку 0000000000000111. Лидирующие нули включаются в строку. Строка ASCIIZ - это набор символов, завершающихся 0.
NmbrToBi$ proc;POW36
;Входные данные: AX - смещение строки, BX - число, которое необходимо преобразовать
;Выходные данные: Строка ASCIIZ. Регистры не сохраняются.
mov DI,AX;смещение строки
mov DX,8000h;проверочное слово, 1 в позиции 15
mov CX,16;обрабатываем 16 бит
NumberTo_B0:
mov AL,48;символ '0'
test BX,DX;бит равен 1?
jz NumberTo_B
inc AL;символ '1'
NumberTo_B:
stosb;записываем в строку '1' или '0'
shr DX,1;сдвигаем тестовый бит вправо
loop NumberTo_B0
mov [DI],DL;завершаем строку 0
ret
NmbrToBi$ endp
Чтение значения счетчика времени
В памяти по адресу 40:6C расположено двойное слово, которое увеличивается на единицу приблизительно 18.2 раза в секунду. Системное время можно получить, считывая это слово. Младший байт может быть использован для многих "временных" задач, в т.ч. в качестве исходного значения для генератора псевдослучайных чисел (а в некторых случаях и заменить его).
GetTicks proc;POW37
; Входные данные: нет
; Выходные данные: Младший байт счетчика времени в AX
; Регистры не сохраняются.
mov BX,ES;Сохраняем адрес дополнительного сегмента
mov AX,40h;сегмент данных BIOS
mov ES,AX
mov AX,ES:[6Ch];читаем счетчик
mov ES,BX;восстанавливаем регистр ES
ret
GetTicks endp