21.11.2018, 20:05 [+3 UTC]
в нашей команде: 3 135 чел. | участники онлайн: 9 (рекорд: 19)

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

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

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.55 (06.11.2018)

Общие новости:
24.09.2018, 16:49

Форум:
21.11.2018, 13:37

Последний вопрос:
21.11.2018, 18:51

Последний ответ:
21.11.2018, 17:29

Последняя рассылка:
21.11.2018, 18:45

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

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

Наша кнопка:

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

Отзывы о нас:
06.05.2010, 10:50 »
Спиридонов Данил Сергеевич
Спасибо! [вопрос № 178176, ответ № 261226]
26.03.2012, 16:03 »
lamed
Спасибо, Александр Львович! [вопрос № 185659, ответ № 270320]

РАЗДЕЛ • Assembler

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

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

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

Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 699
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 91
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 14

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

Консультация онлайн # 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

Добавлен тег CODE
--------

• Отредактировал: Зенченко Константин Николаевич (Модератор)
• Дата редактирования: 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
1-й класс

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
1-й класс

ID: 402031

# 5

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

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

• Отредактировал: cain52 (1-й класс)
• Дата редактирования: 18.06.2018, 11:11

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

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
1-й класс

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
1-й класс

ID: 402031

# 11

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


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

cain52
1-й класс

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 ? Это разве не возвращения ?

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

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

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.31002 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.55 от 06.11.2018