Вывод на экран всех ASCII символов
С помощью элементарных команд процессора выведем на экран все 256 символов, содержащихся в таблице ASCII. Вот текст программы на ассемблере:
org 100h
mov ax,0b000h
mov es,ax
mov si,8000h
add si,160
mov cx,0
LP0:
mov byte [es:si],cl
mov byte [es:si+1],0fh
add si,2
inc cx
cmp cx,100h
jne LP0
mov ax, 4ch
int 21h
Подробно разберем программу:
org 100h – указываем компилятору, что адреса всех меток нужно сместить на 100h (или 256 байт) вперед. Это необходимо сделать, поскольку эта программа компилируется под DOS, как .com файл, а DOS смещает код на 256 байт.
mov ax,0b000h
mov es,ax
Помещаем в сегментный регистр es сегмент (B000h), в котором находится видеопамять. Адрес начала видеопамяти в формате сегмент:смещение – B000h:8000h. Мы не можем одной командой поместить число B000h в сегментный регистр es, поэтому сначала мы это число помещаем в регистр ax, а затем из ax – в es.
mov si,8000h – в регистр si помещаем смещение начала блока видеопамяти.
add si,160 – будем выводить символы со второй строчки. Поскольку одна строчка занимает 160 байт памяти (на каждый символ отводится 2 байта, а в строке 80 символов), адрес этой строчки на 160 больше адреса начала блока видеопамяти. Поэтому прибавим к регистру si десятичное число 160.
mov cx,0 – обнуляем регистр cx. В этом регистре, а точнее в его младшей части – регистре cl, будем хранить номер выводимого символа в таблице ASCII.
mov byte [es:si],cl – Помещаем номер выводимого символа (в первом случае 0) в соответствующую ячейку видеопамяти, на которую указывают регистры es:si.
mov byte [es:si+1],0fh – в следующую ячейку памяти помещаем атрибут выводимого символа: старшие полбайта – это цвет фона под символом в данном случае 0, черный; младшие полбайта – цвет символа, в данном случае f, белый.
add si,2 – увеличиваем адрес ячейки видеопамяти на 2, чтобы перейти к адресу следующего символа.
inc cx – увеличиваем значение регистра cx на единицу. Теперь в cl содержится номер следующего символа в таблице ASCII.
cmp cx,100h – проверяем регистр cx на равенство числу 100h (или 256). Если в регистре cx содержится это число, значит все 256 символов уже выведены на экран (символы с номерами от 0 до 255).
jne LP0 – если cx не равен 100h, значит переходим на метку LP0 и выводим следующий символ и т.д, пока не выведем все 256 символов.
mov ax, 4ch
int 21h
Вызываем функцию 4сh прерывания 21h для выхода в DOS.