Создание программ на языке 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
Состояние: Консультация закрыта
Здравствуйте, rmd! Держите... Разбирайтесь...
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 ;конец программы с указанием начальной точки программы
 Зенченко Константин Николаевич
Старший модератор
ID: 31795
# 1
0
отменить редактирование
|
rmd: Закомментировать каждую строчку легко: В начале каждой строчки ставите ;
Код нужно добавлять, с помощью кнопкок или  ===== Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать. |
 cain52
3-й класс
ID: 402031
# 2
0
отменить редактирование
|
Закомментировать каждую строчку можно еще проще В начале кода пишем оператор (comment #), а в конце кода (#) Текст находящийся между comment # и # будет закомментирован. |
 Лысков Игорь Витальевич
Старший модератор
ID: 7438
# 3
+1
отменить редактирование
|
rmd: Наши эксперты шутят Исходя из двусмысленности сказанного Вами Так понимаю, требуется написать комментарий к каждой строке кода... ===== "Если вы заметили, что вы на стороне большинства, — это верный признак того, что пора меняться." Марк Твен |
rmd
Посетитель
ID: 402158
# 4
0
отменить редактирование
|
|
 cain52
3-й класс
ID: 402031
# 5
+2
отменить редактирование
|
Конечно же это шутка, как поставлен вопрос, такой и ответ. Помочь можно, но только толку от этой помощи будет мало. В интернете полно подробных описаний инструкций процессора х86. Находишь, читаешь и пишешь комментарии для каждой команды. ----- Последнее редактирование 18.06.2018, 11:11 cain52 (3-й класс) |
 Лысков Игорь Витальевич
Старший модератор
ID: 7438
# 6
0
отменить редактирование
|
rmd: Обращаться к кому-то надо не с помощью цитирования, а 1) нажав на имя под аватаром; либо 2) выбрать в списке "Кому:". ----- Последнее редактирование 18.06.2018, 14:17 Лысков Игорь Витальевич (Старший модератор) ===== "Если вы заметили, что вы на стороне большинства, — это верный признак того, что пора меняться." Марк Твен |
 Лысков Игорь Витальевич
Старший модератор
ID: 7438
# 7
0
отменить редактирование
|
cain52:В интернете полно подробных описаний инструкций процессора х86. Находишь, читаешь и пишешь комментарии для каждой команды. Я бы не сказал, что знания одних только инструкций достаточно... Но абсолютно согласен с тем, что без кропотливой самостоятельной работы толку не будет
===== "Если вы заметили, что вы на стороне большинства, — это верный признак того, что пора меняться." Марк Твен |
 cain52
3-й класс
ID: 402031
# 8
0
отменить редактирование
|
Лысков Игорь Витальевич, Лысков Игорь Витальевич: Вот и я о том же. Если просишь помощи, то спрашивай как сделать, а не проси что бы сделали. Тогда и пользы будет больше. Сам бьюсь вторую неделю не могу победить RAGrid.
|
 Зенченко Константин Николаевич
Старший модератор
ID: 31795
# 9
0
отменить редактирование
|
cain52:Закомментировать каждую строчку можно еще проще так делается, когда просят закомментировать весь код. А когда
помогите закомментировать каждую строчку Тут без ; никак.===== Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать. |
 Лысков Игорь Витальевич
Старший модератор
ID: 7438
# 10
0
отменить редактирование
|
cain52: Случайно, вот этот примерчик GridDemoLib1.rar (17.7 кб) не на тот RAGrid, который пытаетесь победить? ----- Последнее редактирование 18.06.2018, 14:11 Лысков Игорь Витальевич (Старший модератор) ===== "Если вы заметили, что вы на стороне большинства, — это верный признак того, что пора меняться." Марк Твен |
 cain52
3-й класс
ID: 402031
# 11
0
отменить редактирование
|
Лысков Игорь Витальевич: Большое спасибо, но это все не то. У меня есть полный комплект исходников RAGrig контрола с примерами. Но все эти примеры выполнены под ODBC. У меня задача сделать это все при помощи MySql API. А отсюда и проблемы. Под ODBC все работает.
|
 cain52
