Поясните код программы

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
shurc
Сообщения: 1
Зарегистрирован: 18 апр 2007, 20:18

Здравствуйте! Пишу самостоятельную работу. Задание: вывод таблицы ASCII символов. В нете нашел код. Пролинковал – exe-шник получился, вроде, как надо. Но вот только в ассемблере я „0”. Потому прошу, кому невпадло, помочь разобраться с кодом. (хотябы просто написать комментарии через ; послек аждой строки)
Зараннее благодарен.
Исходній код:

model tiny
codeseg
startupcode
mov ax,3
int 10h
mov ax,0b800h
mov es,ax

mov dl,16
mov ah,0bh
mov al,0
mov cx,255
mov bx,166

rus:
mov es:[bx],ax

add al,1
add bx,6
cmp dl,al
jnz rrr
add bx,64
add dl,16
rrr:
loop rus

mov ah,14
mov al,'0'
mov cx,16
mov bx,6
mov dl,':'
mov di,160
stroka:
mov es:[bx],ax
mov es:[di],ax
add di,160
add al,1
add bx,6
cmp al,dl
jnz ddd

mov al,'A'
mov dl,'G'
ddd:
loop stroka

MOV AH,0
INT 16h
INT 20h
end
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Вообще код довольно грязный и требует знания структуры текстовой видеопамяти. Хотя можно было бы сделать гораздо проще.
&quot писал(а):mov ax,3
int 10h
Текстовый видеорежим - 80х25 символов
&quot писал(а):mov ax,0b800h
mov es,ax
Сегмент тестовой видеопамяти пересылается в ES, подготавливая его к работе
&quot писал(а):mov dl,16
mov ah,0bh
mov al,0
mov cx,255
mov bx,166
DL - число выводимых символов на строку
AH - аттрибут текста, голубой цвет символов на черном фоне (кажется так)
AL - код символа для вывода
CX - число символов для вывода
&quot писал(а):mov es:[bx],ax
add al,1
add bx,6
Вывод на экран аттриб. символа и сам символ, код символа увелич. на 1, место для вывода сдвигается на 3 позиции
&quot писал(а):cmp dl,al
jnz rrr
add bx,64
add dl,16
rrr:
loop rus
Если число выведеных символов на строку не DL (16), то пропустить две комманды
Иначе перейди к следующей строке, DL = DL + 16 (следующая граница)
&quot писал(а):loop rus
Уменьшить на 1 CX и перейти к метке, если в СХ не 0. Короче повторить все это 255 раз
&quot писал(а):mov ah,14
mov al,'0'
mov cx,16
mov bx,6
mov dl,':'
mov di,160
АН - цвет фона - черный, текста - желтый (вроде так)
AL - символ с кодом 48, или просто "0"
СХ - число символов для вывода
BX - первая позиция выводимого символа
Dl - символ с кодом 58, следующий после "9" - нужен для проверки
DI - вторая позиция выводимого символа
&quot писал(а):mov es:[bx],ax
mov es:[di],ax
вывод символа с аттрибутом в две разные позиции
&quot писал(а):add di,160
add al,1
add bx,6
к DI (вторая позиция) прибавляется 80*2 (длина строки), фактически опускается на одну строку вниз
АL - следующий символ
BX - первая позиция, на 3 символа вправо
&quot писал(а):cmp al,dl
jnz ddd
mov al,'A'
mov dl,'G'
ddd:
loop stroka
Если AL не ':', то продолжить
Иначе AL = 'A', DL (граница) = 'G'
Loop - повторить CX раз
&quot писал(а):MOV AH,0
INT 16h
Ждем нажатия кнопки
&quot писал(а):INT 20h
Нерекомендуемое мною завершение программы, т.к. прерывание в основном специализируется на обработке аппаратных прерываний (IRQ) - можно сказать "понты автора". На многих NT системах вызывает крах процессора NTVDM.
It's a long way to the top if you wanna rock'n'roll
Sergey_
Сообщения: 8
Зарегистрирован: 20 апр 2007, 12:29

mov ax, 4c00h
int 21h

much funny
главное - не забыть что кодишь :)
Ответить