Се начнем повесть сию...
Итак, уважаемые, позвольте мне представить мой туториал №1. :D
Он посвящен основам программирования графики на паскалевском ассемблере. Он предназначен для тех, кого достала тормознутость графики на пасе (а работать с графикой с его процедурами я бы не советовал - мееедленно...), кто хотел бы написать БЫСТРУЮ игру, да и для тех, кому вообще интересен асм.
Внимание: Данные эксперименты не совсем совместимы с модулем Graph, поэтому крайне нежелательно его включать.
Для использования примеров вам необходима карточка VGA, имеющая режим 320*200, TP версии 6.0 и выше, и желание разобраться.
В сегодняшней, первой части, я расскажу о том, что из себя представляет режим 320*200 8 бит, как его врубить, и как с ним работать.
Этот режим имеет номер 13 в шеснацатеричной системе счисления или 19 в десятичной. В дальнейшем 16-теричный вид будет отмечаться буквой h (Например 13h) а десятичный отмечатся не будет (19).
Немного теории:
Раз у нас 8-битный режим, то
1. На каждую ячейку(я.п.) памяти приходится по одной точке! Это просто чудесно! т.к. не рассматриваются случаи, когда в один байт картинки вмещается 2 точки (в 16ти цветных режимах), а то работа по разделению байта - просто геморой.
2.Мы можем работать с 2^8=256 цветами (в отличие от 16 в пасе)!!!!!!!!!
3. Базовый адрес памяти, начиная с которого изображение в графических режимах выводится на монитор, равен 0A000:0000h. следующие 64000(320*200) байта в данном режиме как раз и выводятся на экран.
5. Для возврата из графического режима я буду использовать текстовый режим № 3(80*25*16)
Ну так вот, для того, чтобы менять режимы будем использовать функцию BIOS установки режима:
------------------------------------------------------------------------
Установка видеорежима(прерывание 10h):
На входе:
ah=0 ; Установить режим
al = ; Номер режима
------------------------------------------------------------------------
В нашем случае:
procedure Set13h;
begin
asm
mov ah,00h ; Установить режим
mov al ,13h ; Номер режима 320*200*256цв
int 10h ; Номер прерывания
end;
end;
procedure Close13h;
begin
asm
mov ah,00h ; Установить режим
mov al ,03h ; Текстовый режим 80*25*16цв
int 10h ; Номер прерывания
end;
end;
procedure clscr(col:byte);
begin
asm
mov ax,0A000h
mov es,ax
xor di,di
mov al,[col]
mov cx,64000
rep StosB
end;
end;
mov ax,0a000h
mov es,ax
xor di,di
mov al,[col]
mov cx,64000
rep StosB
@l1:
StosB
loop @l1
program darktut;
uses crt;
procedure set13h;
begin
asm
mov ax,0013h
int 10h
cld
end;
end;
procedure close13h;
begin
asm
mov ax,0003h
int 10h
end;
end;
procedure clscr(col:byte);
begin
asm
push 0a000h
pop es
xor di,di
mov cx,64000
mov al,col
rep stosb
end;
end;
begin
randomize;
set13h;
repeat
clscr(random(256));
delay(20000);
until keypressed;
close13h;
end.
если уж ты пишешь туториал ты продумывай каждое своё слово
так как по этой "штуке" может кто-то вздумает учиться...
и писать типа "Сегмент - это часть адреса, " - это полный бред
сегмент - это непрерывный участок памяти размером в 64K
(для Real Mode проца)
а так продолжай писать...
может кого асмом заинтересуешь ;)
Полностью согласен с ___Alex___ по поводу сегмента. А вот остальные ошибки напишу позже. Похоже снова придется тебе переделывать...
Второй раз уже круче, но ошибок больше.
Ок, давайте, выкристализовывайте, а на тему сегмента - все вопросы к моим преподам, ;D
А вот что я думаю: Сегмент и смещение ВМЕСТЕ составляют ЛОГИЧЕСКИЙ адрес, который в результате сдвига сегмента на 4 бита и сложения со смещением дает РЕАЛЬНЫЙ адрес объекта(20 бит)...
Если я не прав - то поправте...
А может есть 2 понятия слова сегмент? ;D ;D ;D
Мне не сложно переписывать туториал столько раз, сколько это понадобится, главное, чтобы это не превратилось в манию ;D
А так, я всегда рад критике - если критикуют, то то, что я пишу комуто пригодится...
Я тя понял... а унас в питере ГРОЗЫ, ;D Азачем напиватся с хорошей погоды ??? ;D
Иногда, просто нужно нажраться!!!
Держи...
Се начнем повесть сию...
Не начнем, а продолжим... ;)
Итак, уважаемые, позвольте мне представить мой туториал №1.
Конечно это не принципиально, но может писать не ТУТОРИАЛ, а как-нибудь по-другому, хотя бы по-английски; впрочем - это на твое усмотрение.
Он посвящен основам программирования графики на паскалевском ассемблере. Он предназначен для тех, кого достала тормознутость графики на пасе (а работать с графикой с его процедурами я бы не советовал - мееедленно...), кто хотел бы написать БЫСТРУЮ игру, да и для тех, кому вообще интересен асм.
Внимание: Данные эксперименты не совсем совместимы с модулем Graph, поэтому крайне нежелательно его включать.
В каком месте??
Для использования примеров вам необходима карточка VGA, имеющая режим 320*200, TP версии 6.0 и выше, и желание разобраться.
Не думаю, что сейчас хоть у кого-нибудь есть чиста VGA-адаптер; напиши совместимый.
В сегодняшней, первой части, я расскажу о том, что из себя представляет режим 320*200 8 бит, как его врубить, и как с ним работать.
Этот режим имеет номер 13 в шеснацатеричной системе счисления или 19 в десятичной. В дальнейшем 16-теричный вид будет отмечаться буквой h (Например 13h) а десятичный отмечатся не будет (19).
Не надо думать, что все на свете такие валенки; хотя также на твое усмотрение.
Немного теории:
Раз у нас 8-битный режим, то
1. На каждую ячейку(я.п.) памяти приходится по одной точке! Это просто чудесно! т.к. не рассматриваются случаи, когда в один байт картинки вмещается 2 точки (в 16ти цветных режимах), а то работа по разделению байта - просто геморой.
Случай 4-битного цвета в принципе тобой не описывается, так нечего его и затрагивать, а вывод точки там осуществляется отнюдь не так называемым "РАЗДЕЛЕНИЕМ БАЙТА".
2.Мы можем работать с 2^8=256 цветами (в отличие от 16 в пасе)!!!!!!!!!
Объясни почему 2^8.
3. Базовый адрес памяти, начиная с которого изображение в графических режимах выводится на монитор, равен 0A000:0000h. следующие 64000(320*200) байта в данном режиме как раз и выводятся на экран.
Адрес видеобуфера, а не БАЗОВЫЙ АДРЕС ПАМЯТИ
5. Для возврата из графического режима я буду использовать текстовый режим № 3(80*25*16)
Ну так вот, для того, чтобы менять режимы будем использовать функцию BIOS установки режима:
------------------------------------------------------------------------
Установка видеорежима (прерывание 10h):
На входе:
ah=0 ; Установить режим
al = ; Номер режима
------------------------------------------------------------------------
В нашем случае:
------------------------------------------------------------------------
Где директива ASSEMBLER?????????????????????????????????????
procedure Set13h;
begin
asm
mov ah,00h ; Установить режим
mov al ,13h ; Номер режима 320*200*256цв
int 10h ; Номер прерывания
end;
end;
------------------------------------------------------------------------
------------------------------------------------------------------------
procedure Close13h;
begin
asm
mov ah,00h ; Установить режим
mov al ,03h ; Текстовый режим 80*25*16цв
int 10h ; Номер прерывания
end;
end;
------------------------------------------------------------------------
Хорошо, вот мы и попали в режим 320*200*256 - возможно, скажете вы, - но Graph использовать не рекомендуют, так что же нам здесь делать?
Убери слово GRAPH.
Ну... для начала давайте очистим экран
Так где же эта проклятая очистка флага направления?????????????? О которой я талдычу уже долгое время...
------------------------------------------------------------------------
procedure clscr(col:byte);
begin
asm
mov ax,0A000h
mov es,ax
xor di,di
mov al,[col]
mov cx,64000
rep StosB
end;
end;
------------------------------------------------------------------------
Итак, введя этот код вы получите процедуру закраски экрана.
А теперь, давайте я пасскажу о ней поподробнее...
Хрень, найди другое понятие.
Сегмент - это часть адреса, которая указывает от какой ячейки начинать отсчет смещения. Он имеет размер 64Кб (65536 байт).
Каких еще переменных, если это CSeg, DSeg or someting else, то будь добр напиши.
В языках программирования используют несколько переменных, которые содержат сегменты, это cs,ds,es,ss,gs,fs. В паскале реально используются лишь первые 4.
О стеке подробнее.
И вообще, если затрагиваешь какую-то новую тему, старайся дать как можно больше инфы...
cs - сегмент кода, обычно не трогается, ds - сегмент данных, здесь размещаются данные, после использования в паскале желательно восстанавливать. ss - сегмент стэка, в этом сегменте хранится то, что заносится в стек(в ручную или при вызове процедур). Стек - что-то типа временной памяти с последовательным доступом. es,fs,gs - дополнительные регистры, на 'всякий случай'.
СМ. СЕГМЕНТ
Смещение - это вторая часть адреса, которая указывает на я.п. от начала сегмента. Принимает значения от 0 до 65535(по кол-ву байт в сегменте).
Не любые.
Обычно, для адресации я.п. используют индексные регистры di и si, но можно использовать и любые другие.
А как это происходит????????????????????????
Сегмент и смещение занимают по 16 бит(2 байта) и преобразуются в 20-ти битный адрес.
mov ax,0a000h
mov es,ax
Это связано не с отсутствием команд, а обусловлено спецификой архитектуры проца
Двумя этими командами мы помещаем в регистр es сегмент адреса видеопамяти(A000). Напрямую помещать адрес нельзя, т.е. запись типа mov es,0a000h является неверной!! По-моему это связано с отсутсвием кода команд в системе операций процессора.
Объясни как очищает
xor di,di
Туманно как-то
Эта команда очищает регистр индекса di, для того, чтобы в es:di лежал полный адрес начала выводимой памяти... Индекс di используется для "скольжения" по сегменту, т.е. он адресует ячейку памяти с номером, указанную в нем.
Внимание!
Команда mov [di],5 ничего никуда не положит!!! Во-первых компилер выдаст ош. так как не поймет размер числа пять (нужно вставить описатель word/byte/dword ptr). Но даже если мы это и поставим, то по умолчанию адресация идет через регистр DS!!!!!
Короче - переделать
Запись вида mov di,5 обозначает адресацию 5-ой ячейки, а
запись вида mov [di],5 обозначает что в ячейку es:di будет помещено значение 5. Правда, в паскале это не так. В паскале для помещения значения 5 по адресу es:di оное значение помещается в регистр, допустим, аl и используется запись вида mov es:[di],al.
mov al,[col]
Здесь я помещаю в al номер цвета закраски фона.
mov cx,64000
rep StosB
команда цикла rep повторяет следующую команду. количество повторов лежит в регистре CX.
Ее можно заменить на команду цикла loop:
@l1:
StosB
loop @l1
Команда rep сначала проверяет регистр cx на равенство 0, а затем, если он не равен, убавляет его на 1, если равен, то цикл прекращается и программа идет дальше, в отличие от команды loop, которая сначала уменьшает cx на 1, а затем проверяет его на 0. Т.е. если вы поместите в cx 0, то команда rep не выполнится ни разу, а команда loop будет выполняться 65535 раз(по максимальному размеру cx)
команда STOSB - es:[di]=al; di=di?1.
Помещает содержимое al в я.п. по адресу es:di.
В зависимости от df (флаг направления) уменьшает/увеличивает индекс di на 1. Если df = 0 то di увеличивается а если df=1, то di уменьшается. Поэтому я и указал в описании команды знак ?.
Устанавливается df (df=1) командой std, а очищается - командой cld.
Пример:
program darktut;
uses crt;
procedure set13h;
begin
asm
mov ax,0013h
int 10h
cld
end;
end;
procedure close13h;
begin
asm
mov ax,0003h
int 10h
end;
end;
procedure clscr(col:byte);
begin
asm
push 0a000h
pop es
xor di,di
mov cx,64000
mov al,col
rep stosb
end;
end;
begin
randomize;
set13h;
repeat
clscr(random(256));
delay(20000);
until keypressed;
close13h;
end.
Happy codding!!!!!!!!!!!!!
З.Ы. Если вы хотите немного оптимизировать процедуру очистки экрана - то можете уменьшить значение
счетчика в 2 раза и пересылать сразу по 2 байта:
Туманно, в плане РАСШИРЕНИЯ ЦВЕТА.
mov ah,al ;расширяю цвет...
mov cx,32000
rep StosW
команда StosW: es[di]=ax; di=di+2;
Где прогнать-то, я то знаю, а другие вряд-ли.
З.Ы.Ы. Если вы хотите посмотреть, как будет выполнятся программа, можете ее прогнать пошагово, открыв окно Debug->Registers и нажимая F7.
Заметил
З.Ы.Ы.Ы. Просьба, если заметите неточности, или у вас есть предложения/просьбы/коментарии - высказывайте все либо на форуме forum.pascal.dax.ru, либо лично мне по почте.
Copyright by Dark.
Моя почта: darkmaze@yandex.ru
Debugged & corrected by GLuk
"Команда mov [di],5 ничего никуда не положит!!! Во-первых компилер выдаст ош.
так как не поймет размер числа пять (нужно вставить описатель word/byte/dword ptr). Но
даже если мы это и поставим, то по умолчанию адресация идет через регистр DS!!!!!
Короче - переделать"
на счёт первых двух строк всё неверно
компилятор должен знать размер памяти адресуемой адресом в ds:di в которую
надо "положить" число пять
писать надо типа mov byte ptr [di],5
пример для туториала:
если начиная с адреса ds:di в ОП находится следующая
последовательность байт: DF 10 01 FA CD 13
то после выполнения команды | память изменится следующим образом
mov byte ptr [di],5 05 10 01 FA CD 13
mov word ptr [di],5 05 00 01 FA CD 13
mov dword ptr [di],5 05 00 00 00 CD 13
значения квалификаторов:
byte - один байт
word - два байт
dword(double word) - 4 байта
И запомните правило - младший байт хранится по младшему адресу
Народ кто-нибудь кроме нас это читает?
:D
-=-=
Да-а-а :-/
-=-=-= :'(
народ может всё-таки сначала начать в тутореале объяснять основы асма, давать задания небольшие народы
чтоб "оживить" процесс обучения?
а то ведб без основ далеко не уедешь
ну как Вы ? :)
2 ___Alex___: По поводу цитаты: это в плане я неправильно что-то подправил?????????
Shadow, а что ДА-а-а - ТАК НАДО!
to GLuk
да ерунда всё это ;)
я думаю надо сначала создать тему на счёт этого типа приглашаем на обучение асму...но не в разделе по асму так как многие я думаю сюда просто не заходят
как-то это выделить!(
Что ж можно постить это в новостях?
с другой стороны кому надо тот всегда сам всё изучит...
пусть народ СКАЖЕТ надо ему это или нет...
да запостите такую тему
а там посмотрим по жедающим
Угу, ок у меня есть инфа и для начала... т.е. ввод/вывод текста в текст.режиме, работа с файлами, и т.д. и т.п.
;D
Ты б домучил сначала туториал №1... ;)
Уже давно мучаю ;D... и второй готовлю... ;D ;D ;D
P.S. и третий... токмо не кому не говорите ;D
;D без комм.
Хоть чтото без них ;D ;D ;D ;)
Извиняюсь за задержки, но у меня щас практика и сессия, поэтому временно отлучен от инета, обещаю в июне отправить исправленный и дополненый туториал ;D
Он уже существует, но к сожалению не с собой...
Теперь и я ещё читать буду, только июнь уже настал...
?? В плане долгожданный туториал from Dark ??
да давно здесь не был вот пришёл, а татуриала всё нет
забросили что ли это дело?
чё ж мы критиковать-то будем ;D
Туториал от Dark'a скоро будет готов и размещён. Предположительно в ближайщий понедельник.
Хватит критики... дело же серьезное. Туториал писать - это не фигня какая-нибудь.
в том-то и дело что фигня
Как жисть-то ___Alex___??
А если это принципиальное непонимание преимущества количества постов в данном форуме, то я складаю (с ош.; авт.) руки; мозги (хоть даже и чуть-чуть); и присутствие. В моем понимании - не от кол-ва постов зависит кол-во мозгов, или как?? ++ ко всему модера тут нет, так что если хочешь - ЗАКРЫВАЙ ТЕМУ - ведь ты же СТАРШИЙ МОДЕР!!=. А флейм - это общение через постпанковское непонимание своего личного альтерэго (это лично мнение почти что проф. психолога).
Туториал - очень хорошая идея! Жду с нетерпением!
я думаю надо или писать татуриал по обучению асма
и надо их обязательно разбивать на уроки, главы и тп
чтоб была логическая связь ну как в книгах
или "спрашивать народ" на какие темы он бы хотел видет тутариалы
первое я думаю более важно для посетителей форума
щаодно с паскалем они узнают и асм(хотя бы основы)
а писать о том что захочется - например тема первого татуриала
то тот кто знает ОСНОВЫ асма - сам с этим вопросом разберётся с лёгкостью
Теперь нужно только кому-то написать туториал... ;)
Dark же пишет ???
Правильно... вот уже месяц, СКОРО будет готово. Да и самого его чой-то не видно...
да уж, вроде и сессия то у всех(кто во воремя сдал) кончилась...
а что? есть такие, кто вовремя все сдает?!
-=Unknown=-
зачёты конечно НЕТ
а вто экзамены надо бы
Dark видимо на море уехал, так что туториал мы не очень скоро увидим!
Да я вот пожалуй сам напишу, через некоторое время...
Оффтопик: пригодилось бы нечто вроде туториала по паскалю!
GLuk
давай
не зависеть же от кого-то
как будто-то остальные не могут написать...
если что мне надо сделать пиши
смотри
http://forum.pascal.dax.ru/?board=links;action=display;num=1058013615;start=0#0
Я очень извиняюсь так как сначало практика, затем сессия, => Отлучение от Internet затем работа а затем поломка аппаратуры( конкретно модема) :'( но я щас из клуба, надеюсь здесь не сломается ;D ЛОВИТЕ. КОМЕНТИРУЙТЕ.
Се начнем повесть сию... ;D
Итак, уважаемые, позвольте мне представить мой туториал №1.
Он посвящен основам программирования графики на паскалевском ассемблере,и предназначен для тех, кого достала тормознутость графики на пасе (а работать с графикой с его процедурами я бы не советовал...), кто хотел бы написать БЫСТРУЮ игру, да и для тех, кому вообще интересен asm.
Внимание: Более-менее непонятные термины будут объясняться в глоссарии(в конце туториала).
Данные эксперименты не совсем совместимы с библиотечкой Graph, поэтому крайне нежелательно ее подключать. Конкретнее, Graph не признает вручную(без использования процедуры InitGraph) включенный режим, и не будет с ним работать.
Данный документ писался для людей с разной степенью подготовки, и поэтому здесь могут разбираться слишком элементарные вещи.
Для использования примеров вам необходима карточка VGA(хе хе, сейчас это любой видеоадаптер), поддерживающая режим 320*200, TP версии 7.0, и желание разобраться.
Начну с благодарностей: спасибо моей маме, моим учителям, авторам интересной литературы, этому форуму, лично Gluck'у и Shadow. ПРЕОГРОМНОЕ спасибо!!!
В этой, первой,(и, надеюсь, не последней) части я расскажу о том, как врубить режим 320*200*256цв., и как с ним начать работать. Этот режим в литературе можно втретить под названием MCGA-режима. (Multi Color Grafic Adapter).
Он имеет номер 13 в шеснацатеричной системе счисления или 19 в десятичной. В дальнейшем 16-теричный вид будет отмечаться буквой h или символом $ (Например 13h=$13) а десятичный отмечатся не будет (19).
Несколько общих моментов:
Начиная со стандарта VGA, видеопамять реализована в виде адресного пространства, доступ к которой возможен при помощи одной команды, тогда как для стандартов EGA и CGA характерна сложная организация видеопамяти, где простая операция записи в нее или чтения из нее невозможна, для этого требуется около десятка команд и необходимо работать с портами.
Видеобуфер реализован в виде ЛИНЕЙНОГО пространства,т.е. видеокарточка не понимает что такое координаты (представте себе одномерный массив).
1. В режиме 13h задействуется один байт памяти на одну точку, т.е. 8 бит.
2. Раз на каждую ячейку памяти приходится одна точка, то формула для рисования точки по координатам х,у выглядит так:
P(x,y)= x+y*(MaxX+1) (В нашем случае MaxX будет 319 т.е. P(x,y)=x+y*320)
3. Раз используем 8-битный (однобайтный) режим, то мы можем работать с 256 цветами (в отличие от 16 цветов в пасе)!!!!!!!!!
4. Адрес видеопамяти, начиная с которого изображение в графических режимах выводится на монитор, равен 0A000:0000h. следующие 64000 (320*200) байт в данном режиме как раз и выводятся на экран.
5. Для закрытия графического режима 13h я буду использовать текстовый режим 3(80*25*16)
Ну так вот, для того, чтобы менять режимы будем использовать функцию BIOS установки режима:
------------------------------------------------------------------------
Установка видеорежима(прерывание 10h):
На входе:
ah=00h ; Установить режим
al= ; Номер режима
Используемые регистры: ax.
------------------------------------------------------------------------
В нашем случае:
------------------------------------------------------------------------
procedure Set13h;
begin
asm
mov ah,00h ; Установить режим
mov al,13h ; Номер режима 320*200*256цв
int 10h ; Номер прерывания видеокарточки
end;
end;
------------------------------------------------------------------------
------------------------------------------------------------------------
procedure Close13h;
begin
asm
mov ah,00h ; Установить режим
mov al,03h ; Текстовый режим 80х25х16цв
int 10h ; Номер прерывания
end;
end;
------------------------------------------------------------------------
Хорошо, вот мы и попали в режим 320*200*256 - возможно, скажете вы, - но стандартные средства паскаля использовать не рекомендуют, так что же нам здесь делать?
Ну... для начала давайте покрасим экран в какой-нибудь цвет:
Это очень просто: адрес нам известен - $A000:0000, следующие 64000 байт - наш экран, поэтому этим 64000 байт просто присваиваем номер нужного нам цвета...
------------------------------------------------------------------------
procedure clscr(col:byte);
begin
asm
mov ax,0A000h
mov es,ax
xor di,di
mov al,[col]
mov cx,64000
@l1:
mov byte ptr es:[di],al
inc di
loop @l1
end;
end;
Используемые регистры: ax,es,di,cx.
------------------------------------------------------------------------
Итак, введя этот код вы получите процедуру закраски экрана.
А теперь, давайте я расскажу о ней поподробнее...
mov ax,0A000h
mov es,ax {es=$A000}
xor di,di {di=0}
Тремя этими командами мы помещаем в связку регистров es:di адрес видеопамяти.
mov al,[col]
Здесь я помещаю в al номер цвета закраски фона.
mov cx,64000
@l1:
mov byte ptr es:[di],al
inc di
loop @l1
Команда цикла loop повторяет команды,находящиеся между меткой(@l1) и самой командой. Количество повторов помещается в регистр CX.
Команда пересылки mov записывает байт из регистра al в ячейку памяти по адресу es:di
И, наконец, команда inc увеличивает di на 1, тем самым обеспечивая перемещение по пространству памяти.
Есть специальная команда, которая сразу выполняет за нас работу по пересылке байта из al в ячейку памяти es:[di] и инкрементации di - НА СЦЕНУ ПРИГЛАШАЕМ КОМАНДУ STOSB.
И ВОТ ОНА - ВОЛШЕБНАЯ!!!!!!!!! Таким образом мы можем заменить две команды
mov byte ptr es:[di],al
inc di
на одну
stosb
т.е. смотрите -
mov cx,64000
@l1:
stosb
loop @l1
Если посмотреть в умную книжку по ассемблеру, то можно увидеть что есть и другой цикл - rep, и с ним наша программа будет выглядеть еще элегантнее -
mov cx,64000
rep stosb
Я немного извиняюсь :-[, но это все что я сделал в первом туториале, но надеюсь что это еще не все, и я перейду в такой режим работы над туториалами, когда я смогу давать больше материала и по качеству гораздо лучше ;D; несомненно есть много людей, которые намного лучше меня во всем этом разбираются, но и у меня все впереди... Я НЕ ВОЛШЕБНИК, Я ТОЛЬКО УЧУСЬ!!!
:-[Извините если слишком всего много или наоборот мало. :-[
До новых встреч.
Заключительный Пример:
uses crt;
procedure clscr(col:byte);
begin
asm
mov ax,0a000h
mov es,ax
xor di,di
mov cx,64000
mov al,col
@l1:
mov byte ptr es:[di],al
inc di
loop @l1
end;
end;
procedure clscr1(col:byte);
begin
asm
mov ax,0a000h
mov es,ax
xor di,di
mov cx,64000
mov al,col
@l1:
stosb
loop @l1
end;
end;
procedure initgr;
begin
asm
mov ax,0013h
int 10h
end;
end;
procedure closegr;
begin
asm
mov ax,0003h
int 10h
end;
end;
begin
randomize;
initgr;
repeat
clscr(random(255));
until keypressed;
readkey;
repeat
clscr1(random(255));
until keypressed;
readkey;
closegr;
end.
Happy codding!!!!!!!!!!!!!
Анекдот напоследок: Стоят два хакера и ругаются на ассемблере... ;D
Глоссарий.
1.Команда mov устроена таким образом, что она может пересылать данные из регистров или памяти в регистр или память, но у нее следующие исключения и возможности:
Запись вида mov ax,bx обозначает пересылку значения из регистра bx в регистр ax
Запись вида mov ax,[bx] обозначает пересылку значения из ячейки памяти по адресу
ds:[bx] в регистр ax
Иногда необходима пересылка с указанием типа, т.к. в некоторых случаях компилятор может непонять, что имеется в виду: пересылка слова или байта : mov ax,[bx]
для этого используют специальный оператор указания типа ptr:
mov ax,byte ptr [bx] - пересылка байта
mov ax,word ptr [bx] - пересылка слова
А. Нельзя передавать значение одного сегментного регистра в другой:
mov es,ds
Б. Нельзя с ее помощью записать в сегментный регистр значение из памяти или константу:
mov es,0A000h
или
mov es,[seg].
В. Нельзя передавать значение из одной области памяти в другую:
mov es,ds
[/color=Blue]
Г. В качестве первого оператора не может выступать сегментный регистр cs:
[color=Blue]
mov cs,ax.
В случаях А,Б и В нужно использовать промежуточный объект - регистр или стек:
mov ax,[seg] или push [seg] push ds
mov es,ax pop es ; pop es
2. Стек - область памяти, специально выделенная для временного хранения работы программы. По принципу доступа он реализован в виде LIFO - последний пришел - первый ушел (Last in First Out).Команды для работы с ним:
push [что] - сохранить в стеке
pop [куда] - восстановить из стека
Пример:
push ax
pop bx
Помните: вытаскивайте в обратном порядке сохранения в стек:
push ax
push bx
push cx
...
pop cx
pop bx
pop ax
Возможно сразу сохранение всех регистров:
pusha - сохраняет ax,cx,dx,bx,sp,bp,si,di
popa - востанавливает di,si,bp,sp,bx,dx,cx,ax
3.
В ПК термином "адрес" обозначают разные вещи. Часто под адресом понимается
16-битовое смещение (offset) - адрес ячейки,отсчитанный от начала сегмента
(области) памяти, которому принадлежит эта ячейка. В этом случае под адрес
отводится слово памяти.
В другом случае под "адресом" понимается 20-битовый абсолютный адрес
некоторой ячейки памяти. В силу ряда причин в ПК такой адрес зада-
ется не как 20-битовое число, а как пара "сегмент:смещение", где "сег-
мент" (segment) - это первые 16 битов начального адреса сегмента памяти,
которому принадлежит ячейка, а "смещение" - 16-битовый адрес этой
ячейки, отсчитанный от начала данного сегмента памяти (величина
16*сегмент+смещение дает абсолютный адрес ячейки). Такая пара записы-
вается в виде двойного слова: в первом слове размещается смещение,
а во втором - сегмент.
(Язык макроассемблера для IBM. Составитель В.Н.Пильщиков (МГУ, ВМК) 1992г ) -
Электронная версия, кому надо - дам...
Всего хорошего...
Извиняюсь за огрехи с цветом - время заканчивается...
На тему ассемблер по темам - я так и собирался, взялся за графику т.к. именно через нее начал изучать ассемблер...
И еще раз простите за такую тягомотину со временем... Спасибо Alesha_GA за информацию...
Я уже стараюсь со вторым туториалом... когда выйдет - уже боюсь предсказывать... ;D
абсолютно верно как-то Gluck тебе сказал - если тему какую-то затрагиваешь - то объясняй её популярно или вообще не затрагивай вот к примеру говоришь что mov cs, 7 нельзя, так а как можно?!
и пора уже второй было выкладывать, первый уже все видели
а корректировать можно бесконечно
На тему именно cs:
Г. В качестве первого оператора не может выступать сегментный регистр cs:
mov cs,ax
Это значит, что этого не может быть никогда, т.к. CS:IP - текущий адрес выполняемой команды, т.о. изменяя CS или IP мы получаем процедуру прыжка на другую команду, а зачем это надо, если есть стандартные...?!!!
На тему второго туториала: УЖЕ ПРОХОДИТ СТАДИЮ ОТЛОВА БЛОХ, т.е. почти завершен.
"CS:IP - текущий адрес выполняемой команды"
это на самом деле НЕ так
не ТЕКУЩЕЙ, а СЛЕДУЮЩЕЙ команды
поэтому, к примеру, в команде jmp смещение и отсчитывается от следущей за jmp командой до метки
:D
-=-=-=
следующей слудующей
=-=-=-=-
This is the perfect way to break down this inofraimton.
Peercft shot! Thanks for your post!