23.07.2019, 04:42 [+3 UTC]
в нашей команде: 3 754 чел. | участники онлайн: 1 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.77 (31.05.2019)
JS-v.1.34 | CSS-v.3.35

Общие новости:
28.04.2019, 09:13

Форум:
18.07.2019, 12:26

Последний вопрос:
23.07.2019, 02:24
Всего: 149957

Последний ответ:
22.07.2019, 09:12
Всего: 258719

Последняя рассылка:
22.07.2019, 20:45

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
03.05.2012, 15:24 »
Посетитель - 393442
Огромное Вам спасибо! [вопрос № 185952, ответ № 270688]
22.08.2010, 11:44 »
alexandr07
Спасибо Александру Сергеевичу за хороший ответ [вопрос № 179743, ответ № 262838]
26.01.2010, 19:37 »
mcv22
Спасибо, это много и сложно для меня , не мой уровень знаний, но узнал для чего импорт и экспорт, познавательно, спасибо!!! [вопрос № 176321, ответ № 258977]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

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

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

Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 206
Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 148
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 55

Перейти к консультации №:
 

Консультация онлайн # 193398
Раздел: • Assembler
Автор вопроса: rmd (Посетитель)
Отправлена: 17.06.2018, 14:35
Поступило ответов: 1

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

Код (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, 15:35 Зенченко Константин Николаевич (Старший модератор)

Состояние: Консультация закрыта

Ответ # 276602 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, 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

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 193398

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 1

= общий = | 17.06.2018, 15:43 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
rmd:

Закомментировать каждую строчку легко: В начале каждой строчки ставите ;
smile

Код нужно добавлять, с помощью кнопкок или

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

cain52
3-й класс

ID: 402031

# 2

= общий = | 18.06.2018, 06:57 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Закомментировать каждую строчку можно еще проще
В начале кода пишем оператор (comment #),
а в конце кода (#)
Текст находящийся между comment # и # будет закомментирован.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 3

 +1 
 
= общий = | 18.06.2018, 10:28 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
rmd:

Наши эксперты шутят smile Исходя из двусмысленности сказанного Вами smile
Так понимаю, требуется написать комментарий к каждой строке кода... smile smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

rmd
Посетитель

ID: 402158

# 4

= общий = | 18.06.2018, 10:55 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

© Цитата: Лысков Игорь Витальевич
можете помощь ?

cain52
3-й класс

ID: 402031

# 5

 +2 
 
= общий = | 18.06.2018, 11:08 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Конечно же это шутка, как поставлен вопрос, такой и ответ.
Помочь можно, но только толку от этой помощи будет мало.
В интернете полно подробных описаний инструкций процессора х86.
Находишь, читаешь и пишешь комментарии для каждой команды.

-----
Последнее редактирование 18.06.2018, 11:11 cain52 (3-й класс)

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 6

= общий = | 18.06.2018, 11:36 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
rmd:

Обращаться к кому-то надо не с помощью цитирования, а
1) нажав на имя под аватаром; либо
2) выбрать в списке "Кому:". smile

-----
Последнее редактирование 18.06.2018, 14:17 Лысков Игорь Витальевич (Старший модератор)

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 7

= общий = | 18.06.2018, 11:44 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
cain52:

© Цитата:
В интернете полно подробных описаний инструкций процессора х86.
Находишь, читаешь и пишешь комментарии для каждой команды.
Я бы не сказал, что знания одних только инструкций достаточно... smile
Но абсолютно согласен с тем, что без кропотливой самостоятельной работы толку не будет smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

cain52
3-й класс

ID: 402031

# 8

= общий = | 18.06.2018, 12:14 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич, Лысков Игорь Витальевич:


Вот и я о том же.
Если просишь помощи, то спрашивай как сделать, а не проси что бы сделали.
Тогда и пользы будет больше.
Сам бьюсь вторую неделю не могу победить RAGrid.

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 9

= общий = | 18.06.2018, 13:41 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
cain52:

© Цитата: cain52
Закомментировать каждую строчку можно еще проще

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

Тут без ; никак.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 10

= общий = | 18.06.2018, 14:09 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
cain52:

Случайно, вот этот примерчик GridDemoLib1.rar (17.7 кб) не на тот RAGrid, который пытаетесь победить? smile

-----
Последнее редактирование 18.06.2018, 14:11 Лысков Игорь Витальевич (Старший модератор)

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

cain52
3-й класс

ID: 402031

# 11

= общий = | 18.06.2018, 17:21 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:


Большое спасибо, но это все не то.
У меня есть полный комплект исходников RAGrig контрола с примерами.
Но все эти примеры выполнены под ODBC.
У меня задача сделать это все при помощи MySql API.
А отсюда и проблемы. Под ODBC все работает.

cain52
3-й класс

ID: 402031

# 12

= общий = | 18.06.2018, 17:25 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Я понял, как сформировать таблицу RAGril и заполнить заголовки столбцов
А вот с данными, что то затык. Пока не получается.
А если выводит, то какие то каракули.

rmd
Посетитель

ID: 402158

# 13

= общий = | 22.06.2018, 08:43 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Спасибо большое можно спросить кое что ?
ret ;равно - выходим, фактически переходим на смещенио 0,
; там находится команда int 20h, которая и завершает программу
Почему int 20h? У меня как бы нету же int20h
И что такое ret ? Это разве не возвращения ?

-----
Последнее редактирование 22.06.2018, 08:44 rmd (Посетитель)

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 14

= общий = | 22.06.2018, 10:22 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
rmd:

Найдите описание, что такое PSP (Program Segment Prefix). Посмотрите, что там находится.
Еще подсказка: перед вызовом программы в стек заносится 0 smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

rmd
Посетитель

ID: 402158

# 15

= общий = | 25.06.2018, 00:18 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Ret - равно выходим фактически переходим на смещению 0;
Это как я понял мы возвращаем программу и смешаем на ноль ?
Вот это не понял я
Там находится команда int20h,которая и завершает программу ?где моей программе int20h которая завершает программу?извините но я новичок ещё тот
Жду с нетерпением вашего ответа
Заранее спасибо!!!

rmd
Посетитель

ID: 402158

# 16

= общий = | 25.06.2018, 00:33 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

После ret та мы должны попасть int20h ?
Где находится int 20h?

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 17

= общий = | 25.06.2018, 10:46 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

© Цитата: Лысков Игорь Витальевич
без кропотливой самостоятельной работы толку не будет
Я же Вам дал подсказку
© Цитата: Лысков Игорь Витальевич
Найдите описание, что такое PSP (Program Segment Prefix). Посмотрите, что там находится.
Если хотите изучить Ассемблер и все, что с ним связано, "закатывайте рукава" и начинайте "рыть", причем самостоятельно. Заданный Вами вопрос - это очень простой вопрос. Вы в состоянии по подсказке разобраться в нем самостоятельно. Если же нет, то это не Ваше.

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

rmd
Посетитель

ID: 402158

# 18

= общий = | 25.06.2018, 11:25 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Int 20h уже есть psp ? Как бы оно задаётся автоматически ?

rmd
Посетитель

ID: 402158

# 19

= общий = | 25.06.2018, 11:26 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

После ret

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 20

= общий = | 25.06.2018, 11:36 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
rmd:

Очень внимательно прочитайте этот мануал.

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

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 21

= общий = | 25.06.2018, 11:38 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
rmd:

Я Вам сказал более, чем достаточно. Дальше разбирайтесь самостоятельно.

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

rmd
Посетитель

ID: 402158

# 22

= общий = | 25.06.2018, 17:20 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Правильно?
если в конце главной подпрограммы прикладной программы стоит команда ret, то при попадании этой команды на ЦП, в качестве адреса возврата из стека будет выбран 0 и, следовательно, следующей исполняемой командой будет “int 20h”.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 23

= общий = | 25.06.2018, 17:45 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
rmd:

Правильно smile
Небольшое дополнение: все это сработает при двух условиях:
1) не был нарушен стек. т.е. чтобы на момент отработки команды ret в вершине стека лежал 0.
2) чтобы CS был равен сегменту PSP, чтобы была извлечена команда int 20h по адресу 0
Условие 1) будет выполнено, если аккуратно писать код
А 2) для программ в формате COM (если конечно не использованы программная сегментная реализация с длинными переходами),
т.е. если использовать модель памяти TINY, когда все сегментные регистры равны адресу одного сегмента памяти,
то программу вполне можно завершать командой ret

К слову, лично я предпочитаю завершать все программы явными командами

Код (Assembler) :: выделить код
mov ax, 4c00h
int 21h
Т.к. они работают всегда и при любых условиях smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.15721 сек.

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.77 от 31.05.2019
Версия JS: 1.34 | Версия CSS: 3.35