3-й класс
ID: 402031
# 12
0
отменить редактирование
|
Я понял, как сформировать таблицу RAGril и заполнить заголовки столбцов А вот с данными, что то затык. Пока не получается. А если выводит, то какие то каракули. |
rmd
Посетитель
ID: 402158
# 13
0
отменить редактирование
|
Лысков Игорь Витальевич: Спасибо большое можно спросить кое что ? ret ;равно - выходим, фактически переходим на смещенио 0, ; там находится команда int 20h, которая и завершает программу Почему int 20h? У меня как бы нету же int20h И что такое ret ? Это разве не возвращения ? ----- Последнее редактирование 22.06.2018, 08:44 rmd (Посетитель) |
 Лысков Игорь Витальевич
Старший модератор
ID: 7438
# 14
0
отменить редактирование
|
rmd: Найдите описание, что такое PSP (Program Segment Prefix). Посмотрите, что там находится. Еще подсказка: перед вызовом программы в стек заносится 0 ===== "Если вы заметили, что вы на стороне большинства, — это верный признак того, что пора меняться." Марк Твен |
rmd
Посетитель
ID: 402158
# 15
0
отменить редактирование
|
Лысков Игорь Витальевич: Ret - равно выходим фактически переходим на смещению 0; Это как я понял мы возвращаем программу и смешаем на ноль ? Вот это не понял я Там находится команда int20h,которая и завершает программу ?где моей программе int20h которая завершает программу?извините но я новичок ещё тот Жду с нетерпением вашего ответа Заранее спасибо!!! |
rmd
Посетитель
ID: 402158
# 16
0
отменить редактирование
|
Лысков Игорь Витальевич: После ret та мы должны попасть int20h ? Где находится int 20h? |
 Лысков Игорь Витальевич
Старший модератор
ID: 7438
# 17
0
отменить редактирование
|
без кропотливой самостоятельной работы толку не будет Я же Вам дал подсказкуНайдите описание, что такое PSP (Program Segment Prefix). Посмотрите, что там находится. Если хотите изучить Ассемблер и все, что с ним связано, "закатывайте рукава" и начинайте "рыть", причем самостоятельно. Заданный Вами вопрос - это очень простой вопрос. Вы в состоянии по подсказке разобраться в нем самостоятельно. Если же нет, то это не Ваше.===== "Если вы заметили, что вы на стороне большинства, — это верный признак того, что пора меняться." Марк Твен |
rmd
Посетитель
ID: 402158
# 18
0
отменить редактирование
|
Лысков Игорь Витальевич: Int 20h уже есть psp ? Как бы оно задаётся автоматически ? |
rmd
Посетитель
ID: 402158
# 19
0
отменить редактирование
|
Лысков Игорь Витальевич: После ret |
 Зенченко Константин Николаевич
Старший модератор
ID: 31795
# 20
0
отменить редактирование
|
rmd: Очень внимательно прочитайте этот мануал.
Главы 3.2 и 3.3 Вы должны - запомнить, выучить до последней запятой. Без понимания этой информации, у Вас постоянно будут вопросы, на простые вещи связанные с ассемблером. ===== Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать. |
 Лысков Игорь Витальевич
Старший модератор
ID: 7438
# 21
0
отменить редактирование
|
rmd: Я Вам сказал более, чем достаточно. Дальше разбирайтесь самостоятельно. ===== "Если вы заметили, что вы на стороне большинства, — это верный признак того, что пора меняться." Марк Твен |
rmd
Посетитель
ID: 402158
# 22
0
отменить редактирование
|
Лысков Игорь Витальевич: Правильно? если в конце главной подпрограммы прикладной программы стоит команда ret, то при попадании этой команды на ЦП, в качестве адреса возврата из стека будет выбран 0 и, следовательно, следующей исполняемой командой будет “int 20h”. |
 Лысков Игорь Витальевич
Старший модератор
ID: 7438
# 23
0
отменить редактирование
|
rmd: Правильно Небольшое дополнение: все это сработает при двух условиях: 1) не был нарушен стек. т.е. чтобы на момент отработки команды ret в вершине стека лежал 0. 2) чтобы CS был равен сегменту PSP, чтобы была извлечена команда int 20h по адресу 0 Условие 1) будет выполнено, если аккуратно писать код А 2) для программ в формате COM (если конечно не использованы программная сегментная реализация с длинными переходами), т.е. если использовать модель памяти TINY, когда все сегментные регистры равны адресу одного сегмента памяти, то программу вполне можно завершать командой ret
К слову, лично я предпочитаю завершать все программы явными командами
Т.к. они работают всегда и при любых условиях ===== "Если вы заметили, что вы на стороне большинства, — это верный признак того, что пора меняться." Марк Твен | |
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему. Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.
|