Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Предлагаем темы для FAQ, точнее сами статьи 
:(
    Опции темы
Pakshin A. S.
Дата 1.1.2005, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



САБЖ.
А то раздел пустует!!!
PM   Вверх
Ripper
Дата 1.1.2005, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Программа просмотра графических PCX файлов:
----

Для хранения изображений в электронном виде используются различные спобы кодирования и соглашения о способе их записи - графические форматы. Среди них PCX, BMP, GIF, JPEG и другие. Одним из наиболее простых является формат PCX. В данной работе предлагается написать программу, которая выполняет декодирование графического PCX-файла и выводит соответсвущее изображение монитора в видеорежиме 13h VGA.

PCX-файл состоит из заголовка размером 128 байт, секции данных произвольного размера и, возможно, секции параметров палитры размером 768 байт. Секция параметров палитры VGA имеется для PCX-формата версии 5 и старше.
Ниже приводится описание формата заголовка. Суммарная длина заголовка - 128 байт.


Код


type ImgInfoHeader = record
  Manufacturer : Byte; {Идентификатор разработчика формата - 10 для Zsoft.pcx}
  Version : Byte; {Версия}
  Encoding : Byte; {Кодировка. Обычно 1}
  BitsPerPixel : Byte; {Число бит на пиксел: 1,2,4,8}
  Xmin, Ymin, Xmax, Ymax : Integer; {Минимальные и максимальные значения X и Y}
  HDPI: Integer; {Горизонтальное разрешение в точках на дюйм}
  VDPI: Integer; {Вертикальное разрешение в точках на дюйм}
  Colormap: array[0..15, 1..3] of Byte; {Цветовая палитра. 16 цветов. Схема RGB}
  Reserved: Byte; {Поле зарезервированно, устанавливается нулевое значение}
  Nplanes: Byte; {Количество цветовых плоскостей}
  BytesPerLine: Integer; {Количество байт на строку. Должно быть четным}
  PaletteInfo : Integer; {1 = цветной рисунок.  2 = рисунок в шкале серого цвета}
  Filler : array[1..58] of Byte; { Нулевые значения}
end;



Параметры палитры размещаются в конце файла но их установку лучше производить перед выводом изображения на экран. Предлагается слудующий алгоритм установки цветовой палитры:
1)Найти конец файла
2)Отступить на 768 байт назад
3)Считать значения
4)Все считанные значения разделить на 4
5)Произвести установку палитры в VGA-режиме

Диапазон значений интенсивности цветов RGB-палитры в VGA-Режиме - 0..63, а значения использующиеся в PCX-файле лежат в диапазоне 0..255. Поэтому и выполняется деление считанныз значение на 4.
Декодирование PCX-файла происзодит следующим образом. Первые 128 байт содержат заголовок. Они могут быть пропущены если будут отображаться только 256-цветные файлы с изображением размером 320х200 пикселов. В противном случае из заголовка извлекается необходимая информация. Далее сччитывается байт данных. Декодированный байт данных в 266-цветном режиме представляет собой номер элемента палитры для графической точки. Если старшие 2 бита считанного байта нулевые, данный байт должен быть выведен на экран. Если же они еденичные, 6 младших битов байта содержат значение, указывающее сколько раз следующий байт должен быть отображен на экране. Для определения числа повторений цикла к считанному значению и числу 63 применяется операция "логическое 6":
temp:=значение считанного байта данных;
for loop :=1 to (temp AND 63) do . . .
Затем считывается очередной байт данных и все повторяется до тех пор пока изображение не будет выведено на экран полностью

smile


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 1.1.2005, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Начало положено.... smile smile smile
Дополнение: пример проги...
PM   Вверх
Coder
Дата 25.3.2005, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Ripper, это взято из учебника Немнюгина - Практика на ТП?
PM MAIL   Вверх
~FoX~
Дата 25.3.2005, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 1
Всего: 68





--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Fedor
Дата 25.3.2005, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Цитата
http://forum.vingrad.ru/index.php?showtopic=38605

Я те статьи специально для этого и писал. Но я хочу сначала дописать еще несколько основных алгоритмов, а потом запихну в ФАК.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Fedor
Дата 4.4.2005, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Ребят, давайте поактивнее smile

Никто не хочет сам статью написать? Давайте с тематиками определимся... Вот например работа с файлами. Или реализация различных алгоритмов...


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
AgereS
Дата 19.8.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 23.6.2004

Репутация: нет
Всего: 3



по виртуальным методам пожалуйста разъясните кто нибудь...
PM MAIL ICQ   Вверх
Snowy
Дата 19.8.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Качнуть SWAG. Там море всего.
PM MAIL   Вверх
MacTep
Дата 22.1.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Кстати, SWAG. Если у кого нет, могу поделиться, да и статейки подкинуть для DRKB. Главное - интерес... Там много всего. Что именно нужно?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Arsuit
Дата 18.5.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.5.2006
Где: Казань

Репутация: нет
Всего: нет



[center][color=#FF0000]Встроенный ассемблер[/color][/center]

[color=#3333FF]Основы[/color]
Я думаю, что все, кто хоть немного знаком с Турбо Паскалем, знают, что в нем есть довольно удобный инструмент, который называется встроенным ассемблером, но далеко не все новички умеют им работать. Встроенный ассемблер (далее - просто ассемблер) дает возможность программировать на уровне отдельных машинных инструкций. Это - главное отличие ассемблера от Паскаля и в этом отличии сосредоточены все его достоинства и недостатки. Достоинство заключается в том, что, программируя на ассемблере, программист обычно выбирает последовательность машинных инструкций так, чтобы реализовать нужные вычисления с максимальной скоростью при минимальных затратах памяти, в то время как даже такой весьма совершенный компилятор, как Турбо Паскаль, неизбежно вносит в машинный код некоторую избыточность, уменьшающую скорость счета и увеличивающую затраты памяти. С другой стороны, программирование на уровне машинных инструкций - чрезвычайно хлопотное занятие и не может сравниться по скорости разработки программ с программированием на Паскале - в этом заключается главный недостаток ассемблера. 

Ассемблерные инструкции в паскале пишутся примерно так:
Код
program program_name;
begin
  ...
  asm
    ...  {Здесь располагаются ассемблерные инструкции}
  end
  ...
end.



Операторы asm...end работают, как операндные скобки begin...end;, поэтому можно делать так:
Код
for i := 1 to 100 do 
  asm
    ...
  end

и так:
Код
if ((i=0) and (k<>6)) or (t div 5 - 7 = 99)) xor (r=0) then
  asm
    ...
  end


[color=#3333FF]Регистры[/color]

В Турбо Паскале (вернее в МП 8086/8088) имеется 14 регистров. Их можно поделить на 5 групп:

1. Регистры общего назначения (АХ, ВХ, СХ, DX); предназначены для хранения операндов и выполнения основных команд; любой из них может использоваться как совокупность двух независящих друг от друга 8-разрядных регистров: старшего байта регистра (АН, ВН, СН, DH) и младшего байта (AL, BL, CL, DL); например, АХ состоит из АН и AL; 
2. Сегментные регистры (CS, DS, SS, ES); используются для указания сегмента при адресации памяти; 
3. Регистры-указатели (SP, BP, IP); используются для указания смещения при адресации памяти;
4. Индексные регистры (SI, DI); применяются для индексной адресации; 
5. Регистр флагов. используется для хранения признаков состояния процессора.

Теперь подробнее: 

AX, BX, CX, DX можно использовать как переменные. Также в них возвращается значения функций и многое другое.
CS, DS, SS, ES используются для указания сегмента. В частности 
CS - Содержит номер сегмента памяти (сегмента кода), в котором располагается текущая машинная инструкция
DS - Содержит номер сегмента памяти (сегмента данных), в котором располагаются данные (константы и переменные)
SS - Это сегмент Стека, а ES это... это дополнительный сегментный регистр, который используется для межсегментного обмена данными и в некоторых строковых операциях
SP - Указывает на вершину стека. Совместно с регистром SS он адресует ячейку, куда будет помещаться/извлекаться операнд. BP - т.н. указатель базы. Облегчает создание и использование локального стека. IP - Определяет смещение относительно начала сегмента кода CS очередной исполняемой машинной инструкции. Содержимое IP автоматически изменяется в ходе исполнения инструкции, обеспечивая правильный порядок выборки команд из памяти. 
SI - Определяет адрес источника информации при индексной адресации данных. По умолчанию используется в паре с DS. DI - определяет приемник информации при межсегментном обмене данными. По умолчанию - в паре с ES.

[color=#3333FF]Команды.[/color]

Ниже приведены команды, которые используются при использовании встроенного Ассемблера.

Команды пересылки данных

MOV - Переслать значение.
push - "Загнать" в стек
pop - Извлечь из стека
xchg - Обменять значения

mov, xchg нельзя использовать для пересылки из памяти в память:
Код
var
  a,b:integer;
begin
  ...
  asm
    mov a,b {Ошибка!!!}
   { Надо так:}
    mov ax,b
    mov a,ax
  end
  ...
end;


Вот пример. (В комментариях - код на Паскале, чтобы было легче разобраться)
Код
asm
  mov ax,60 {ax := 60}
  push ax
  mov bx,88 {bx := 88}
  mov ax,bx {ax := bx}
  pop ax    {!!!ax := 60!!!}
  xchg ax,bx {ax = 60, bx = 88 -> ax = 88, bx = 60}
end


[color=#3333FF]Арифметические команды.[/color]

ADD Сложить
ADC Сложть, добавить перенос
INC Увеличить на единицу

SUB Вычесть
SBB Вычесть с заемом
DEC Уменьшеть на единицу

MUL Умножить
iMUL Умножить со знаком

DIV Поделить
iDIV Поделить со знаком

Вот пример - программа выполняющая над двумя числами 4 арифметические операции
Код
program asm_test_arifnetika;
var
  a,b,c:integer;
begin
  ReadLn(a,B);
  asm
    mov ax,a {ax := a}
    adc ax,b {ax := ax+b}
    mov c,ax {c := ax}
  end
  WriteLn('Сумма a и b = ',c);
  asm
    mov ax,a {ax := a}
    sbb ax,b {ax := ax - b}
    mov c,ax {c := ax}
  end
  WriteLn('Разность a и b = ',c);
  asm
    mov ax,a {ax := a}
   imul ax,b {ax := ax*b}
    mov c,ax {c := ax}
  end
  WriteLn('Произведение a и b = ',c);
  asm
    mov ax,a {ax := a}
   idiv ax,b {ax := ax div b}
    mov c,ax {c := ax}
  end
  WriteLn('Частное a и b = ',c)
end;


Вот. Теперь...
Битовые команды:
and
or
xor
not
shl
shr
Код
{and, и все остальные бинарные команды в ассемблере работают почти как в паскале, но не совсем...}
asm
  and ax,bx {будет означать ax := ax and bx}
end


[color=#3333FF]Условия.[/color]

Синтаксис написания условий в ассемблере значительно отдичается от Паскаля. Попробую объяснить что и как. Если, например, в паскале синтаксис условия выглядит так: 
if (условие) then описание, например
if a=0 then b := 7;

На ассемблере это будет выглядеть совсем по другому:
Код
asm
  cmp a,0  {?a=0?}
  jne @    {нет - перейти к концу}
  mov b,7  {b := 7}
@:
end;


Вот. Сначала идет оператор cmp и два сравниваемых параметра через запятую. На следующей строчке идет параметр сравнения. В данном случае он расшифровывается как перейти, если не равны.
Вот все параметры условий:

Операция больше:
JA - для беззнаковых чисел
JG - для чисел со знаком

Числа равны - JE

Операция меньше:
JB - для беззнаковых чисел
JL - для чисел со знаком

Операция больше или равно:
JAE - для беззнаковых чисел
JGE - для чисел со знаком

Операция меньше или равно:
JBE - для беззнаковых чисел
JLE - для чисел со знаком

Не равно - JNE

Новички часто путаются с написанием условий на ассемблере т.к. логика при их написании должна быть совсем другая.

[color=#3333FF]Прерывания.[/color]

Здесь уж совсем все просто. В регистры с помощью оператора mov загоняются значения, после этого пишется int (прерывание). Все.
Код
asm
  mov ax,01h {ax := 1}
  int 33h    {33h - прерывание мышки}
end;


[color=#3333FF]Ассемблерные процедуры.[/color]

Синтаксис.

Код
procedure названиепроцедуры(параметры); assembler;
  asm
    ...
  end


например:
Код
procedure ShowMouse; assembler;
  asm
    mov ax,01h
    int 33h 
  end


[color=#3333FF]Ассемблерные функции.[/color]

Синтаксис: 

Код
function названиефункции(параметры):значение; assembler; 
  asm
    ...
  end


Результат функции записывается в регистры. А именно:
длиной 1 байт (Byte, Char и т.п.) - в регистре AL; 
длиной 2 байта (Integer, Word) - в регистре АХ; 
длиной 4 байта (Pointer, LongInt) - в регистрах DX (старшее слово) и АХ (младшее слово);
типа Real - в регистрах DX, BX, АХ (старшее слово - в DX, младшее в АХ); 
вещественных типов Single, Double, Extended, Comp - в регистре ST (0) сопроцессора; 
строкового типа - во временной области памяти, на которую ссылается @Result.

Пример:
Код
function Shogen(a,b:integer):integer; assembler;
  asm
    mov ax,a
    adс ax,b
  end


Литература
Фаронов В. В. Турбо паскаль. Начальный курс 

Это сообщение отредактировал(а) Arsuit - 18.5.2006, 21:12
PM WWW ICQ   Вверх
Snaiper
Дата 15.5.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Дейтсвительно ребята давайте кто-нибудь возьмитесь за статью по работе с файлами!!!
PM MAIL   Вверх
KuZyagroup
Дата 23.5.2007, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 16.4.2007
Где: Kiev

Репутация: нет
Всего: 4



Работа с файлами для новичков

Код

Const FileName='FileName.Dat';
var St:string;
c:array [0..256] of char;

Procedure WriteF;
Begin
  Assign(OutPut,FileName); ReWrite(OutPut);
    WriteLn('Now operator Write and WriteLn write to your file FileName.DAT');
  Close(OutPut);
End;

Procedure ReadF;
Begin
  Assign(InPut,FileName); Reset(InPut);
    ReadLn(St); {Now whith operator Read and ReadLine we are read from file}
  Close(InPut);
End;

Procedure WriteFWithO;
var O:text;
Begin
  Assign(O,FileName); ReWrite(O);
    WriteLn(o,'Now operator Write(o,...) and WriteLn(o,...)');
    WriteLn(o,'write to your file FileName.DAT');
  Close(O);
End;

Procedure ReadFWithO;
var o:text;
 i:integer;
Begin
  Assign(o,FileName); Reset(o); i:=0;
  While Not(EoLn(o)) do {EoF(o) - end of lile o}
  Begin
    i:=i+1;
    Read(o,c[i]);
  End;
  c[0]:=chr(i);
  While Not(Eof(o)) do {EoF(o) - end of file o}
    ReadLn(o,St); {Now whith operator Read(o,...( and ReadLn(o,...) we are read from file}
  Close(o);
End;

Begin
  WriteF;
  ReadF;
End.

С переменными InPut и OutPut работа с файлами ничем не отличается от работы с екраном. 
Но будьте осторожны с переменными InPut и OutPut так как посе закрытия файла не во всех компиляторах возвращается привязка к монитору.
EoLn(o) - false если после коретки есть ещё символы до конца линии true - если после коретки символ конца стори или файла
EoF(o)  - false если после коретки есть ещё символы до конца файла true - если после коретки символ конца файла (при этом после этого символа может быть информация, однако этот извращенный случай рассматривать не будем)
Если файл открыт через InPut or OutPut то вводить (o) опускается

Это сообщение отредактировал(а) KuZyagroup - 23.5.2007, 04:03

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Q.PAS 1,02 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0643 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.