Консультация № 178126
30.04.2010, 16:01
0.00 руб.
0 22 2
Здравствуйте, у меня следующая проблема, которую я и сам бы смог решить, но не знаю как в Turbo Pascal напрямую работать с памятью (внутри и вне программы).

Проблема следующая: В одной игре на PSX я хочу отслеживать данные о развитии некоторых карт (дополнительный квест). При помощи ArtMoney я нашел последовательный диапазон памяти в котором определенным образом записана вся информация о картах (целочисленные значения), причем карты в памяти записываются хаотически (по принципу заполнения жесткого диска). Карты могут повторяться, но с различными свойствами. На основании полученного диапазона памяти я хотел бы отсканировать выбранную память, определенным образом переработать полученную информацию и записать обратно. Я все время обрабатываю эти данные прямо в ArtMoney, но приходится постоянно "бегать" в разные концы таблицы что очень нудно.

Необходимо реализовать:
1. Отсканировать известный диапазон памяти
2. Обработать полученную информацию (определение максимума, минимума и перезапись, возможно понадобятся циклы)
3. Записать в отсканированную память обработанную информацию

Проблемы:
1. Я знаю язык Turbo Pascal (и Free Pascal) на уровне элементарных операций (+,-,*,/, побитовые, циклы, условия).
2. Не знаю как можно отсканировать определенную последовательность байтов в памяти (вне Pascal) и записать обработанную информацию обратно в память

Ожидаемые результаты:
1. Фрагмент программы для Turbo Pascal (Free Pascal) который позолял бы скопировать выбранный диапазон памяти в переменную Turbo Pascal (Free Pascal), например в массив, а после обработки записать данные массива обратно в исходный диапазон памяти.
2. Предполагая, что для сканирования памяти потребуется ассемблер не откажус от краткой информации (программы) как в ассемблере реализовать циклы, поиск максимума, минимума, сканирование памяти и перезапись.

Заранее спасибо!

Обсуждение

давно
Старший Модератор
31795
6196
30.04.2010, 16:18
общий
Тепляков Константин Владимирович:
Цитата: 229812
Предполагая, что для сканирования памяти потребуется ассемблер

Совсем не обязательно. Это всё элементарно делается средствами самого ТР с помощью указателей.
Есть только одно но, если программа под ДОС, то Вы должны находится в одном эмуляторе с игрушкой.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
30.04.2010, 16:23
общий
Тепляков Константин Владимирович:
А какая операционная система на этом PSX? Если 32-битная, то Turbo Pascal Вам не поможет, нужно нужно Delphi или Free Pascal. Доступ к памяти чужого процесса, например, в Windows, можно получить с помощью функций Win32 API.
Неизвестный
30.04.2010, 23:44
общий
Тепляков Константин Владимирович:
В рамках топика посмотрите в сторону зарезервированного слова absolute.
Неизвестный
01.05.2010, 06:53
общий
Есть только одно но, если программа под ДОС, то Вы должны находится в одном эмуляторе с игрушкой.

Я не совсем понимаю о чем речь. Эмулятор для винды (ХР) 32бит. Если поможет, то эмуль у мя ePSXe v1.7.0 rus

А какая операционная система на этом PSX?

На ePSXe не знаю у винды - WinXP SP2 32-bit, хотя проц AMD X2 64-bit (старый)

... нужно Delphi или Free Pascal

Free Pascal есть но всех его возможностей я пока не знаю. (всегда пользуюсь только наипростейшими вычислительными операторами модулей System, Crt, Dos(для определения быстроты выполнения программы) ).

Доступ к памяти чужого процесса, например, в Windows, можно получить с помощью функций Win32 API.

Win32 API разок слышал про него но не знаю что тако и на сколько он вкусный

... посмотрите в сторону зарезервированного слова absolute

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

Это всё элементарно делается средствами самого ТР с помощью указателей

Пока что не знаю как пользоваться, оперировать указателями и что они дадут. В описании функции absolute как раз приводится пример с типом Pointer, надо будет почитать.


СПАСИБО ОГРОМНОЕ ЗА ПОДСКАЗКИ, СЕГОДНЯ ВЕЧЕРОМ, ПОСЛЕ СОРЕВНОВАНИЙ, ПОПРОБУЮ ВАШИ СОВЕТЫ!!!
давно
Старший Модератор
31795
6196
01.05.2010, 17:06
общий
Тепляков Константин Владимирович:
Цитата: 229812
Я не совсем понимаю о чем речь. Эмулятор для винды (ХР) 32бит

ТР это компилятор реального режима работы процессора(16-ть бит), все Windows работают в защищенном режиме процессора(32-а бита), а реальный режим эммулируют, для совместимости.

Итак в реальном режиме Вы должны находится в одном адресном пространстве(1Мб) с игрушкой.
В защищенном режиме, нужно использовать Нативные(ядерные) функции самой системы, по другому никак. Для этого Вам нужно изучить организацию работы с памятью самой операционной системы.

Вопросы:
Что Вы хотите получить в итоге?
Как запускается игрушка и "Шо" это есть?

Сразу оговорюсь, что любые средства(методы) обхода(взлома) лицензии(несанционированого доступа) будут пресекатся или по другому: БУДЕТ ОЧЕНЬ БОЛЬНО.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
01.05.2010, 20:02
общий
Тепляков Константин Владимирович:
Поймите, пока Вы не скажите:
- какую игру? Где взяли? (В том числе, нужна и такая информация: охраняется ли какими-либо правами? Если "да", то приобрели ли Вы их?)
- что именно хотите сделать?
Наши ответы останутся предположительными. И они останутся предположительными, пока кто-то из нас не установит ее у себя и не посчитает за труд 2-3 дня, а то и больше, потратить на изучение памяти программы... Мне, например, карточные игры не интересны. Тратить время на изучение такой игры вряд ли захочу...

И от себя добавлю личное мнение, неужели не интереснее понять, какую логику, алгоритм выигрыша заложили авторы в свою программу?
Неизвестный
01.05.2010, 21:07
общий
Попробовал сегодня простую программу с одной переменной с получением данных через absolute. При запуске программы с Турбо Паскаля эмуль зависает наглухо, да и результат на экране ТП отличается. Текст описания переменной в приложении. При запуске программы с приведенным в приложении текстом на ФП компилятор жаловается на наличие двоеточие после absolute, а когда убераю, то вообще выводит сообщение об ошибке.
Код:
var
mas : byte absolute $9C:$F26E;
begin
writeln(mas);
readln;
end.


В защищенном режиме, нужно использовать Нативные(ядерные) функции самой системы, по другому никак.

Ужос

Для этого Вам нужно изучить организацию работы с памятью самой операционной системы.

Поизучать бы поизучал, но пока что такое чувство, что голова опухнет от этого да и не знаю средства и методы для реализации.

Как запускается игрушка и "Шо" это есть?

Игра - Final Fantasy 9 (Play Station 1) под эмулятор ePSXe. Запускается так: сперва запускается эмулятор (настройку опускаю) далее во вкладке Файл-> Run ISO и указываю mdf-файл, а дальше непосредственно играю. Изначально мне игру дал одногрупник (я так понял, что он ее купил), эмулятор - из интернета (epsxe.com).

Что Вы хотите получить в итоге?

Что хочу получить в итоге? Например ЕХЕ-шник с исходниками при запуске которого все "ненужные" в игре карты будут выкидываться написанной программой, то есть чтобы оставались только самые сильные карты конкретного типа (возможно в будущем попробую сделать программу которая будет оставлять по одной карте каждого типа с максимальными параметрами от уже имеющихся)

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

Основной квест я уже прошел, сейчас спортивный интерес пройти побочный. Я как раз и пытаюсь улавливать логику игры для победы. Проблема в том, что после выигрыша все мои играющие карты получают небольшую прокачку, а при победе одна или несколько карт противника переходят ко мне в результате чего получается ситуация, когда я имею две или более одинаковые карты, но с разным уровнем атаки, защиты и направлением атаки. В данной ситуации необходимо (а иногда приходится в принудительном порядке) выкидывать ненужные карты. Вот тут и нужно то ради чего я запостил этот вопрос.

пока кто-то из нас не установит ее у себя и не посчитает за труд 2-3 дня, а то и больше, потратить на изучение памяти программы...

Установщик эмуля весит около 600кБ (согласно его ссылке на сайт). Сама игра состоит из 4х дисков примерно по 700-750 МБ каждый. Где их можно найти даже не знаю ... На работе часто говорят о каком-то тор-интернете (не знаю правда что это такое и как он правильно называется), как мне сказали там можно скачать файлы у других пользователей, кто предлагает скачивать.

... или по другому: БУДЕТ ОЧЕНЬ БОЛЬНО

НЕ БЕЙТЕ МЕНЯ Я НИ ЧЕГО НЕ СДЕЛАЛ, я только хочу написать программу и узнать что-нибудь нового о Паскале. А что насчет взлома, то единственное что я знаю о взломе - это бесплатный ArtMoney (поиск, отсеивание и изменение значений).


ПРИМЕЧАНИЕ
Я раньше писал, что при обработке информации будут использоваться операции определения максимума, минимума и перезаписи данных о картах с возможностью использования циклов. Помимо этого еще понадобится определять колличество едениц в двоичной записи десятичного числа (направления атаки).
Неизвестный
01.05.2010, 22:04
общий
Ну бить-то - руки коротки, а эмулятора для Интернета еще не создали
О программе, написанной Вами для Паскаля, никакого зависания нет. Возможно, Вас просто ждет нажатия ENTER (для ReadLn). Уберите, запустите и посмотрите экран пользователся (Alt+F5). Сразу отмечу, что если я прав, то многовато Вам изучать еще надо ...
Во FreePascal, действительно, перестали поддерживать такое использование absolute для достижения большей совместимости с Delphi (так объяснено)
Во FreePascal нужно писать так:
Код:
var
mas: farpointer;
begin
mas:= ptr($9c, $f26e);
WriteLn(byte(mas^));
end.

Но получите правильное: ошибка 216 - ошибка обращения к памяти. Это находится вне памяти, выделенной Вашей программе системой
А вот такое - пройдет:
Код:
var
mas: farpointer;

begin
mas:= ptr(0, $6e);
WriteLn(byte(mas^));
end.

Насчет лицензионности никаких прямых указаний не нашел. Но с учетом, что используется какая-то PlayStation... разбираться будет хлопотно
Неизвестный
01.05.2010, 23:06
общий
Сразу отмечу, что если я прав, то многовато Вам изучать еще надо ...

Мне в любом случае изучать еще много чего надо, поскольку я всегда пользовался только данными и операциями "первой главы учебника", хотя я на этой "первой главе учебника" уже столько всякого написал.

... используется какая-то PlayStation... разбираться будет хлопотно

Я представляю себе такую картину - изначально PlayStation - игровая приставка, как Dendy (Nintendo) и Sega. Далее появились программы-эмуляторы этих приставок для ПК. О легальности этих эмуляторов ИМХО действительно хлопотно будет разбираться, но существуют эти эмуляторы уже более 4х лет.


Возвращаемся к программам ...
1. Boriss, с приведенными вами двумя программами получается все так, как вы описывали: первая выдает ошибку 216 (видимо у меня какой-то баг в установщике FreePascal, потому что я не погу прочитать описание ошибки, да и трасировка не работает).
2. Похоже, что для достижения поставленной мною задачи придется серьезно разбираться с оперативной памятью, поскольку я только что провел пару исследований:
а) ArtMoney показывает, что в приведенной однобайтной памяти (009СF26E) должно быть значение 53.
б) когда я запускаю приведенную мною программу, скомпилированную до ЕХЕ из ТР, то выдается результат 146. При запуске программы внутри ТР (Ctrl+F9) результат - 6
в) Запуск второй вашей программы как внутри FP, так и ЕХЕ-шника выводит 0
г) При запуске программы под ТР, когда параллельно висит ArtMoney 7.15, выдается результат - 8, при этом эмулятор зависает. FP при включенном ArtMoney выдает неизменный результат - 0, при этом эмулятор также виснет.
Предположительно ArtMoney блокирует доступ к памяти.

Кстати ... ТР для памяти ($0, $6e) выдает результат - 23. очень интересно.

Скорее всего чтобы добиться результата придется продолжать изучать assembler (я завис на регистрах).


Ну бить-то - руки коротки, а эмулятора для Интернета еще не создали

не сразу я в шутку въехал ...
Неизвестный
02.05.2010, 18:12
общий
216 - это ошибка доступа к памяти. Обращение к недопустимой области памяти.
TP, BP -выдают сведения о значении в ячейке в своей памяти, на своей странице. Можно почитать о том, как работают DOS-программы в Windows. Посмотри, например, тут
Неизвестный
04.05.2010, 19:30
общий
Как администратор, я обязан следить за тем, чтобы в рассылке не было неотвеченных вопросов. Как ответить на Ваш вопрос без некраткого исследования, не знаю
Могу продлить срок вопроса, но, похоже никто не берется написать ответ ... Да, на торренте (так это называется: torrent), можно иногда найти, но сейчас, как уже несколько лет, собираются преследовать
Из моих знакомых никто пока не отозвался, что есть такая игра
По этой причине могу предложить вариант: залезть внутрь чего-то другого, размером поменьше - давайте найдем что-либо общее. Предлагаю так по той причине, что, по-моему, у Вас появился стимул начать программировать. Будем помогать
Если до утра не ответите, напишу первый попавший ответ пустяковый - не судите строго, а лучше пишите хоть тут, хоть в личную почту
--
С уважением, Boriss, администратор рассылки
Неизвестный
04.05.2010, 21:10
общий
Boriss, возможно это я сегодня не в ладах с мыслью, поскольку последний ответ в 22:30 показался мне "предложением из различных фрагментов".
...
Думаю я с вашим ответом разобрался, единственный вопрос - Что вы имели ввиду под фразой "залезть внутрь чего-то другого, размером поменьше "?

На данный момент ситуация такая: я уже написал обработчик информации. Исходную информацию (интересуемый фрагмента памяти) получаю в виде CSV файла при помощи ArtMoney, ну а далее просто ищу повторяющиеся карты и сравниваю их характеристики, результат - текстовый файл с информации об удаляемых картах и позиции (в памяти) карт, которые надо оставить. Присутствует что-то вроде дефрагментации(но не полной). Для полного счастья осталось только изучить ассемблер и сделать в программу ассемблерную вставку, которая копировала бы последовательность из 630 байт из внешней программы внутрь Паскаля, а потом обратно. Адреса для внешней программы и внутреннего массива, думаю, что достану.

Исходя из текущего положения дел, сочту за положительный ответ ассемблерную вставку следующего смысла - "Скопировать побайтно 630 байт из памяти началом в адресе ХХХХ:ХХХХ в память с адресом УУУУ:УУУУ", а там уж постараюсь подстроиться под эту ассемблерную вставку. В принципе, поскольку данный вопрос оказывается не по специальности данной рассылки, то приму отрицательный или пустой ответ с каким-либо объяснением, после чего попробую задать этот вопрос на рассылке посвященной ассемблеру. ...а может быть попробую на делфи написать (хотя изучить придется почти "с нуля").

у Вас появился стимул начать программировать

Гы..., а я и рашьше программировал, разве что в основу моего программирования закладывались последовательности математических действий с использованием логических операторов, циклов, процедуры, рекурсий. В данной области могут быть вопросы только по не знанию алгоритмов достижения каких-либо целей. А вот в области динамических переменных, указателях, классах, структурах, деревьях и прочее я слабоват.
Стимул?.. Я его называю "спортивным интересом". Стимул появляется когда я придумываю себе различные задачи и он существует пока я уверен в том, что для преодоления трудностей необходимо только поглубже рассмотреть проблему или изучить какую-либо новую возможность (в данном случае это ассемблерная вставка). Стимул теряется когда я ставлю задачу с огромным колличеством иттераций (ориентировочное время вычисления более месяца), причем когда не находится положительного решения и нет возможности проверить правильность алгоритма (это у меня было с "простыми" шахматными задачками).

пишите хоть тут, хоть в личную почту

Да писать-то как таковой не проблема, разве что я в интернете очень редко бываю, поскольку для меня интернет как яма развлечений, которая обходится в "монеточку", особенно если себя при этом не контроллировать.
Я так и не нашел какая у вас личная почта, поэтому (на крайняк) оставлю свою рамблеровскую [i][u]Rjcnz-nuts[/u][/i]

ЗЫ. Похоже я реально "не по адресу" такой вопрос запостил... так что надеюсь на взаимное "не судите строго". Спасибо всем за новую информацию и извините за беспокойство
Неизвестный
04.05.2010, 21:29
общий
это ответ
Здравствуйте, Тепляков Константин Владимирович.
Найти мою личную почту легко: щёлкните по Boriss - перейдете на страничку моего профиля, а там есть "Личная почта"
А копировать можно так:
Код:
const
msg: String = '1234567890';
var
mas: String;

begin
move(msg, mas, length(msg)+1);
WriteLn(mas);
end.

Копируется одна строка в другую. [b]+1[/b] - так как нужно еще скопировать байт длины строки, который в Паскале находится в начале каждой строки
Неизвестный
04.05.2010, 21:34
общий
А еще моя почта surin_bp@mail.ru
Я имел в виду: Залезть в данные программы, которая есть у меня и у Вас. Можно внутрь своей программы, написанной на Паскале, но мне показалось это простым вариантом
Послал Вам тестовое письмо с моего ящика "тут"

В ответе написал, как пересылать данные не используя ассемблер. В Паскале это делается с помощью процедуры move
Неизвестный
04.05.2010, 21:47
общий
Тепляков Константин Владимирович:
Цитата: 229812
Исходя из текущего положения дел, сочту за положительный ответ ассемблерную вставку следующего смысла - "Скопировать побайтно 630 байт из памяти началом в адресе ХХХХ:ХХХХ в память с адресом УУУУ:УУУУ"


Следующий 16-битный код копирует byte_count байт из source_addr в destination_addr (это можно сделать и чисто на Паскале):
Код:
push si
push di
push ds
cld
mov cx,[byte_count]
lds si,[source_addr]
les di,[destination_addr]
rep movsb
pop ds
pop di
pop si


Но это не то, что Вам нужно, потому что:

Цитата: 229812
а) ArtMoney показывает, что в приведенной однобайтной памяти (009СF26E) ...

Из этого я делаю вывод, что у Вас Win32 (ArtMoney есть для DOS и Windows, Вы привели 32-битный адрес).

32-битный код будет иным, тут надо учитывать, что каждая программа выполняется в своем адресном пространстве, копирование выполняется средствами ОС. Например, в Win32 надо использовать функцию

Код:
BOOL WriteProcessMemory(
HANDLE hProcess, // handle to process
LPVOID lpBaseAddress, // base of memory area
LPCVOID lpBuffer, // data buffer
SIZE_T nSize, // count of bytes to write
SIZE_T * lpNumberOfBytesWritten // count of bytes written
);


Аналогично, для чтения памяти (Вам ведь надо "отсканировать известный диапазон памяти") используется функция
Код:
BOOL ReadProcessMemory(
HANDLE hProcess, // handle to the process
LPCVOID lpBaseAddress, // base of memory area
LPVOID lpBuffer, // data buffer
SIZE_T nSize, // number of bytes to read
SIZE_T * lpNumberOfBytesRead // number of bytes read
);


Такой ответ Вам подходит?
Неизвестный
04.05.2010, 22:13
общий
amnick:
Оформите в виде ответа ... Я написал, чтобы мне не поставили двойку за отсутствие ответа
Неизвестный
04.05.2010, 23:26
общий
это ответ
Здравствуйте, Тепляков Константин Владимирович.

в мини-форуме вопроса Вы написали :
Цитата: 229812
а) ArtMoney показывает, что в приведенной однобайтной памяти (009СF26E) ...

Из этого я делаю вывод, что у Вас Win32 (ArtMoney есть для DOS и Windows, Вы привели 32-битный адрес).

В Win32 каждая программа выполняется в своем адресном пространстве и доступ к памяти чужого процесса можно получить с помощью функций Win32 API (и именно так и нужно получать, попытки обойти это ни к чему хорошему не приведут).

Для чтения памяти (Вам ведь надо "отсканировать известный диапазон памяти") используется функция (синтаксис C):
Код:
BOOL ReadProcessMemory(
HANDLE hProcess, // handle to the process
LPCVOID lpBaseAddress, // base of memory area
LPVOID lpBuffer, // data buffer
SIZE_T nSize, // number of bytes to read
SIZE_T * lpNumberOfBytesRead // number of bytes read
);


Аналогично, для записи в память другого процесса надо использовать функцию
Код:
BOOL WriteProcessMemory(
HANDLE hProcess, // handle to process
LPVOID lpBaseAddress, // base of memory area
LPCVOID lpBuffer, // data buffer
SIZE_T nSize, // count of bytes to write
SIZE_T * lpNumberOfBytesWritten // count of bytes written
);


Детальное описание этих функций приведено в MSDN. Вам нужен будет компилятор Паскаля, который генерирует 32-битный код для Windows. Подходит Delphi, Free Pascal. Тогда Вы сможете обращаться к функциям Win32 API.

Знание ассемблера для решения Вашей задачи не требуется. После получения требуемого блока памяти с помощью ReadProcessMemory, его можно просканировать средствами Паскаля. Объявите, например, указатель на byte, присвойте ему адрес первого байта блока, а затем инкрементируйте указатель для побайтового просмотра. Аналогично для других типов — инкремент указателя продвигает его к следующему элементу массива. Вот Вам простой пример на Turbo Pascal (извините, у меня не установлен Free Pascal):
Код:
program test;
{$X+} { расширенный синтаксис }

const
s : string = '1234567890';
al: array[0..5] of longint = ( 1234, 5678, 90123, 45678, 901234, 567890 );

var
pc : ^char;
pl : ^longint;
i : integer;

begin
pc := @s[1];
for i := 0 to 5 do begin
write( pc^, ' ' );
inc( pc ); { к следующему символу строки }
end;
writeln;

pl := @al[0];
for i := 0 to 5 do begin
write( pl^, ' ' );
inc( pl ); { к следующему элементу массива }
end;
writeln;
end.


Успехов!

P.S. Есть еще аналогичные функции NtReadVirtualMemory/NtWriteVirtualMemory, но для Вашей задачи они не нужны.
Неизвестный
05.05.2010, 05:08
общий
Такой ответ Вам подходит?

вау
Как я понимаю функции ReadProcessMemory и WriteProcessMemory возвращают true если успешно считано и записано.
Я такие функции впервые вижу, могли бы вы подсказать что необходимо вводить в каждый передаваемый данным функциям параметр (как их задействовать).
Предполагаю следующее:
hProcess - название процесса, откуда будет проходить сканирование/запись
lpBaseAddress - начальный адрес сканирования
а вот следующие три параметра пока под вопросом понимания

Вашу рекомендацию смогу попробовать только вечером (скорее всего вопрос уже закроется). Кстати, смогу я посать в мини-форум после закрытия этого вопроса?
Неизвестный
05.05.2010, 07:50
общий
Что-что хочешь тут сделать? Нет, не удастся - он же виртуальный! (Бывают же такие описки ... - хм!)
Ну конечно можно - минифорум живет долго, столько, сколько надо

Да я тоже попробовать хуки, раньше необходимости не было
Неизвестный
05.05.2010, 14:11
общий
Цитата: 229812
могли бы вы подсказать что необходимо вводить в каждый передаваемый данным функциям параметр (как их задействовать).

Предлагаю почитать MSDN. Если у Вас нет локальной копии (похоже, что нет), то вот ссылки на первоисточник:
ReadProcessMemory
WriteProcessMemory
MSDN не предлагает синтаксиса этой функции на Паскале: нет такого языка среди поддерживаемых и разрабатываемых microsoft. Но Вы, совершенно точно, можете вызывать функции Win32 API из программ на Delphi и Free Pascal.
Неизвестный
05.05.2010, 14:28
общий
Послал Вам тестовое письмо с моего ящика "тут"[q=]

Тестовое сообщение получено!

Что-что хочешь тут сделать?

Очепяткался ... (далеко промахнулся), не принимайте всерьез

Следующий 16-битный код копирует byte_count байт из source_addr в destination_addr (это можно сделать и чисто на Паскале)

Что-то это код мне ассемблер напоминает (вчера нашел краткий справочник функций).
Неизвестный
05.05.2010, 14:48
общий
Тепляков Константин Владимирович:
Цитата: 229812
Что-то это код мне ассемблер напоминает

так Вы же и просили
Цитата: 229812
ассемблерную вставку следующего смысла - "Скопировать побайтно 630 байт из памяти началом в адресе ХХХХ:ХХХХ в память с адресом УУУУ:УУУУ"

На самом деле, в такой вставке нет смысла - то же самое делает паскалевская процедура move.
Форма ответа