Консультация № 193398
17.06.2018, 14:35
0.00 руб.
17.06.2018, 15:35
0 24 1
Уважаемые эксперты! Пожалуйста, помогите закомментировать каждую строчку буду очень благодарен так как не совсем понимаю код программы
[code lang=asm h=200]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[/code]

Обсуждение

давно
Старший Модератор
31795
6196
17.06.2018, 15:43
общий
Адресаты:
Закомментировать каждую строчку легко: В начале каждой строчки ставите ;


Код нужно добавлять, с помощью кнопкок
или
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402031
115
18.06.2018, 06:57
общий
Закомментировать каждую строчку можно еще проще
В начале кода пишем оператор (comment #),
а в конце кода (#)
Текст находящийся между comment # и # будет закомментирован.
давно
Посетитель
7438
7205
18.06.2018, 10:28
общий
Адресаты:
Наши эксперты шутят Исходя из двусмысленности сказанного Вами
Так понимаю, требуется написать комментарий к каждой строке кода...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
402158
7
18.06.2018, 10:55
общий
Цитата: Лысков Игорь Витальевич
можете помощь ?
давно
Посетитель
402031
115
18.06.2018, 11:08
общий
18.06.2018, 11:11
Конечно же это шутка, как поставлен вопрос, такой и ответ.
Помочь можно, но только толку от этой помощи будет мало.
В интернете полно подробных описаний инструкций процессора х86.
Находишь, читаешь и пишешь комментарии для каждой команды.
давно
Посетитель
7438
7205
18.06.2018, 11:23
общий
это ответ
Здравствуйте, rmd!
Держите... Разбирайтесь...
[code lang=asm h=200]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 ;конец программы с указанием начальной точки программы

[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
18.06.2018, 11:36
общий
18.06.2018, 14:17
Адресаты:
Обращаться к кому-то надо не с помощью цитирования, а
1) нажав на имя под аватаром; либо
2) выбрать в списке "Кому:".
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
18.06.2018, 11:44
общий
Адресаты:
В интернете полно подробных описаний инструкций процессора х86.
Находишь, читаешь и пишешь комментарии для каждой команды.
Я бы не сказал, что знания одних только инструкций достаточно...
Но абсолютно согласен с тем, что без кропотливой самостоятельной работы толку не будет
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
402031
115
18.06.2018, 12:14
общий
Адресаты:

Вот и я о том же.
Если просишь помощи, то спрашивай как сделать, а не проси что бы сделали.
Тогда и пользы будет больше.
Сам бьюсь вторую неделю не могу победить RAGrid.
давно
Старший Модератор
31795
6196
18.06.2018, 13:41
общий
Адресаты:
Цитата: cain52
Закомментировать каждую строчку можно еще проще

так делается, когда просят закомментировать весь код.

А когда
Цитата: rmd
помогите закомментировать каждую строчку

Тут без ; никак.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
18.06.2018, 14:09
общий
18.06.2018, 14:11
Адресаты:
Случайно, вот этот примерчик GridDemoLib1.rar (17.7 кб) не на тот RAGrid, который пытаетесь победить?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
402031
115
18.06.2018, 17:21
общий
Адресаты:

Большое спасибо, но это все не то.
У меня есть полный комплект исходников RAGrig контрола с примерами.
Но все эти примеры выполнены под ODBC.
У меня задача сделать это все при помощи MySql API.
А отсюда и проблемы. Под ODBC все работает.
давно
Посетитель
402031
115
18.06.2018, 17:25
общий
Я понял, как сформировать таблицу RAGril и заполнить заголовки столбцов
А вот с данными, что то затык. Пока не получается.
А если выводит, то какие то каракули.
давно
Посетитель
402158
7
22.06.2018, 08:43
общий
22.06.2018, 08:44
Адресаты:
Спасибо большое можно спросить кое что ?
ret ;равно - выходим, фактически переходим на смещенио 0,
; там находится команда int 20h, которая и завершает программу
Почему int 20h? У меня как бы нету же int20h
И что такое ret ? Это разве не возвращения ?
давно
Посетитель
7438
7205
22.06.2018, 10:22
общий
Адресаты:
Найдите описание, что такое PSP (Program Segment Prefix). Посмотрите, что там находится.
Еще подсказка: перед вызовом программы в стек заносится 0
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
402158
7
25.06.2018, 00:18
общий
Адресаты:
Ret - равно выходим фактически переходим на смещению 0;
Это как я понял мы возвращаем программу и смешаем на ноль ?
Вот это не понял я
Там находится команда int20h,которая и завершает программу ?где моей программе int20h которая завершает программу?извините но я новичок ещё тот
Жду с нетерпением вашего ответа
Заранее спасибо!!!
давно
Посетитель
402158
7
25.06.2018, 00:33
общий
Адресаты:
После ret та мы должны попасть int20h ?
Где находится int 20h?
давно
Посетитель
7438
7205
25.06.2018, 10:46
общий
Цитата: Лысков Игорь Витальевич
без кропотливой самостоятельной работы толку не будет
Я же Вам дал подсказку
Цитата: Лысков Игорь Витальевич
Найдите описание, что такое PSP (Program Segment Prefix). Посмотрите, что там находится.
Если хотите изучить Ассемблер и все, что с ним связано, "закатывайте рукава" и начинайте "рыть", причем самостоятельно. Заданный Вами вопрос - это очень простой вопрос. Вы в состоянии по подсказке разобраться в нем самостоятельно. Если же нет, то это не Ваше.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
402158
7
25.06.2018, 11:25
общий
Адресаты:
Int 20h уже есть psp ? Как бы оно задаётся автоматически ?
давно
Посетитель
402158
7
25.06.2018, 11:26
общий
Адресаты:
После ret
давно
Старший Модератор
31795
6196
25.06.2018, 11:36
общий
Адресаты:
Очень внимательно прочитайте этот мануал.

Главы 3.2 и 3.3 Вы должны - запомнить, выучить до последней запятой.
Без понимания этой информации, у Вас постоянно будут вопросы, на простые вещи связанные с ассемблером.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
25.06.2018, 11:38
общий
Адресаты:
Я Вам сказал более, чем достаточно. Дальше разбирайтесь самостоятельно.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
402158
7
25.06.2018, 17:20
общий
Адресаты:
Правильно?
если в конце главной подпрограммы прикладной программы стоит команда ret, то при попадании этой команды на ЦП, в качестве адреса возврата из стека будет выбран 0 и, следовательно, следующей исполняемой командой будет “int 20h”.
давно
Посетитель
7438
7205
25.06.2018, 17:45
общий
Адресаты:
Правильно
Небольшое дополнение: все это сработает при двух условиях:
1) не был нарушен стек. т.е. чтобы на момент отработки команды ret в вершине стека лежал 0.
2) чтобы CS был равен сегменту PSP, чтобы была извлечена команда int 20h по адресу 0
Условие 1) будет выполнено, если аккуратно писать код
А 2) для программ в формате COM (если конечно не использованы программная сегментная реализация с длинными переходами),
т.е. если использовать модель памяти TINY, когда все сегментные регистры равны адресу одного сегмента памяти,
то программу вполне можно завершать командой ret

К слову, лично я предпочитаю завершать все программы явными командами
[code lang=asm]mov ax, 4c00h
int 21h[/code]Т.к. они работают всегда и при любых условиях
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа