Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

cain52
Статус: 1-й класс
Рейтинг: 4
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 0
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1698
Дата выхода:22.06.2018, 14:45
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:59 / 20
Вопросов / ответов:1 / 1

Консультация # 193398: Уважаемые эксперты! Пожалуйста, помогите закомментировать каждую строчку буду очень благодарен так как не совсем понимаю код программы
Код (Assembler) :: выделить код
model 
...

Консультация # 193398:

Уважаемые эксперты! Пожалуйста, помогите закомментировать каждую строчку буду очень благодарен так как не совсем понимаю код программы

Код (Assembler) :: выделить код
model   tiny
code
org 100h
n   equ 8;количество строк-столбцов
m   equ 3;количество символов на поле
mh  equ 2;норизонтальная коррекция
mv  equ 1;вертикальная коррекция
char    equ 0DBh;выводимый символ
white   equ 15;цвет символа
time    equ 1Fh;задержка
;начальные установки
begin:  mov ax,3
    int 10h
    mov ax,0B800h
    mov es,ax
    mov si,40h
    mov ds,si
    mov ax,white*256+char
;работа
start:  xor di,di
;цикл по строкам
    mov cx,n
L1: push    cx
;цикл размера строки
    mov cx,mv*m
L2: push    cx
;цикл в строке
    push    di
    mov cx,n
L3: push    cx
;цикл одно поле
    mov cx,mh*m
    rep stosw
    xor al,char
;
    pop cx
    loop    L3
    pop di
    add di,160
;
    pop cx
    loop    L2
    xor al,char
;
    pop cx
    loop    l1
    xor ax,char
;ожидание
wait:   mov bx,[si]
    and bx,time
    jnz wait
;контроль выхода
    push    ax
    mov ah,1
    int 16h
    pop ax
    jz  start
    push    ax
    xor ax,ax
    int 16h
    cmp ah,1
    pop ax
    jnz start
    ret
end begin

Дата отправки: 17.06.2018, 14:35
Вопрос задал: rmd (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, rmd!
Держите... Разбирайтесь... smile

Код (Assembler) :: выделить код
model   tiny		;модель памяти, все в одном сегменте
code 			;сегмент кода
org 100h		;необходимо для формата файла COM
n   equ 8			;количество строк-столбцов (размерность доски)
m   equ 3			;количество символов на поле (высота и ширина клетки)
mh  equ 2			;горизонтальная коррекция (высота символа в 2 раза больше, чем ширина)
mv  equ 1			;вертикальная коррекция (вертикальная не меняется)
char    equ 0DBh		;выводимый символ "полностью закрашенный прямоугольник" в кодировке ДОС
white   equ 15			;цвет символа (ярко-белый)
time    equ 1Fh		;задержка (умножается на тик таймера 1/18.2 сек) под Windows весьма условно

;начальные установки 
begin:			;начало программы
    mov ax,3 		;ah=0 - установка видеорежима, al=3 - текстовый 25х80
    int 10h		; вызов видеосервис БИОСа (необходимо для прямой записи в память под XP+)
    mov ax, 0B800h	;адрес сегмента видеопамяти
    mov es, ax 	;будем адресовать видеопамять при помощи ES
    mov si, 40h	;адрес сегмента данных ДОСа и, одновременно, смещение переменной ДОСа, 
			; в которой лежит переменная для автоматического подсчета паузы
    mov ds, si 	;сегмент ДОСа адресуем при помощи DS
    mov ax,white*256+char ;выводимый символ с цветом

;работа (выводим доску)
start:  xor di, di     ;адрес в видеосегменте (будем выводить с начала 0 страницы)
;цикл по строкам 
    mov     cx, n      ;количество строк клеток
L1: push    cx         ;сохраним в стеке
;цикл размера строки 
    mov     cx, mv*m   ;количество строк в клетке (с учетом коэффициента 1)
L2: push    cx         ;сохраняем в стеке
;цикл в строке
    push    di         ;сохраним адрес вывода (для перехода на другую строку)
    mov     cx, n      ;количество клеток в строке
L3: push    cx         ;цикл вывода полной строки символов
;цикл одно поле 
    mov     cx, mh*m   ;количество символов в клетке (с учетом коэффициента 2)
    rep     stosw      ;выводим одну строку клетки
    xor     al, char   ;меняем символ 0dbh <-> 0 (для соседней клетки)
; 
    pop     cx         ;восстанавливаем счетчик клеток в строке
    loop    L3         ;на повтор вывода одной полной строки
    pop     di         ;восстанавливаем адрес выводимых символов
    add     di, 160    ;на адрес следующей строки 80*2
; 
    pop     cx         ;восстанавливаем счетчик строк в клетке
    loop    L2         ;на вывод всех полных строк одного ряда клеток
    xor     al, char   ;меняем символ клетки для следующего ряда клеток
; 
    pop     cx         ;восстанавливаем количество строк клеток
    loop    l1         ;на вывод остальных строк клеток

    xor     ax, char   ;меняем начальный символ для следующего вывода, чтобы доска меняла раскраску
    
;ожидание 
wait:   mov bx, [si]   ;читаем системный счетчик тиков
    and     bx, time   ;проверяем его, сменились ли младшие 5 бит на 0
    jnz     wait       ;нет - ждем
;контроль выхода       ;проверяем выход по ESC
    push    ax         ;сохраним выводимый символ и атрибут (цвет) в стеке
    mov     ah, 1      ;опрос, есть ли что "от клавиатуры"
    int     16h        ;сервис клавиатуры
    pop     ax         ;восстановим символ и цвет
    jz      start      ;нажатия не было - на новый вывод
    push    ax         ;опять сохраним, т.к. было нажатие
    xor     ax, ax     ;считываем код клавиши
    int     16h
    cmp     ah, 1      ;ah = скан-код, равно ESC?
    pop     ax         ;восстановим символ и цвет
    jnz     start      ;нет - на повтор вывода
    ret                ;равно - выходим, фактически переходим на смещенио 0,
                       ; там находится команда int 20h, которая и завершает программу
end begin              ;конец программы с указанием начальной точки программы

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 18.06.2018, 11:23
Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное