|
Клюг
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
||||||
| 20.12.2013, 22:35 | ||||||
|
JWasm(краткий экскурс) JWasm (автор - Andreas 'Japheth' Grech)- это форк ассемблера WASM, допиленый до совместимости с МАСМом, и не только:- поддержка выходных форматов Intel OMF, MS Coff (32/64-bit), Elf (32/64-bit), двоичный, Windows PE (32/64-bit) и DOS MZ. - существуют версии JWasm для DOS, Windows и Linux. Последняя версия 2.12 вышла вчера, 19.12.2013. Главное и очень радующее отличие от МАСМа - это многопроходность, т. е. отпадает необходимость ставить секцию .data и определения 'EQU' и '=' в начале проги, перед секцией .code . Ключики и опции командной строки в основном совпадают с МАСМом, но есть отличия: JWasm [опции] asm-файл [опции] [asm-файл] ... [@env_var] -<0|1|..|10>[p] тип процессора: 0=8086 (default), 1=80186, 2=80286, 3=80386, 4=80486, 5=Pentium, 6=PPro, 7=P2, 8=P3, 9=P4, 10=x86-64; <p> разрешить привелегированные инструкции -AT не поддерживается, но .com-файл получить можно, об этом ниже. -Bl не поддерживается -e<number> макс. кол-во ошибок (умолчание=50) -eq не выводить сообщения об ошибках -F не поддерживается -Fe не поддерживается -Fd[=<fname>] записать файл импорта -Fi<fname> принудительно включтить <fname> в трансляцию -Fm не поддерживается -Fw<fname> задать имя файла ошибок -FPi87 команды 80x87 (умолчание) -fpc запретить команды FPU -fp<n> тип FPU, <n>: 0=8087 (умолчание), 2=80287, 3=80387 -FR не поддерживается -Fr не поддерживается -H не поддерживается -link не поддерживается -m<t|s|c|m|l|h|f> модель памяти: (Tiny, Small, Compact, Medium, Large, Huge, Flat) -nc=<name> имя класса для сегменнта кода -safeseh Assert all exception handlers are declared -Sc не поддерживается -Sg включить генерируемый код в листинг -Sp,Ss,Sl,St не поддерживается -zcm добавлять префикс '_' к именам Си (умолчание) -zcw НЕ добавлять префикс '_' к именам Си -zf<0|1> задать тип FASTCALL: 0=стиль MS VC (умолчание), 1=регистровое соглашение OW -Zg генерить код как Masm ![]() -Zi[0|1|2|3] добавить отладочную инфу (OMF & COFF) для: 0=глобальных имен, 1= +локальных, 2= +типов (умолчание), 3= +констант -zlc не добавлять OMF-записи о данных в коде -zld не добавлять OMF-записи об оптимизации вызовов far call -zl<f|p|s> запретить записи в таблице символов COFF: f=o точке входа .file, p=o статических процедурах static procs, s=o доп. точках входа для секций -Zne запретить расширения синтаксиса, НЕ поддерживаемые Masm'ом -zt<0|1|2> тип декорации(включения парамеров вызова в имя) для STDCALL: 0=выкл, 1=без суффикса '@size' для ф-ций, 2=полная декорация (умолчание) -Zv8 включить видимость PROC для Masm v8+ -zze выключить декорацию имён для экспортируемых символов -zzs сохранить декорированное имя стартового адреса (только COFF) @env_var имя файла или переменной окружения с опциями выходные форматы: -bin бинарный файл -coff объектный файл формата COFF -elf объектный файл формата 32-bit ELF -elf64 объектный файл формата 64-bit ELF -mz бинарный файл формата DOS MZ -omf объектный файл формата OMF (умолчание) -pe бинарный файл формата PE, 32/64-bit -win64 объектный файл формата 64-bit COFF Описание остальных опций можно найти в локализованом мане по МАСМу. Имеем файлик hello.asm
или hello.exe командой jwasm -ms -mz -Fo=hello.exe hello.asm Страничка проекта: http://www.japheth.de/JWasm.html
5
|
||||||
| 20.12.2013, 22:35 | |
|
Ответы с готовыми решениями:
65
Организация тем в разделе Assembler, MASM, TASM Полезные макросы для MASM и TASM |
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
||||||||||||||||||||||||||||||||
| 30.12.2013, 10:46 [ТС] | ||||||||||||||||||||||||||||||||
|
Reverse Engeneering Представим что программа написана на языке С, в которой функция xchg меняет местами две целочисленные переменные a и b
А теперь поставим перед собой задачу научиться сочетать функции написанные на С, и функции, написанные на ассемблере. Проще всего это сделать, подсмотрев, как компилятор транслирует функцию на язык ассемблера. В компиляторе Borland C++ выдачей листинга на ассемблере управляет ключ -S. Чтобы получить этот листинг, сохраним функцию в отдельном файле xchg.c:
После запуска компилятора, в папке где хранится исходный текст функции xchg.c появятся обектный файл xchg.obj и ассемблерный листинг xchg.asm. При открытии видно множество непонятных директив, меток, начинающихся знаком вопроса и комментариев. Текст создан компилятором и поэтому трудночитаем, но в нем можно выделить строки непосредственно относящиеся к нашей функции
4
|
||||||||||||||||||||||||||||||||
|
Клюг
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
||||||||||||||||
| 05.01.2014, 13:03 | ||||||||||||||||
|
Reverse Engeneering в умелых руках и с хорошим инструментарием вообще способен творить чудеса. То, что на асме выглядело так:
Кликните здесь для просмотра всего текста
Сначала быстро и непринужденно превращается в более читабельное: Кликните здесь для просмотра всего текста
а затем уже просто в конфетку:
4
|
||||||||||||||||
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 16.01.2014, 07:01 [ТС] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Статья представляет из себя сокращение 10 главы книги Магда Ю.С. "Ассемблер для процессоров Intel Pentium". — СПб.: Питер, 2006. — 410 с.: ил.
Интерфейс с языками высокого уровня В процессе разработки программ на языках высокого уровня одной из важнейших проблем, с которой сталкивается разработчик, является производительность приложения. Эффективным средством ее повышения является применение языка ассемблера для разработки критических участков программного кода и оформление их в виде подпрограмм. Необходимость разработки отдельной подпрограммы на ассемблере возникает, когда требуется:
Общие принципы построения интерфейсов Принципы создания интерфейсов ассемблерных подпрограмм с ЯВУ будут рассматриваться применительно к Microsoft Visual C++ и Borland Delphi. В этих пакетах программ в качестве базовых языков программирования используются языки C++ и Pascal.Для компиляции ассемблерных подпрограмм и процедур можно задействовать макроассемблер MASM версии 6.14 или 7.10. При разработке и анализе программного кода будут рассматриваться только 32-разрядные подпрограммы на ассемблере, разработанные с помощью модели памяти flat. В примерах будут использованы отдельно скомпилированные модули на ассемблере (OBJ-файлы), которые компонуются с программами на C++ .NET и Delphi 2005.
Если во время сборки приложения на Delphi появятся сообщения наподобие следующих, то это свидетельствует о некорректном формате объектного файла: [Error] Project1.dpr(15): Е2045 Bad object file format: \...\sub1.obj' [Error] Project1.dpr(11): E2065 Unsatisfied forward or external declaration: ‘sub1’ Второе сообщение является следствием обнаруженной компилятором некорректности. Чтобы избежать подобных ошибок во время сборки программ в Delphi, следует указывать параметр /omf (версия 7.10 MASM) при компиляции ассемблерной процедуры. Во время компиляции ассемблерных модулей можно использовать упрощенный вариант командной строки, например:
Warning: converting object format from OMF to COFF Это предупреждение свидетельствует о том, что OMF-файл будет преобразован в формат COFF, и принципиально оно ничего не меняет, поскольку компилятор Visual C++ .NET преобразует OMF-файл в формат COFF в любом случае. Перед сборкой приложения в Visual C++ .NET необходимо добавить в проект объектный файл с вызываемой процедурой. Лучше всего поместить объектный файл с процедурой в рабочий каталог проекта. При сборке проекта в Delphi следует указать местоположение объектного файла при помощи директивы {$L путь_к_объектному_файлу} Перед разработкой ассемблерных процедур для использования в программах на C++ и Pascal остановимся подробно на требованиях, которые должен соблюдать разработчик при создании интерфейса:
Способ передачи параметров ассемблерной процедуре должен учитывать следующее:
Директивы, указанные в первой колонке слева, называют соглашениями о вызовах (calling conventions), соглашениями об именовании или соглашениями о передаче параметров. Все эти определения являются синонимами и определяют способы взаимодействия программных модулей (в общем случае, разработанных с помощью разных языков программирования). Любая из этих директив определяет:
Вторая колонка слева показывает порядок размещения параметров в стеке или в регистрах (при передаче параметров через регистры). Например, пусть мнемоника вызываемой процедуры записывается так: myproc (param1, param2, paramЗ) Тогда при способе передачи параметров stdcall первым помещается в стек параметр paramЗ, вторым — параметр param2 и третьим — параметр param1. Если, например, используется способ передачи параметров register, то параметр param1 помещается в регистр eax, параметр param2 — в регистр edx и, наконец, параметр paramЗ — в ecx. Параметры в стеке размещаются, начиная с адреса esp+4, поскольку указатель стека esp содержит эффективный адрес (ЕА) команды следующей после вызова call myproc. Это действительно для любых способов передачи параметров, использующих стек (pascal, cdecl, safecall), параметры будут находиться в стеке, начиная с адреса esp+4.
В нашем примере нужно сместить указатель стека на 12 вверх (3 параметра х 4 байта). Такую операцию может выполнить как вызывающая программа, так и сама процедура. Способ очистки стека определяется соглашением о передаче параметров. В случае соглашения stdcall стек очищает сама вызываемая процедура, для чего в исходный текст включается команда ret n, где n — число возвращаемых байтов памяти. Эта команда должна быть последней командой процедуры. Для процедуры myproc команда возврата должна выглядеть как ret 12, хотя вместо нее можно использовать комбинацию команд:
Выбор того или иного способа передачи параметров определяется практическими аспектами. Если в программе применяются функции Windows API, то стандартным соглашением вызова для них является stdcall. Директива cdecl является стандартной для компиляторов C++ и используется ими по умолчанию при вызове процедур из других модулей. Наиболее быстрым способом передачи параметров является регистровый (register). В Visual C++ .NET этот способ называется — fastcall. Если количество передаваемых в процедуру параметров не превышает трех, то стек не используется, что и дает выигрыш в скорости. Способ передачи параметров типа pascal используется редко и поддерживается компиляторами в целях обратной совместимости (backward compatibility). Вызываемая процедура в большинстве случаев возвращает основной программе результат в регистре eax. Результатом может быть либо непосредственное значение, либо адрес. Во втором случае процедура возвращает ссылку. Интерфейс ассемблерных процедур с Delphi Для демонстрации интерфейса ассемблерных процедур с программами на Delphi (и Visual C++ .NET) будем использовать простейшие 32-разрядные консольные приложения, вызывающие процедуру и отображающие результат ее работы на экране.В первом примере вызываемая процедура (example1) вычисляет разность двух целых чисел, передаваемых ей в качестве параметров, и возвращает результат в регистре eax в основную программу.
Еще один вопрос, который предстоит решить, — какой способ передачи параметров должна выбрать вызывающая программа на Delphi. В нашем примере выберем способ передачи параметров в соответствии с соглашением stdcall. В этом случае по адресу ЕВР+12 будет находиться правый параметр, а по адресу ЕВР+8 — левый. Далее при помощи следующих команд определяется разность двух целых чисел:
В исходном тексте процедуры example1 нет упоминания о соглашении stdcall. Вызывающая программа не проверяет, какое соглашение использует процедура: параметры передаются в соответствии с директивами, указанными в основной программе. Точно так же вызывающая программа не проверяет, был ли очищен указатель стека после выхода из вызываемой процедуры. Разработчик должен сам заботиться о корректном написании программного кода процедуры. Программный код вызывающей программы, написанной на Delphi.
Вызываемую процедуру нужно объявить как внешнюю (external) и использующую соглашение о вызовах stdcall. Следует указать параметры и их тип, а также тип возвращаемого внешней процедурой значения. Эти действия выполняет директива
В соответствии с этим объявлением процедуры в вызывающей программе, процедура example1 извлекает параметр i1 по адресу ЕВР+8, а параметр i2 — по адресу ЕВР+12 Результат выполнения процедуры example1 численно равен i1 - i2. Остальная часть программы на Delphi обеспечивает инициализацию переменных и вызов процедуры example2:
В этом примере при вызове процедуры example1 было использовано соглашение stdcall. Посмотрим, как изменятся вызывающая программа и процедура example1, если в качестве соглашения об именовании принять cdecl. Что касается процедуры example1, то здесь произойдет только одно изменение — команда возврата из процедуры ret будет использоваться без параметров; этот фрагмент кода выглядит так:
Модифицированный вариант процедуры example1 для соглашения register
До сих пор мы рассматривали работу процедур, возвращающих в регистре eax определенное значение. Намного чаще в вызывающую программу возвращается не сама переменная, а ее адрес. В этом случае процедура возвращает ссылку. При помощи ссылки можно обращаться к строкам и массивам, что значительно расширяет область применения ассемблерных процедур. В следующем примере процедура (example2) вычисляет разность двух чисел с плавающей точкой, являющихся ее параметрами, и возвращает адрес результата в вызывающую программу. При вызове процедуры используется соглашение stdcall.
Вызывающая программа для процедуры
Обратите внимание на два оператора:
Интерфейс ассемблерных процедур с Visual C++ .NET Используем тексты процедур example1 и example2. В первом примере при помощи процедуры example1 вычислим разность двух целых чисел и отобразим результат операции на экране. Предположим, что процедура использует соглашение stdcall. В этом случае исходный текст процедуры example1 останется практически без изменений, но потребуется внести коррективы в имя процедуры: добавить в начале имени символ подчеркивания, а в конце имени — суффикс @n, где n — число байтов, необходимое для передачи параметров. Подобная форма именования соответствует требованиям компилятора C++ для соглашения stdcall. Модифицированная версия процедуры example1 для работы с C++ .NET (соглашение stdcall)
Вызывающая программа на Visual C++ .NET
этого, требует формирования имени вызываемой процедуры специальным образом (как было показано ранее). Для компилятора Visual C++ .NET соглашением об именовании по умолчанию является cdecl, поэтому указывать его необязательно. Любое другое соглашение (stdcall, fastcall) необходимо указывать явным образом при объявлении внешней процедуры. Двойное подчеркивание при задании соглашения об именовании обязательно. Оператор "С" предотвращает декорирование имени процедуры. Этот параметр имеет смысл только для компилятора C++, помните, что в объявлении процедуры присутствие оператора "С" необходимо. Модифицируем предыдущий пример так, чтобы вызываемая процедура использовала соглашение об именовании cdecl. Для этого в исходном тексте процедуры example1 изменим имя процедуры, чтобы оно удовлетворяло соглашению cdecl — в начале имени должен присутствовать символ подчеркивания, в то время как оставшаяся часть остается неизменной. Кроме того, в исходном тексте процедуры команду ret нужно указать без параметров. Модифицированная версия процедуры example1, использующая соглашение cdecl
Проведем анализ самого быстрого способа передачи параметров — fastcall. В соответствии с таблицей первые два параметра в вызываемую процедуру передаются слева направо с помощью регистров ecx и edx, а остальные — справа налево через стек. Кроме того, имя вызываемой процедуры при таком соглашении должно формироваться следующим образом: в начале имени процедуры ставится знак амперсанда (@), а в конце — сочетание символов имеющее тот же смысл, что и для соглашения stdcall. Модифицированная версия процедуры example1, использующая соглашение fastcall
Вычисление разности двух чисел с плавающей точкой
5
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
||||||||||||||||
| 18.01.2014, 03:54 [ТС] | ||||||||||||||||
|
Включение ассемблерных процедур в программы на Бейсике Процедуры на языке ассемблера состоят из строк байтов машинного кода. При выполнении этой процедуры Бейсик передает управление из последовательности инструкций, составляющих программу на Бейсике, в то место, где хранятся инструкции, которые могут быть декодированы в последовательность инструкций языка ассемблера. При завершении ассемблерной процедуры управление возвращается в то место программы, откуда была вызвана процедура.Ассемблерные процедуры, используемые в программах на Бейсике, могут быть представлены двумя вариантами. В обоих вариантах процедуры включены в программу, а не хранятся в виде отдельного файла. В первом варианте требуется, чтобы коды процедуры находились в отдельном месте в памяти, а для второго варианта, этого не требуется. В первом варианте процедура помещается в операторы DATA и программа пересылается в неиспользуемую часть памяти, а затем вызывается оператором CALL. Чтобы код процедуры не накладывался на какие-либо данные и наоборот. Для этого процедура помещается в те адреса памяти, к которым Бейсик не может получить доступ. Поскольку интерпретатор Бейсика не имеет доступ за пределы 64K, то для системы с памятью 256K, нужно поместить процедуру в старших 64K адресах. Для систем с памятью 128K нужно вычислить сколько памяти требуется операционной системе, Бейсику и драйверам устройств. Допустимо, чтобы они занимали 25K плюс 64K, используемых Бейсиком. В системах с 64K при старте используется команда CLEAR, которая ограничивает объем памяти доступный для Бейсика. CLEAR,n ограничивает Бейсик n байтами. Затем процедура размещается в самых верхние адресах памяти. Для указания начала области, куда будет помещена процедура, используется оператор DEF SEG, затем с помощью оператора READ считываются байты процедуры и помещаются в память до тех пор, пока вся процедура не будет помещена на место. Например:
Переделано из Джордейн Р. "Справочник программиста персональных компьютеров типа IBM PC, XT и AT" М:."Финансы и статистика" 1992
2
|
||||||||||||||||
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 20.01.2014, 09:55 [ТС] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Всё о резидентах П.Абель РЕЗИДЕНТНЫЕ ПРОГРАММЫ Существует ряд распространенных фирменных программ (Prokey, Superkey, Homebase, Sidekick и др.), специально разработанных как резидентные, которые находятся в памяти во время работы других программ. Эти программы можно активизировать нажатием определенных клавиш. Такие программы называются резидентными, и они загружаются в память сразу после загрузки DOS перед выполнением обычных программ. Для того, чтобы оставить резидентную COM-программу в памяти, необходимо вместо команды ret или int 20h для выхода использовать команду int 27h или функцию DOS 31h. Для int 27h следует передать системе в регистре dx размер программы:
Более сложная часть включает программирование механизма активизации резидентной программы, которая хотя и присоединена к DOS, но не является внутренней программой DOS, как DIR, COPY или CLS. Общим подходом является модификация таблицы векторов прерываний таким образом, чтобы резидентная программа, получала управление при нажатии определенных клавиш или их комбинаций, а все остальные передавала через себя. Резидентная программа обычно (но не обязательно) состоит из следующих частей:
Рассмотрим пример резидентной программы (1.ZIP - 1131 байт). Программа перехватывает обработчик прерываний клавиатуры
Пример иллюстрирует резидентную программу, которая устанавливает цвет экрана при одновременном нажатии клавиш Alt и Left Shift. Основные моменты, представляющие интерес: Флаговый байт клавиатуры (KBFLAG), который отражает состояние клавиатуры, находится по адресу 417h. Бит 3 в этом байте регистрирует нажатие клавиши Alt, а бит 1 - нажатие клавиши Left Shift. Первая выполняемая команда jmp initze обходит резидентную часть и передает управление в процедуру инициализации (initze) в конце программы. Эта процедура устанавливает регистр DS равным сегментному адресу таблицы векторов прерываний, копирует адрес элемента таблицы для int 9 в переменую kbsave в резидентной части программы. Следующим шагом в таблице утанавливается адрес резидентного обработчика и содержимое регистра cs. Таким образом, вектор прерывания int 9 содержит два измененных слова: смещение и значение адреса из регистра cs, которые вместе определяют адрес процедуры colors в памяти, куда будут направляться теперь все символы, поступающие с клавиатуры. Затем процедура инициализации заносит в регистр dx размер процедуры COLORS (адрес INITZE на один байт больше, чем адрес конца процедуры COLORS) и прекращает работу, используя int 27h. Процедура COLORS является резидентной, и она получает управление при нажатии любой клавиши на клавиатуре. Так как это происходит при работе других программ (например, DOS или текстового редактора), то процедура должна сохранить все регистры, которые она использует (а также несколько других на всякий случай). Затем происходит вызов по адресу KBSAVE, т.е. вызов подпрограммы обработки прерывания, после чего процедура проверяет флаг клавиатуры для определения нажатия клавиш Alt и Left Shift. Если эти клавиши были нажаты, то процедура устанавливает необходимые цвета. Завершающие команды включают восстановление всех запомненных вначале регистров (в обратной последовательности) и выход из обработки прерывания по команде IRET. Поскольку приведенная программа носит иллюстративный характер, ее можно модифицировать или расширить для собственных целей. Некоторые фирменные программы, также изменяющие адрес в векторной таблице для прерывания 9, не разрешают конкурентное использование резидентных программ, аналогичных рассмотренной в данной главе. Написание резидентных программ для MS DOS В статье описаны основные шаги, используемые при написании резидентных программ на ассемблере для операционной системы MS DOS. В конце статьи подробно разобран пример резидентной программы.Резидентная программа для MS DOS представляет собой фрагмент кода, постоянно находящийся в оперативной памяти компьютера и вызываемый при возникновении определённых условий. Далее будет показано как написать резидентную программу на ассемблере, постоянно находящуюся в памяти и вызываемую при возникновении в системе прерываний. Сначала рассмотрим определения и основные типы прерываний для процессоров x86. Прерывание для процессоров x86 представляет собой некоторое событие в системе, нуждающееся в определённой обработке. При возникновении прерывания, за исключением одного случая, выполнение текущей программы прерывается и происходит обработка прерывания. После обработки прерывания продолжается выполнение прерванной программы. Для процессоров x86 существуют следующие виды прерываний: аппаратные, программные и внутренние прерывания процессора. Аппаратные прерывания, в свою очередь, разделяются на маскируемые и немаскируемые. Маскируемые аппаратные прерывания при определённых условиях могут быть проигнорированны процессором, а немаскируемые прерывания обрабатываются всегда. Аппаратное прерывание можно определить как запрос от некоторого периферийного устройства (клавиатура, последовательный порт, дисковод и т. д.) на обработку данных этого устройства, управление им или возникновение исключительной ситуации для этого устройства. При возникновении такого запроса выполнение текущей программы прерывается (если это прерывание не замаскировано) и вызывается процедура обработчика прерывания. Обработчик прерывания выполняет необходимые действия для получения данных от периферийного устройства или для управления им и возвращает управление в прерванную программу. Программные прерывания представляют собой вызов каких-либо функций или сервисов операционной системы и прикладных программ с использованием команды INT XX, где XX - номер прерывания от 0 до 255. Внутренние прерывания процессора возникают при выполнении программой каких-либо операций, вызывающих фатальные ошибки (например, деление на 0, переполнение при делении, выход за границы сегмента и т. д.), а также при использовании режима отладки. В любом случае, при возникновении прерывания какого-либо типа вызывается обработчик этого прерывания, который представляет собой специальным образом оформленную процедуру. Для аппаратных прерываний обработчик прерывания должен помимо работы с устройством, вызвавшим прерывание, выполнить некоторые операции по управлению аппаратурой механизма прерываний процессора x86. Рассмотрим процесс написания процедуры обработчика прерывания на ассемблере, вызываемого при возникновении программного прерывания. Общая структура и синтаксис для обработчика программного прерывания:
В секции 1 выполняется сохранение всех регистров, изменяемых в процедуре обработчика. Это необходимо для того, чтобы после возвращения управления в прерванную программу, она получила регистры в том же виде, какими они были до вызова программного прерывания. Если прерывание должно возвращать в вызвавшую его программу некоторые результаты в регистрах, то сохранять значение этих регистров не требуется. В секции 2 выполняется инициализация сегментных регистров DS, ES или SS для обращения процедуры обработчика прерывания к своим внутренним данным, стеку или некоторому дополнительному сегменту. Значения инициализируемых регистров должны быть сохранены в секции 1. В секции 3, собственно, выполняется основной код процедуры обработчика прерывания, выполняются необходимые действия и заносятся значения в регистры, если прерывание должно возвращать в вызвавшую его программу некоторые результаты в регистрах. В секции 4 происходит восстановление значений для изменённых процедурой обработчика прерывания регистров, кроме тех регистров, в которых вызвавшей прерывание программе возвращаются результаты. Команда IRET выполняет возврат из процедуры обработчика прерывания в вызвавшую его программу. Рассмотрим подробнее какие действия выполняют команды INT и IRET. Так как при выполнении команды INT XX должен быть вызван некоторый обработчик прерывания с номером XX необходимо по номеру узнать адрес обработчика в памяти (сегмент и смещение). Для этого служит специальная таблица векторов прерываний, располагающаяся по адресу 0000:0000 в оперативной памяти компьютера. Эта таблица содержит 256 четырёхбайтовых значений, определяющих адреса обработчиков прерываний в памяти. Первые 15 четырёхбайтовых значений в таблице зарезервированны для аппаратных прерываний (маскируемых и немаскируемых) и для внутренних прерываний процессора. Остальные значения в таблице определяют адреса обработчиков программных прерываний. Среди этих значений есть и такие, которые предназначены для пользовательских обработчиков программных прерываний. Первые два байта для каждой ячейки в таблице определяют смещение обработчика соответствующего программного прерывания. Следующие два байта определяют сегмент обработчика прерывания. При вызове команды INT XX выполняются следующие действия: В стеке сохраняются в следующей последовательности: регистр флагов, сегментный регистр CS, регистр указателя команд IP. Сбрасываются флаги IF и TF в регистре флагов. Вычисляется смещение относительно начала таблицы векторов прерываний: смещение=XX * 4, где XX - номер прерывания. В сегментный регистр CS по вычисленному смещению из таблицы векторов прерываний заносится значение сегмента обработчика прерывания, а в регистр IP - смещение обработчика прерывания. Происходит передача управления на обработчик программного прерывания. При этом все регистры кроме CS, IP и регистра флагов сохраняют своё значение таким, каким оно было до вызова команды INT XX. Таким образом, при входе в обработчик программного прерывания, в стеке находятся значения регистров CS, IP и регистра флагов. Эти значения находились в данных регистрах до вызова команды INT XX. В вершине стека располагается значение регистра IP. При вызове команды IRET выполняются следующие действия:
После выполнения команды IRET структура стека становится такой же, какой она была до вызова команды INT XX. Таковы основные моменты, используемые при написании обработчиков программных прерываний. Рассмотрим теперь структуру и работу обработчиков аппаратных прерываний. В отличие от обработчиков программных прерываний, обработчики аппаратных прерываний вызываются не командой INT, а самим процессором. Выше было сказано, что при написании обработчиков аппаратных прерываний они должны выполнять ещё и некоторые действия по управлению аппаратурой механизма прерываний процессора x86. В простейшем случае, структура такого обработчика выглядит следующим образом:
При возникновении аппаратного прерывания от некоторого периферийного устройства контроллер прерываний выполняет проверку, не замаскировано ли это прерывание. Если оно не замаскировано, то контроллер выполняет сравнение приоритетов этого прерывания с другим, если несколько прерываний поступили в контроллер одновременно. Если прерывание замаскировано или заблокировано, то оно игнорируется контроллером. После выбора прерывания с более высоким приоритетом (логика назначения приоритетов прерываниям может быть запрограммирована пользователем) контроллер посылает сигнал INTR (Interrupt Request - запрос прерывания) в процессор. Если в процессоре в регистре флагов сброшен флаг прерывания IF, то сигнал INTR игнорируется. Если флаг IF установлен, то процессор отвечает контроллеру сигналом INTA (Interrupt Acknoledge) на что контроллер, в свою очередь, посылает процессору номер вектора прерывания для выбранного прерывания и блокирует все прерывания этого и более низкого приоритета. Процессор по полученному номеру вектора прерывания отыскивает в таблице векторов прерываний адрес соответствующего обработчика аппаратного прерывания и вызывает его. Команда OUT 20h, AL, вызываемая в конце обработчика аппаратного прерывания, разблокирует контроллер прерываний, разрешая ему работу с ранее заблокированными прерываниями. Если требуется написать обработчик аппаратного прерывания, который должен только выполнять определённые действия при возникновении аппаратного прерывания (например, выдавать звуковой сигнал при нажатии на любую клавишу), всю работу по управлению соответствующей аппаратурой можно возложить на системный обработчик этого аппаратного прерывания. В таком случае, структура обработчика будет следующей:
После того, как определено, каким образом оформить процедуру обработчика аппаратного или программного прерывания, рассмотрим действия, необходимые для того, чтобы эта процедура обработчика вызывалась при возникновении прерывания. Как уже было сказано выше, в оперативной памяти компьютера по адресу 0000:0000 располагается таблица векторов прерываний, элементы которой определяют адреса обработчиков прерываний в памяти. Для обработчика программного или аппаратного прерывания без вызова системного обработчика нужно лишь записать в соответствующий элемент таблицы векторов прерываний значение сегмента и смещения этого обработчика. Рассмотрим необходимые операции для записи сегмента и смещения в таблицу для обработчика программного или аппаратного прерывания с номером N:
Рассмотрим теперь необходимые операции для установки сегмента и смещения в таблице для обработчика программного или аппаратного прерывания, в котором будет вызван системный обработчик этого прерывания. Для этого перед записью в таблицу новых значений сегмента и смещения нужно сначала сохранить значения сегмента и смещения системного обработчика:
Приведённые выше фрагменты кода можно упростить, используя функции прерывания DOS INT 21h. Функция DOS 35h позволяет получить адрес обработчика прерывания. При этом в регистр AH записывается номер функции (35h), в регистр AL записывается номер прерывания. После вызова прерывания INT 21h в регистре ES возвращается значение сегмента обработчика указанного прерывания. В регистре BX взвращается значение смещения обработчика указанного прерывания:
Также при написании любого обработчика прерывания нужно инициализировать сегментный регистр DS, если обработчик обращается к каким-либо внутренним ячейкам памяти. Вместо этого можно использовать обращение к ячейкам памяти с использованием префикса замены сегмента (например CS:[BX]), но это увеличивает размер соответствующей команды. Использование префикса замены сегмента эффективно в том случае, когда количество обращений к внутренним ячейкам памяти обработчика невелико (2 - 3). Рассмотрим теперь средства для завершения резидентной программы и сохранении части её кода в памяти для последующего использования при возникновении прерываний. Прерывание DOS INT 27h. Прерывание предназначено для завершения программы и сохранения её резидентной в памяти. Для этого в регистр DX нужно занести количество байт для сохраняемой части программы плюс один байт. Начало сохраняемой части программы совпадает со смещением 0000h относительно кодового сегмента, поэтому для COM программ нужно учитывать размер префикса программного сегмента (PSP - Program Segment Prefix) - 256 байт. Прерывание DOS INT 21h, функция 31h. Функция 31h прерывания DOS INT 21h выполняет те же действия, что и прерывание DOS INT 27h, но в регистр DX заносится размер сохраняемой части программы в параграфах (блоки памяти длиной 16 байт). Также имеется возможность определить код возврата при завершении резидентной программы (заносится в регистр AL). Ниже приведёна общая структура резидентной программы:
Идентификатор old_int_1Ch определяет ячейку памяти размером 4 байта, которая хранит адрес старого обработчика прерываний от таймера. Эта ячейка будет нужна, когда будет вызываться старый обработчик прерываний от таймера. Процедура decode преобразует двоично-десятичное число в регистре AL в два ASCII символа, соответствующих значению часов, минут или секунд (это зависит от конкретного значения, записанного в регистре AL). Процедура прибавляет к значению разряда числа (младший разряд находится в первых четырёх битах регистра AL, старший - в старших четырёх битах) ASCII код символа '0', тем самым формируя ASCII код для цифры младшего или старшего разряда. Далее этот ASCII код выводится на экран. Процедура clock является обработчиком прерываний от таймера. Дело в том, что номер аппаратного обработчика прерываний от таймера - 8. Но в системном обработчике этого аппаратного прерывания есть вызов INT 1Ch. Прерывание 1Ch определяет пользовательский обработчик прерываний от таймера, который вызывается системным. Таким образом, ячейка old_int_1Ch хранит адрес старого пользовательского обработчика прерываний от таймера. В начале процедуры clock на экран выводится текущее время, а затем вызывается старый пользовательский обработчик прерываний от таймера. В процедуре clock сохраняются в стеке все модифицируемые регистры (в том числе и сегмента ES). Следующим шагом является получение значения текущего времени из СМOS. Значения часов, минут и секунд представлено в двоично-десятичном формате - младший разряд числа находится в младших четырёх битах регистра, а старший разряд числа - в старших четырёх битах. Трижды вызывается процедура decode для записи на экран соответственно часов, минут и секунд. Регистр ES настраивается на сегмент видеопамяти, а регистр DI настраивается на начало сегмента видеопамяти. Далее в цикле происходит вывод в видеопамять символов и атрибутов. После этого восстанавливаются значения всех модифицируемых процедурой регистров и происходит возврат из обработчика. В основной (нерезидентной) части программы при помощи функции DOS 35h происходит получение адреса старого пользовательского обработчика прерываний от таймера (прерывание 1Сh). Значения сегмента и смещения старого обработчика записываются в ячейку old. Далее устанавливается адрес нашего обработчика прерываний от таймера. Для этого в регистр DX записывается смещение нашего обработчика (смещение процедуры clock) и вызывается функция DOS 25h (регистр DS уже содержит значение сегмента нашего обработчика). После этого вычисляется размер резидентной части программы в параграфах. Для этого сначала вычисляется размер резидентной части в байтах, не считая префикса программного сегмента. Затем к полученному значению прибавляется размер префикса программного сегмента - 256 и число 0Fh. Прибавление числа 0Fh необходимо, чтобы округление при делении на 16 осуществлялось в большую сторону. После вычисления размера резидентной части в параграфах происходит вызов функции DOS 31h, которая завершает программу и сохраняет часть её кода в памяти. Резидентная программа запущена. Зубков Программы, остающиеся в памяти, после того как управление возвращается в DOS, называются резидентными. Превратить программу в резидентную просто — достаточно вызвать специальную системную функцию DOS.Резидентные программы Функция DOS 31h: Оставить программу резидентной
Кроме того, существует и иногда используется предыдущая версия этой функции — прерывание 27h: INT 27h: Оставить программу резидентной
Эта функция не может оставлять резидентными программы размером больше 64 Кб, но многие программы, написанные на ассемблере, соответствуют этому условию. Так как резидентные программы уменьшают объем основной памяти, их всегда пишут на ассемблере и оптимизируют для достижения минимального размера. Никогда не известно, по каким адресам в памяти оказываются загруженные в разное время резидентные программы, поэтому единственным несложным способом получения управления является механизм программных и аппаратных прерываний. Принято разделять резидентные программы на активные и пассивные, в зависимости от того, перехватывают ли они прерывания от внешних устройств или получают управление, только если программа специально вызовет команду INT с нужным номером прерывания и параметрами. Пассивная резидентная программа В качестве первой резидентной программы рассмотрим именно пассивный резидент, который будет активироваться при попытке программ вызывать INT 21h и запрещать удаление файлов с указанного диска.
Прежде чем это сделать, заметим, что и номер диска, и адрес предыдущего обработчика INT 21h изменяются только при установке резидента и являются константами во время всей его работы. Более того, каждое из этих чисел используется только по одному разу. В этих условиях оказывается, что можно вписать номер диска и адрес перехода на старый обработчик прямо в код программы. Более того, после этого наш резидент не будет больше ссылаться ни на какие переменные с конкретными адресами, а значит, его код становится перемещаемым, то есть его можно выполнять, скопировав в любую область памяти.
Мультиплексорное прерывание Если вы запустите предыдущий пример несколько раз, с разными или даже одинаковыми именами дисков в командной строке, объем свободной памяти DOS каждый раз будет уменьшаться на 208 байт, то есть каждый новый запуск устанавливает дополнительную копию резидента, даже если она идентична уже установленной. Разумеется, это неправильно — инсталяционная часть обязательно должна уметь определять, загружен ли уже резидент в памяти перед его установкой. В нашем случае это не приводит ни к каким последствиям, кроме незначительного уменьшения объема свободной памяти, но во многих чуть более сложных случаях могут возникать различные проблемы, например многократное срабатывание активного резидента по каждому аппаратному прерыванию, которое он перехватывает.Для того чтобы идентифицировать себя в памяти, резидентные программы обычно или устанавливали обработчики для неиспользуемых прерываний, или вводили дополнительную функцию в используемое прерывание. Например: наш резидент мог бы проверять в обработчике INT 21h АН на равенство какому-нибудь числу, не соответствующему функции DOS, и возвращать в, например, AL код, означающий, что резидент присутствует. Очевидная проблема, связанная с таким подходом, — вероятность того, что кто-то другой выберет то же неиспользуемое прерывание или что будущая версия DOS станет использовать ту же функцию. Именно для решения этой проблемы, начиная с версии DOS 3.3, был предусмотрен специальный механизм, позволяющий разместить до 64 резидентных программ в памяти одновременно, — мультиплексорное прерывание. INT 2Fh: Мультиплексорное прерывание
Начало обработчика прерывания должно выглядеть следующим образом:
INT 2Dh: Мультиплексорное прерывание AMIS
Рассмотрим функции, описанные в спецификации AMIS как обязательные. INT 2Dh AL = 00h: Функция AMIS — проверка наличия резидентной программы
INT 2Dh AL = 04h: Функция AMIS — получить список перехваченных прерываний
Так же как и с предыдущим примером, программы, не использующие средства DOS/BIOS для работы с клавиатурой, например файловый менеджер FAR, будут получать все нажатые клавиши параллельно с нашей программой, что приведет к нежелательным эффектам на экране. Кроме того, в этом упрощенном примере отсутствуют некоторые необходимые проверки (например, текущего видеорежима) и функции (например, выгрузка программы из памяти), но тем не менее это — реально используемая программа, с помощью которой легко посмотреть, какой символ соответствует какому ASCII-коду, и ввести любой символ, которого нет на клавиатуре, в частности псевдографику.
3
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
||||||||||||||||
| 20.01.2014, 09:55 [ТС] | ||||||||||||||||
|
Выгрузка резидентной программы из памяти Чтобы выгрузить резидентную программу из памяти, необходимо сделать три вещи: закрыть открытые программой файлы и устройства, восстановить все перехваченные векторы прерываний, и наконец, освободить всю занятую программой память. Трудность может вызвать второй шаг, так как после нашего резидента могли быть загружены другие программы, перехватившие те же прерывания. Если в такой ситуации восстановить вектор прерывания в значение, которое он имел до загрузки нашего резидента, программы, загруженные позже, не будут получать управление. Более того, они не будут получать управление только по тем прерываниям, которые у них совпали с прерываниями, перехваченными нашей программой, в то время как другие векторы прерываний будут все еще указывать на их обработчики, что почти наверняка приведет к ошибкам. Поэтому, если хоть один вектор прерывания не указывает на наш обработчик, выгружать резидентную программу нельзя. Это всегда было главным вопросом, и спецификации AMIS и IBM ISP (см. предыдущую главу) являются возможным решением этой проблемы. Если вектор прерывания не указывает на нас, имеет смысл проверить, не указывает ли он на ISP-блок (первые два байта должны быть EBh 10h, а байты 6 и 7 — «K» и «B»), и, если это так, взять в качестве вектора значение из этого блока и т.д. Кроме того, программы могут изменять порядок, в котором обработчики одного и того же прерывания вызывают друг друга. Последний шаг в выгрузке программы — освобождение памяти — можно выполнить вручную, вызывая функцию DOS 49h на каждый блок памяти, который программа выделяла через функцию 48h, на блок с окружением DOS, если он не освобождался при загрузке, и наконец, на саму программу. Однако есть способ заставить DOS сделать все это (а также закрыть открытые файлы и вернуть код возврата) автоматически, вызвав функцию 4Ch, объявив резидент текущим процессом. Посмотрим, как это делается на примере резидентной программы, занимающей много места в памяти. Кроме того, этот пример реализует все приемы, использующиеся для вызова функций DOS из обработчиков аппаратных прерываний, о которых рассказано в главе 5.8.3.
5.9.4. Полурезидентные программы Полурезидентные программы — это программы, которые загружают и выполняют другую программу, оставаясь при этом в памяти, а затем, после того как загруженная программа заканчивается, они тоже заканчиваются обычным образом. Полурезидентная программа может содержать обработчики прерываний, которые будут действовать все время, пока работает загруженная из-под нее обычная программа. Так что, с точки зрения этой дочерней программы, полурезидентная программа функционирует как обычная резидентная. Эти программы удобно использовать для внесения изменений и дополнений в существующие программы, если нельзя внести исправления прямо в их исполнимый код. Так создаются загрузчики для игр, которые хранят свой код в зашифрованном или упакованном виде. Такой загрузчик может отслеживать определенные комбинации клавиш и обманывать игру, добавляя игроку те или иные ресурсы, или, например, находить код проверки пароля и выключать его. В качестве примера напишем простой загрузчик для игры «Tie Fighter», который устранит ввод пароля, требующийся при каждом запуске игры. Разумеется, это условный пример, так как игра никак не шифрует свои файлы, и тот же эффект можно было достигнуть, изменив всего два байта в файле front.ovl. Единственное преимущество нашего загрузчика будет состоять в том, что он оказывается годен для всех версий игры (от «X-Wing» до «Tie Fighter: Defender of the Empire»).
5.9.5. Взаимодействие между процессами Из того, что DOS является однозадачной операционной системой, вовсе не следует, что в ней не могут существовать одновременно несколько процессов. Это только означает, что сама система не будет предоставлять никаких специальных возможностей для их одновременного выполнения, кроме возможности оставлять программы резидентными в памяти. Так, чтобы организовать общую память для нескольких процессов, надо загрузить пассивную резидентную программу, которая будет поддерживать функции выделения блока памяти (возвращающая идентификатор), определения адреса блока (по его идентификатору) и освобождения блока — приблизительно так же, как работают драйверы EMS или XMS. Чтобы реализовать многозадачность, придется запустить активную резидентную программу, которая перехватит прерывание IRQ0 и по каждому такту системного таймера будет по очереди отбирать управление от каждого из запущенных процессов и передавать следующему. Практически никто не реализует полноценную многозадачность в DOS, когда каждый процесс имеет собственную память и не может обращаться к памяти другого процесса, — для этого существует защищенный режим, но встречаются довольно простые реализации для облегченного варианта многозадачности — переключение нитей. Нить — это процесс, который использует тот же код и те же данные, что и остальные такие же процессы в системе, но отличается от них содержимым стека и регистров. Тогда резидентная программа-диспетчер по каждому прерыванию таймера будет сохранять регистры прерванной нити в ее структуру, считывать регистры следующей нити в очереди и возвращать управление, а структуры и стеки всех нитей будут храниться в какой-нибудь специально выделенной общедоступной области памяти. Указанная программа также должна поддерживать несколько вызовов при помощи какого-нибудь программного прерывания — создание нити, удаление нити и, например, передача управления следующей нити, пока текущая нить находится в состоянии ожидания. Эта простота оборачивается сложностью написания самих нитей, так как все они используют общий код, абсолютно все в коде нити должно быть повторно входимым. Кроме того, нити создают множество проблем, связанных с синхронизацией, приводящих к тому, что либо в коде всех нитей, либо в основном резиденте придется реализовывать семафоры, очереди, сигналы, барьеры и все остальные структуры, которые встречаются в реальных пакетах для работы с нитями. Попробуем сделать простой прототип такой многозадачности в DOS (всего с двумя нитями) и посмотрим, со сколькими проблемами придется столкнуться.
Действительно, используя механизм обработчиков прерываний, можно создать операционную систему для реального режима, аналогичную DOS, но очень быстро окажется, что для этого придется общаться напрямую с аппаратным обеспечением компьютера, то есть использовать порты ввода-вывода. Была использована следующая литература:
3
|
||||||||||||||||
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
||||||||||||||||
| 27.01.2014, 09:25 [ТС] | ||||||||||||||||
|
Флёнов Михаил Евгеньевич — российский программист, работал в журнале "Хакер" (рубрики "Hack-FAQ" и "Кодинг для программистов"), печатался в журналах "Игромания" и "Chip-Россия", автор книг по программированию и работе на компьютере:
Советы по оптимизации от Михаила Фленова ЗАКОН # 1 Оптимизировать можно все. Даже там, где вам кажется, что все и так работает быстро, можно сделать еще быстрее. Идеального кода не существует. Чтобы достичь максимального результата, нужно действовать последовательно и желательно в том порядке, который описан ниже. Помните, что любую задачу можно решить минимум двумя способами, ваша цель — выбрать наилучший метод, который обеспечит желаемую производительность и универсальность. ЗАКОН # 2 Первое, с чего нужно начинать, — поиск самых слабых и медленных мест. Зачем начинать оптимизацию с того, что и так работает достаточно быстро? Если вы будете оптимизировать сильные места, то можете нарваться на неожиданные конфликты. Да и эффект будет минимален. Когда-то меня посетила одна невероятная идея — написать собственную игру в стиле Doom. Четыре месяца невероятного труда, и нечто похожее на движок уже было готово. Был создан один голый уровень, по которому можно было перемещаться, и я с чувством гордости побежал по коридорам. Предстояло добавить монстров и атрибуты, да еще и наделить все это искусственным интеллектом. Но кому нужен движок, который в "голом виде" тормозит со страшной силой? Понятно что виртуальный мир нужно было оптимизировать. Целый месяц борьбы с кодом и вылизывания каждого оператора движка. Результат — всё стало прорисовываться на 10% быстрей, но "тормоза" не исчезли. Неожиданно выяснилось, что самое слабое место — вывод на экран. Движок просчитывал сцены достаточно быстро, а "пробоиной" был именно вывод изображения. Пара часов колдовства, и я выжал из видеокарты все возможное. Откомпилировав движок, я снова погрузился в виртуальный мир. Одно нажатие клавиши "вперед", и я очутился у противоположной стены. Никаких тормозов, сумасшедшая скорость просчета и моментальный вывод на экран. Как видите, ошибка была в неправильном определении слабого места движка. Потрачен месяц на оптимизацию математики, а в результате мизерные 10% прироста в производительности. Но когда было найдено реально слабое звено, то производительность была повышена в несколько раз. Начинайте оптимизацию со слабых мест. При ускорении работы самого слабого звена вашей программы, возможно, и не понадобится ускорять другие места. Вы можете потратить дни на оптимизацию сильных сторон и увеличить производительность только на 10% (что может оказаться недостаточным), или несколько часов на улучшение слабой части, и получить улучшение в 10 раз! Слабые места компьютера Некоторые программисты гонятся за мегагерцами процессора, но сидят на доисторической видеокарте от S3, жестком диске на 5400 оборотов и с 32 Мбайтами памяти. Посмотрите "потроха" своего компьютера и оцените его содержимое. Если вы увидели, что памяти у вас не более 64 Мбайт, то это — самое слабое звено, купите себе 128, а лучше 256, а еще лучше 512 Мбайт памяти и наслаждаетесь ускорением работы Delphi, Photoshop и других "тяжелых" программ.Наращивание сотни мегагерц у процессора даст более маленький прирост в скорости. Если вы используете тяжелые приложения при нехватке памяти, то процессор начинает тратить слишком много времени на загрузку и выгрузку данных. Если в вашем компьютере достаточно оперативной памяти, то процессор уже занимается только расчетами и не расходуется по лишним загрузкам-выгрузкам. То же самое с видеоадаптером. Если видеокарта "слабенькая", то процессор будет просчитывать сцены быстрей, чем они будут выводиться на экран. А это грозит простоями и минимальным приростом производительности. ЗАКОН # 3 Следующим шагом вы должны разобрать все операции по косточкам и выяснить, где происходят регулярно повторяющиеся операции. Начинать оптимизацию нужно именно с них.Допустим, у вас есть следующая программа:
Теперь посмотрите еще раз на наш код. Больше ничего не видно? Программа использует цикл: "Пока B<100, будет выполняться операция Х:=Х+М[B]". Это значит, что процессору придется выполнить 100 переходов с шага 5 на шаг 3. А это немало. Можно ли что-нибудь оптимизировать? Внутри цикла выполняется две строки: 3 и 4. А что, если мы внутри цикла размножим их 2 раза:
А что, если совсем отказаться от операций перехода?
Любую циклическую операцию можно оптимизировать. Допустим, у провайдера есть несколько телефонов доступа. Вы каждый день перезваниваете на каждый из них в надежде найти свободный. Хотя провайдер обязан оптимизировать свои пулы модемов в один, чтобы не надо было трезвонить по всем номерам сразу. Но не у каждого пользователя хорошая связь с любой телефонной станцией города. Поэтому провайдеры держат пулы на разных станциях, чтобы вы могли выбрать тот, с которым связь лучше. Поставьте программу-дозвонщик, которая сама будет перебирать номера телефонов. Другой пример — вам на 1 час досталась карточка нового провайдера. Заносить ее в программу дозвона не имеет смысла, потому что вы можете больше никогда не позвонить ему. Из-за этой одноразовой операции вам придется перенастраивать свой дозвонщик на нового провайдера и потом обратно, а выигрыш практически нулевой, потому что пока вы меняете настройки, уже можно было дозвониться стандартными средствами Windows. Вывод — правильно выбирайте средства для выполнения необходимых задач. ЗАКОН # 4 (Этот закон — расширение предыдущего.) Оптимизировать одноразовые операции — это только потеря времени. Сто раз подумай, прежде чем начать мучиться с редкими операциями. Программисту нужно разослать приглашения на свадьбу. Вместо того чтобы набрать их на печатной машинке, программист пишет специальную программу. Написание заняло один день, столько же — отладка программы. Главная ошибка — неправильная оптимизация своего труда. Легче набрать шаблон в любом текстовом редакторе и потом только менять фамилии приглашенных. Но даже если нет текстового редактора, писать программу действительно нет смысла. Затраты большие, а пользоваться — только один раз. Получается, что одноразовые операции оптимизировать просто бессмысленно. Затраты в этом случае себя не окупают, поэтому не стоит тратить свои нервы на этот бессмысленный труд. В данном случае крутым считается не тот, кто целый день промучился и ничего не добился, а тот, кто выполнил свою работу наиболее быстро и эффективно. ЗАКОН # 5 Нужно знать внутренности компьютера и принципы его работы. Чем лучше вы знаете, каким образом компьютер будет выполнять ваш код, тем лучше вы сможете его оптимизировать. Тут трудно привести полный набор готовых решений, но некоторые приемы я постараюсь описать.
ЗАКОН # 6 Для сложных расчетов можно заготовить таблицы с заранее рассчитанными результатами и потом использовать эти таблицы в реальном режиме времени. Когда появился первый Doom, игровой мир поразился качеству графики и скорости работы. Это действительно был шедевр программистской мысли, потому что компьютеры того времени не могли рассчитывать трехмерную графику в реальном времени. В те годы еще даже и не думали о ЗD-ускорителях, и видеокарты занимались только отображением информации и не выполняли никаких дополнительных расчетов. Как же тогда программистам игры Doom удалось создать трехмерный мир? Секрет прост — во время игры микропроцессор не просчитывает сцены, все сложные математические расчеты были сделаны заранее и занесены в базу данных, которая запускается при старте программы. Конечно же занести все возможные результаты невозможно, поэтому база хранила основные результаты. Когда нужно было получить расчет значения, которого не было в заранее рассчитанной таблице, то бралось наиболее приближенное число. Таким образом, Doom получил отличную производительность и достаточное качество ЗD-картинки. Оцените качество освещения и теней в сценах виртуального мира игры Quake. Совмещение высокого графического качества сцен и в то же время высокой скорости работы игры сделано за счет таблиц с заранее рассчитанными значениями. ЗАКОН # 7 Чаще всего оптимизация может привести к нестабильности исполняемого кода, потому что для увеличения производительности некоторые убирают ненужные на первый взгляд проверки. Запомните, что ненужных проверок не бывает! Если вы думаете, что какая-то нестандартная ситуация может и не возникнуть, то она не возникнет только у вас. У пользователя, который будет использовать вашу программу, может возникнуть все, что угодно. Он обязательно нажмет на то, на что не нужно, или введет неправильные данные. Обязательно делайте проверки всего того, что вводит пользователь. Делайте это сразу же и не ждите, когда введенные данные понадобятся. Лишних проверок не бывает. Не делайте проверки в цикле, а выносите за его пределы. Любые лишние операторы if внутри цикла очень сильно влияют на производительность, поэтому по возможности проверки нужно делать до или после цикла. Циклы — это слабое место любой программы, поэтому оптимизацию надо начинать именно с них и стараться не вставлять в них лишние проверки. Внутри циклических операций не должно выполняться ничего лишнего — ведь это будет повторено много раз!.. Итог Здесь были изложены только основы оптимизации. Оптимизация — это процесс творческий, и в каждой отдельной ситуации к нему можно подойти с разных сторон. Для более глубокого познания оптимизации вам нужно изучать принципы работы процессора и операционных систем.
2
|
||||||||||||||||
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
|||||||||||||||||||||||||||||||
| 23.07.2014, 17:16 [ТС] | |||||||||||||||||||||||||||||||
Перевод строки из шестнадцатеричных цифр в число типа DWORD с использованием MMX автор bitRAKE, взято здесь
Перевод числа типа DWORD в строку из двоичных цифр с удалением лидирующих нулей Автор Sloat, взято здесь
Перевод числа типа QWORD в строку из десятичных цифр с использованием MMX Автор The Svin, взято здесь
Ещё один вариант перевода числа типа QWORD в строку из десятичных цифр с использованием MMX Автор The Svin, взято здесь
Используются только строчные буквы (ABCDEF) Модуль написан в формате masm32.inc. При использовании описывайте прототип как htodwc proto :DWORD
2
|
|||||||||||||||||||||||||||||||
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
||||||||||||||||
| 27.07.2014, 06:28 [ТС] | ||||||||||||||||
|
Вставка подстроки с адресом lpPattern в строку с адресом lpSource в позицию указанную startpos оптимизированный вариант процедуры написанной hutch (Instring находится в библиотеке m32lib)Автор eko, взято здесь
Вставка подстроки String2 в строку String1 в позицию указанную index, с использованием MMX Автор The Svin, взято здесь
2
|
||||||||||||||||
|
Клюг
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|||||||||||
| 27.08.2014, 19:23 | |||||||||||
|
Ввод/вывод шестнадцатеричных чисел из/в DWORD ДОСъ/winconsole(x86)
some kludges inside. ![]() ДОСъ:
Кликните здесь для просмотра всего текста
3
|
|||||||||||
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
|
| 15.09.2014, 12:26 [ТС] | |
|
MASM MASM — Macro Assembler — "Ассемблер с поддержкой Макросов".MASM — продукт компании Microsoft для создания MS-DOS, а позднее и для Windows 9x/NT. После выхода версии 6.13 MASM на некоторое время затормозил в развитии, но потом здравый смысл взял вверх и последняя версия поддерживает unicode, все SSE/SSEII/SEEIII расширения (объявляемые двумя директивами .686/.XMM), а также архитектуру AMD x86-64. Платформа Intel IA64 не поддерживается, но Microsoft поставляет Intel-ассемблер IAS.EXE. При помощи макросов MASM покрывает своими возможностями широкий круг задач: повторения однотипных операций с параметризацией (шаблоны), циклические макросы, условное ассемблирование и так далее, по сравнению с которым препроцессор языка Си выглядит жалкой подделкой. Имеется примитивная поддержка основных парадигм ООП хотя ассемблер и ООП концептуально несовместимы. Многие пишут даже без макросов на чистом ассемблере, считая свой путь идеологически наиболее правильным. Сначала MASM распространялся в виде самостоятельного пакета, позже он был включен в состав DDK, которое вплоть до Windows 2000 DDK раздавалось бесплатно, а сейчас доступно подписчикам MSDN. Вполне полноценное DDK (с ассемблером) для Windows Server 2003 входит в Kernel-Mode Driver Framework, а сам транслятор MASM'а еще и в Visual Studio Express. MASM'у посвящено множество книг, что упрощает процесс обучения, а в сети можно найти кучу исходных текстов ассемблерных программ и библиотек, освобождающих программиста от необходимости изобретать всё самому заново. Также MASM является выходным языков для многих дизассемблеров (Sourcer, IDA Pro). Все это делает MASM транслятором номером один в программировании под Windows/Intel. Поддерживаются два выходных формата: 16/32 Microsoft OMF и (16)/32/64 COFF, что позволяет транслировать 16/32-разрядные программы под MS-DOS, работающие в реальном и защищенном режиме, 16-разрядные приложения и драйвера для Windows 3.x, 32-разрядные приложения и драйвера для Windows 9x/NT, а также 64-разрядные приложения и драйвера для Windows NT 64-bit Edition. Для создания бинарных файлов потребуется линкер, который умеет это делать (например, ulink от Юрия Харона). Кстати говоря, последние версии штатного Microsoft Linker'а, входящие в SDK и DDK, утратили способность собирать 16-разрядные файлы под MS-DOS/Windows 3.x и приходится возвращаться к старой версии, которая лежит в папке NTDDK\win_me\bin16. MASM генерирует отладочную информацию в формате CodeView, которую Microsoft Linker может преобразовывать в PDB-формат, хоть и не документированный, но поддерживаемый библиотекой dbghelp.dll, позволяющей сторонним разработчикам "переваривать" отладочную информацию, поэтому файлы, оттранслированные MASM'ом, можно отлаживать в Soft-Ice, дизассемблировать в IDA Pro и прочих продуктах подобного типа. Главный недостаток MASM'а — большое количество ошибок. Стоит открыть Knowledge Base, посмотреть на список официально подтвержденных ошибок. Особенно много ошибок в штатной библиотеке. Вот только несколько примеров: dwtoa и atodw_ex не понимают знака и по скорости очень тормозят, хотя в документации написано: "A high speed ascii decimal string to DWORD conversion for applications that require high speed streaming of conversion data"; ucFind не находит в строке подстроку, если длина подстроки равна 1 символу; функции BMHBinsearch и SBMBinSearch (поиск алгоритмом Бойера-Мура) реализованы с ошибками; некоторые функции обрушивают программу (если передать ustr2dw строку длиннее пяти байт - программа падает). Другой минус — отсутствие поддержки некоторых инструкций и режимов адресации процессора, например, невозможно сделать jmp far seg:offset, а попытка создания смешанного 16/32 разрядного кода — настоящий кошмар, который приходится разгребать руками и всячески извращаться, преодолевая сопротивление "менталитета" транслятора. MASM — типичный коммерческий продукт с закрытыми исходными текстами. Microsoft интенсивно продвигает высокоуровневое программирование, отказываясь от ассемблера везде, где это только возможно, поэтому не исключено, что через несколько лет MASM прекратит свое существование... Тем не менее, несмотря на все эти недостатки, MASM остается самым популярным профессиональным транслятором ассемблера при программировании под Windows NT. MASM (Macro Assembler) — стандарт де-факто при программировании под Windows 9x/NT Ссылки
MASM32 для Windows Проект создан в 1998 году Стивом Хатчессоном, который собрал последние версии транслятора MASM'а, линкер от Microsoft, включаемые файлы, библиотеки, обширную документацию, статьи разных авторов, посвященные ассемблеру, и даже простенькую IDE в один дистрибутив, известный под "пакетом хатча" (hutch), бесплатно раздаваемый всем желающим на вполне лицензионной основе, вполне удобный комплект инструментов для программирования под Windows на ассемблере.Ссылки
TASM TASM — Turbo Assembler — "Скоростной Ассемблер".Самый популярный транслятор ассемблера времен MS-DOS, созданный фирмой Borland, и полностью совместимый с MASM'ом вплоть до версий 6.x и поддерживающий свой собственный режим IDEAL с большим количеством улучшений и расширений. Удобство программирования, скромные системные требования и высокая скорость трансляции обеспечивали TASM'у лидерство на протяжении всего существования MS-DOS. Но с появлением Windows популярность TASM'а стала таять буквально на глазах. Не сумев (или не захотев) добиться совместимости с заголовочными файлами и библиотеками, входящими в комплект SDK/DDK, фирма Borland решила поставлять свой собственный порт. Штатный линкер tlink/tlink32 не поддерживает возможности создания драйверов, а формат выходных файлов (Microsoft OMF, IBM OMF, Phar Lap), не поддерживается текущими версиями линкера от Microsoft (впрочем, 16-битные версии это умеют). Формат отладочной информации несовместим с CodeView и реально поддерживается только TurboDebugger'ом и soft-ice. Последней версией транслятора стал TASM 5.0, поддерживающий команды вплоть до 80486 процессора. Отдельно был выпущен патч, обновляющий TASM до версии 5.3 и поднимающий его вплоть до Pentium MMX, однако команды Pentium II, например, как SYSENTER не работают. Поддержка уникода отсутствует. В настоящее время Borland прекратила распространение своего ассемблера. Существует пакет TASM 5+, включающий в себя транслятор, линкер, какое-то подобие документации, несколько заголовочных файлов под Windows и пару демонстрационных примеров. Существует TASM32 фирмы Squak Valley Software — совершенно независимый кроссассемблер, ориентированный на процессоры 6502,6800/6801/68HC11, 6805, TMS32010, TMS320C25, TMS7000, 8048, 8051,8080/8085, Z80, 8096/80C196KC. Для разработки прикладных приложений под Windows 16/32 и MS-DOS TASM подходит, особенно если вы уже имеете опыт работы с ним и некоторые собственные наработки (библиотеки, макросы), конвертировать TASM-программы под MASM — весьма проблематично. Ссылки
LzAsm LzAsm — Lazy Assembler — "Ассемблер для ленивых" — автор - Половников Степан — реинкарнация TASMа с поддержкой новых команд процессора. Lazy Assembler совместим с режимом IDEAL TASM и поддерживающим команды из наборов MMX, SSE, SSEII, SSEIII, 3DNow!Pro.Ссылки
FASM FASM (расшифровывается как Flat Assembler — Ассемблер Плоского Режима) — крайне необычный транслятор с экзотичными возможностями. FASM — ассемблер с предельно упрощенным синтаксисом (никаких offset'ов и прочих захламляющих листинг директив), полной поддержкой всех процессорных команд (в том числе и jmp 0007:00000000), качественным кодогенератором, мощным макропроцессором и гибкой системой управления за форматом выходных файлов.
3
|
|
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
|
| 15.09.2014, 12:31 [ТС] | |
|
FASM распространяется в исходных текстах на бесплатной основе и к настоящему моменту перенесен на MS-DOS, Windows 9x/NT, Linux, BSD, поддерживает уникод и все x86-процессоры вплоть до Pentium-4 с наборами мультимедийных инструкций MMX, SSE, SSEII, SSEIII, AMD 3DNow!, а так же платформу AMD x86-64, позволяя генерировать не только Microsoft coff, но и готовые bin, mz, pe и elf файлы. FASM позволяет обходиться без линкера, однако при этом раскладку секций в PE-файле и таблицу импорта приходится создавать "вручную" с помощью специальных директив ассемблера, что выглядит очень заманчиво, но на практике все же намного удобнее сгенерировать coff и скомпоновать его с модулями, написанными на языках высокого уровня.
Макроязык FASM'а мощный, позволяет писать программы на себе самом без единой ассемблерной строки. Ни на что не похожий синтаксис FASM'а напрягает, заставляя вгрызаться в плохо структурированную документацию и небольшое количество демонстрационных примеров, поставляемых вместе с транслятором. Категорическая несовместимость с MASM'ом чрезвычайно затрудняет разработку Windows-драйверов (в большинстве своем создаваемых на основе примеров из DDK). Прикладным задачам в свою очередь требуется SDK и желательно первой свежести. "Математические" задачи, перемножающие матрицы, вычисляющие координаты пересечения кривых в N-мерном пространстве или трансформирующие графику легко пишутся на FASM'е, поскольку не привязаны к конкретной операционной системе, никаких API-функций они не вызывают и вообще не лезут туда, где можно обойтись Си/Си++. Ссылки
NASM NASM — Netwide Assembler — "Расширенный Ассемблер" авторы: Peter Anvin, Simon Tatham, Julian Hall. Имеет MASM-подобный синтаксис, мощную макросистему (несовместимую с MASM'ом и ничего не знающую об union'ах и других полезных вещей), поддерживает всю линейку x86-процессоров вплоть до IA64 в x86-режиме, богатство выходных файлов (bin, aout, aoutb, coff, elf, as86, obj, win32, rdf, ieee), генерация отладочной информации в форматах Borland, STABS и DWARF2 вкупе с портами под MS-DOS, Windows, Linux и BSD. Количество ошибок в трансляторе довольно велико, причем в отличии от работающих продуктов (MASM/TASM) при "хитрых ошибках" NASM не падает, а генерирует ошибочный (по структуре) объектный файл. В последней версии NASM'а, в зависимости от значения ключа -On, код может сгенерироваться в двух или более экземплярах или может пропасть весь экспорт (pubdef'ы).Минусы NASM'а
Также необходимо принудительно указывать длину переходов short или near, иначе можно нарваться на ругательство "short jump out of range". Существует возможность настроить транслятор на генерацию near-переходов по умолчанию. NASM не помнит типы объявляемых переменных и не имеет нормальной поддержки структур. Из мелких недочетов можно называть невозможность автоматического генерации короткого варианта инструкции "push imm8" и отсутствие контроля за соответствием транслируемых инструкций типу указанного процессора (команда "cpuid" под ".486" ассемблируется вполне нормально, а ведь не должна). Непосредственная трансляция примеров из SDK/DDK под NASM'ом невозможна, так что разрабатывать на нем драйвера под Windows может только очень крутой поклонник или извращенец. NASM - один из лучших ассемблеров под Linux/BSD, а вот под Windows его позиции уже не так сильны (в основном из-за неполной совместимости с MASM'ом). NASM — ассемблер под Linux/BSD с Intel-синтаксисом. Ссылки
YASM YASM — "Yet another assembler", "Yes, it's an assembler", "Your favorite assembler" — усовершенствованный вариант NASM'а, авторы: Peter Johnson, Michael Urman. Когда развитие NASM'а затормозилось, его исходные тексты легли в основу нового транслятора YASM. Основные отличительные черты YASM'а от его предшественника: поддержка платформы AMD x86-64, большое количество исправленных ошибок, оптимизированный парсер, переваривающий синтаксис как NASM, так и GAS, более полная поддержка COFF (DJGPP) и Win32 obj выходных файлов, генерация отладочной информации в формате CodeView, интернационализация (выполненная через GNU-библиотеку gettext), и прочие мелкие улучшения, которых вполне достаточно, чтобы потеснить NASM особенно в мире UNIX-подобных систем, где GAS-синтаксис по-прежнему играет ведущую роль. Под Windows же YASM не имеет никаких ощутимых преимуществ перед MASM'ом за исключением того, что поддерживает возможность генерации двоичных файлов, особенно удобных для создания shell-кода, но бесполезных для разработчика драйверов. Ссылки
HLA HLA (High Level Assembly Language) — автор Randall Hyde, высокоуровневый ассемблер, на любителя. "Академический" проект очень высокоуровневого ассемблера.HLA - это гибрид, работающий как очень мощный препроцессор для нескольких ассемблеров. частью целевой аудитории HLA являются студенты, которые должны изучить ассемблер и сделать на нем что-нибудь полезное, используя то ограниченное время, которое есть у них в университете. HLA ассемблер, включающий в себя множество функций свойственных для высокоуровневых языков (таких как C, C++ и Java), которые позволяют быстро освоить основы ассемблера. HLA позволяет писать настоящий низкоуровневый код со всеми преимуществами языков программирования высокого уровня. ССылки
GoAsm Ассемблер для процессоров семейства x86, создан Jeremy Gordon для написания программ для операционных систем семейства Windows, способен создавать 32- и 64-битных версий, а также программы с поддержкой Unicode. GoAsm является проприетарным ПО и распространяется в бинарном формате.Цель разработки GoAsm создавался с целью создать компилятор с простым и ясным синтаксисом, производящий как можно более компактный код, скромными потребностями для обработки скриптов и возможностью добавления расширений. Особенности GoAsm
Несмотря на то что используется Intel-синтаксис, синтаксис GoAsm несовместим ни с одним из существующих компиляторов. GoAsm использует препроцессор сходный по синтаксису с препроцессором языка программирования C. В GoAsm необходимо использовать квадратные скобки для чтения и записи памяти. Поддерживаемые наборы инструкций GoAsm поддерживает все стандартные инструкции (за исключением использующихся только в 16-разрядных программах). Инструкции x87 для работы с числами с плавающей точкой. Инструкции и синтаксис для работы с MMX, SSE, SSE2, 3DNow!, 3DNow!, FPU, MMX, XMM, SSE, SSE2 и 3DNow! Другие инструменты разработанные Jeremy Gordon
Ссылки
2
|
|
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 15.09.2014, 12:32 [ТС] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
SOLAR Assembler Автор Bogdan Valentin Ontanu. SOLAR Assembler современный многопроходный макроассемблер, предназначен для компиляции 16/32/64-разрядных программы запускаемых под Windows, Linux, MacOSX и Solar_OSОсобенности
Ссылки Мануал по SOLAR Assembler http://www.oby.ro/sol_asm/docs/sol_asm_manual.htmСкачать SOLAR Assembler http://www.oby.ro/sol_asm/sol_asm_download_bin.htm Примеры программ на SOLAR Assembler http://www.oby.ro/sol_asm/sol_... amples.htm Ассемблеры под UNIX Единственный более-менее работающий транслятор под UNIX — GAS (GNU Assembler) завязан на компилятор GCC и имеет такой ужасный синтаксис, что писать на нем могут только мазохисты (примеров программ, запрограммированных на GAS'е практически нет). Прочие ассемблеры Существует также множество других видов ассемблера, число которых постоянно растет.Остальные ассемблеры (типа A86, AS86) не позволяют писать 16/32-разрядный код или раздаются практически без документации.
Сводные характеристики разных ассемблеров
3
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Клюг
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
||||||
| 15.01.2015, 01:09 | ||||||
|
Вывод результата вычислений из регистра ST(0) сопроцессора, ДОСъ
2
|
||||||
|
Клюг
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
||||||
| 14.05.2015, 18:12 | ||||||
|
setlocale для корректного вывода даты на русском через strftime:
1
|
||||||
|
270 / 18 / 0
Регистрация: 16.02.2016
Сообщений: 29
|
|
| 17.04.2016, 21:56 | |
|
Reverse Engineering:
Bell Simon. Building a Honeypot to Research Cyber-Attack Techniques. Bryant R. Adam. UNDERSTANDING HOW REVERSE ENGINEERS MAKE SENSE OF PROGRAMS FROM ASSEMBLY LANGUAGE REPRESENTATIONS. Cipresso Teodoro. Software reverse engineering education. Dyrkolbotn Geir Olav. Reverse Engineering Microprocessor Content Using Electromagnetic Radiation. Fonseca Jose Manuel Rios. Interactive Decompilation. Garzon Miguel. Reverse Engineering Object-Oriented Systems into Umple. An Incremental and Rule-Based Approach. Greevy Orla. Enriching Reverse Engineering with Feature Analysis. Hauke D. Jonathan. Design Verification Using Reverse Engineering. Holger Michael Kienle. Building Reverse Engineering Tools with Software Components. Kenny Wong. The Reverse Engineering Notebook. Lajos Jeno Fülop. Evaluating and Improving Reverse Engineering Tools. Lin Feifei (Amy). Analysing Reverse Engineering Techniques for Interactive Systems. Michael Kiperberg. Preventing Reverse Engineering of Native and Managed Programs. Morando Federico. SOFTWARE REVERSE ENGINEERING AND OPEN SOURCE SOFTWARE. Do we need more FUD to be satiated. Portillo Sergio Pastrana. Attacks Against Intrusion Detection Networks. Evasion, Reverse Engineering and Optimal Countermeasures. Prpic Martin. Reverse engineering of Java Card applets. Ramasubbu Surendranath. Reverse Software Engineering Large Object Oriented Software Systems using the UML Notation. Rosenblum Nathan E. THE PROVENANCE HIERARCHY OF COMPUTER PROGRAMS. Shi Nija. Reverse Engineering of Design Patterns from Java Source Code. UZELAC VLADIMIR. MICROBENCHMARKS AND MECHANISMS FOR REVERSE ENGINEERING OF MODERN BRANCH PREDICTOR UNITS. Vinju Jurgen Jordanus. Analysis and Transformation of Source Code by Parsing and Rewriting. Zhiqiang Lin. Reverse Engineering of Data Structures from Binary. Software Protection, Code Obfuscation, Malware Detection: Alam Shahid. A Framework for Metamorphic Malware Analysis and Real-Time Detection. Alexandre Nuno Vicente Dias. Detecting Computer Viruses using GPUs. Aniket Kulkarni. Software Protection through Code Obfuscation. Batchelder R. Michael. JAVA BYTECODE OBFUSCATION. Bertholon Benoit. Towards Integrity and Software Protection in Cloud Computing Platforms. Birhanu Mekuria Eshete. Effective Analysis, Characterization, and Detection of Malicious Activities on the Web. Blaine Alan Nelson. Designing, Implementing, and Analyzing a System for Virus Detection. Bose Abhijit. Propagation, Detection and Containment of Mobile Malware. Brian M. Bowen. Design and Analysis of Decoy Systems for Computer Security. CAPPAERT Jan. Code Obfuscation Techniques for Software Protection. DAVIDSON RODRIGO BOCCARDO. Context-Sensitive Analysis of x86 Obfuscated Executables. Drape Stephen. INTELLECTUAL PROPERTY PROTECTION USING OBFUSCATION. Drape Stephen. Obfuscation of Abstract Data-Types. Farley, Ryan Joseph. Toward Automated Forensic Analysis of Obfuscated Malware. Flexeder Andrea. Interprocedural Analysis of Low-Level Code. Gupta, Divya. Program Obfuscation. Applications and Optimizations. HILLERT EMILIA.Obfuscate Java bytecode. An evaluation of obfuscating transformations using JBCO. Javaid Salman. Analysis and Detection of Heap-based Malwares Using Introspection in a Virtualized Environment. Khaled ElWazeer. DEEP ANALYSIS OF BINARY CODE TO RECOVER PROGRAM STRUCTURE. Khalid Mohamed Abdelrahman Y Alzarooni. Malware Variant Detection. Kinder Johannes. Static Analysis of x86 Executables. Statische Analyse von Programmen in x86 Maschinensprache. Konstantinou Evgenios. Metamorphic Virus. Analysis and Detection. Lixi Chen. Code Obfuscation Techniques for Software Protection. Large-Scale Malware Analysis, Detection, and Signature Generation. Lengyel Tamas Kristof. Malware Collection and Analysis via Hardware Virtualization. Mayank Varia. Studies in Program Obfuscation. Mohan R. Vishwath. SOURCE-FREE BINARY MUTATION FOR OFFENSE AND DEFENSE. Molnar David Alexander. Dynamic Test Generation for Large Binary Programs. Paleari Roberto. Dealing with next-generation malware. Paul R. Nathanael. Disk-Level Behavioral Malware Detection. Povalova Radoslava. Framework for Easy Malware Analysis. Preda Mila Dalla. Code Obfuscation and Malware Detection by Abstract Interpretation. Remi Andre B. Valvik. Security API for Java ME. Secure X data. Richardson Christopher. Virus detection with machine learning. RIERA FRANCISCO BLAS IZQUIERDO. LO! LLVM Obfuscator An LLVM obfuscator for binary patch generation. Rompf Tiark. Lightweight Modular Staging and Embedded Compilers. Abstraction without Regret for High-Level High-Performance Programming. Roundy A. Kevin. HYBRID ANALYSIS AND CONTROL OF MALICIOUS CODE. Sabu Emmanuel. Software Obfuscation Presentation. Shakya Sundar Das. Code Obfuscation using Code Splitting with Self-modifying Code. Sharath K. Udupa, Saumya K. Debray and Matias Madou. Deobfuscation Reverse Engineering Obfuscated Code. Sharif I. Monirul. ROBUST AND EFFICIENT MALWARE ANALYSIS AND HOST-BASED MONITORING. SOLODKYY YURIY. SIMPLIFYING THE ANALYSIS OF C++ PROGRAMS. Solofoarisina Arisoa Randrianasolo. Artficial Intelligence in Computer Security. Detection, Temporary Repair and Defense. SUN FANGQI. Program Analyses of Web Applications for Detecting Application-Specific Vulnerabilities. Tian Ronghua. An Integrated Malware Detection and Classification System. Venkatachalam Sujandharan. DETECTING UNDETECTABLE COMPUTER VIRUSES. Victor van der Veen. Dynamic Analysis of Android Malware. Wang Chenxi. A Security Architecture for Survivability Mechanisms. Wroblewski Gregory. General Method of Program Code Obfuscation (draft).
3
|
|
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
||||||||||||||||||||||||||||
| 25.04.2016, 05:40 [ТС] | ||||||||||||||||||||||||||||
|
ЗАПУСК DOS-ПРОГРАММ ПОД WINDOWS X64 В любой организации может оказаться так, что при обновлении старых компьютеров на новые можно столкнуться с таким фактом, что компьютеры новые, но необходимость использования старых программ никуда не отпала. А одной из старых программ вполне может оказаться какое-нибудь приложение, написанное в 90-ые годы под MS-DOS, которое напрочь отказывается запускаться на современных операционных системах.взято здесь В таком случае очень помогает эмулятор MS-DOS под названием DOSBox. Скачиваем последнюю версию с официального сайта, после устанавливаем. Никаких необычных действий при установке программы не требуется. Теперь ищем необходимую вам DOS программу. Допустим она располагается на диске D в папке Prog и называется Prog.exe. Переходим в эту папку, и создаем там текстовый файл с любым названием и расширением conf. В него пишем:
Сохраняем, и пробуем запустить. Если все прошло успешно, то появится окошко DOSBox, в котором запустится нужная программа. Для начала скачиваем с официального сайта официальную локализацию – после чего распаковываем содержимое архива в каталог с программой. Теперь открываем созданный выше conf файл, и дописываем туда в самый верх следующее:
3
|
||||||||||||||||||||||||||||
| 25.04.2016, 05:40 | |
|
Помогаю со студенческими работами здесь
60
Видеоуроки по Ассемблеру MASM/TASM (для DOS) на русском языке MASM, TASM, FASM: что выбрать для программирования в ядре Есть ли компиляторы Tasm или Masm для 64-разрядных систем Подскажите ссылки на FAQ для разделов Assembler, MASM, TASM Assembler Переделать из TASM в masm Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1
У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\
А в самом низу файла-профиля. . .
|