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