|   Войти

Вывод на экран всех 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.