[flood]Tad, это сегодня самое разумное тобой сказано[/flood]
Этот топик читают: Гость
Ответов: 67
Рейтинг: 5
|
|||
карма: 1 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Tad
а кто-то где-то выступал против вирусописателей. Вирусы писать на HiAsm`е - это круто! Нет, это для других задач. А ещё наверное можно, только что мысль пришла, вставлять куски кода сделанных на других языках. Если конечно, компилятор генерит исполняемый бинарник, и дополнительных языковых пакетов не нужно. P.S. Кое чего уже получается, спасибо за помощь. По ходу дела возник ещё один вопрос: Как инициализировать код элемента до обращения к нему? Т.е. чтобы этот код выполнил какие то действия (например резервирование памяти для своих нужд, или получить реальные адреса) перед выполнением основной функции. function INIT function Основная Пока видится только два способа. 1. Выполнить дейсвия INIT при первом обращении к основной функции, а в последующих вызовах только исполнение основной функции. 2. По событию, при создании формы окна. Есть ещё какие нибудь варианты? Понятно излагаю, или нет? Ну что то похожее функции Init в DLL, сначала при загрузке передаётся управление на эту функцию, а потом уже выполняются штатные функции, по мере их вызовов. |
|||
карма: 6 |
|
Ответов: 3349
Рейтинг: 233
|
|||
карма: 1 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Ivann
То, что доктор прописал. А можно ссылку, чтобы скачать. Я ещё плохо ориентируюсь на сайте. Я так понял в Help`е этого нет. Роз семь его перечитывал. Где это находиться, может ещё чего хорошего найду. Спасибо. ------------ Дoбавленo в 17.46: Виноват, исправлюсь. Всё нашёл. |
|||
карма: 6 |
|
Ответов: 3889
Рейтинг: 362
|
|||
flint2 писал(а): Где это находиться, может ещё чего хорошего найду.[burl=http://www.hiasm.com/wiki.html]ТУТ[/burl] |
|||
карма: 1 |
|
Ответов: 67
Рейтинг: 5
|
|||
flint2, [flood]
flint2 писал(а): Виноват, исправлюсь.
Всё нашёл. |
|||
карма: 1 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 3 раз(а), последний 2025-01-11 00:09:41 |
|||
карма: 0 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 3 раз(а), последний 2025-01-11 00:09:41 |
|||
карма: 0 |
|
Ответов: 8930
Рейтинг: 823
|
|||
flint2, я просто указал, где Вы можете найти пример вставки Asm в кодах элементов, коды можно посмотреть/изменить по Ctrl+F при выделенном элементе на поле HiAcm или в Блокноте не забыв сохранить где-либо копию на всякий случай
|
|||
карма: 19 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 3 раз(а), последний 2025-01-11 00:09:42 |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
host-79-164-65-58.qwerty. писал(а): Где посмотреть инструкции asm для Delphi или PascalЕсли лень, сходи по ссылкам: http://www.delphisources.ru/pages/faq/base/assembler_in_delphi.html http://www.delphisources.ru/pages/faq/base/delphi_asm.html http://www.delphisources.ru/pages/faq/base/delphi_and_asm.html |
|||
карма: 25 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 3 раз(а), последний 2025-01-11 00:09:42 |
|||
карма: 0 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 3 раз(а), последний 2025-01-11 00:09:42 |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
host-79-164-65-58.qwerty. писал(а): Посмотрел по ссылкам приведённым выше и ничего не нашел, что соответствует контексту постов.call [на этот самый бинарный код] есть. host-79-164-65-58.qwerty. писал(а): Тут приведены примеры из букваря asm.host-79-164-65-58.qwerty. писал(а): Теперь ясно, что можно писать, а какие инструкции нет. |
|||
карма: 25 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Tad
Почему такие скоропалительные суждения? Если не понятно, то это совсем не значит что вопрос глупый. Вот собственно чего мне надо было: Оператор inline состоит из зарезервированного слова Inline, за которым следует одна или более встроенных записей (записей машинного кода), разделенных косой чертой и заключенных в круглые скобки: inline(10/$2345/Count+1/Data-Offset); Но так не удобно. Поэтому можно сделать так: Из исходного файла на языке ассемблера можно с помощью ассемблера получить объектный файл (с расширением .OBJ). Используя компоновщик, несколько объектных файлов можно скомпоновать с программой или модулем. При этом используется директива компилятора $L. В программе или модуле на языке Паскаль процедуры или функции, написанные на языке ассемблера, должны быть описаны как внешние. Например: Используя ключевое слово PASCAL и директиву .MODEL, можно обеспечить соблюдение соглашений о вызовах с Borland Pascal, определить имена сегментов, выполнить инструкции PUSH BP и MOV PB,SP, а также обеспечить возврат управления с помощью операторов POP BP и RET N (где N - это число байт параметра). Директива .MODEL имеет следующий синтаксис: .MODEL xxxx, PASCAL где xxxx - это модель памяти (обычно LARGE). Задание в директиве .MODEL языка PASCAL сообщает, что параметры были занесены в стек слева-направо - в том порядке, в котором они обнаружены в исходном операторе, вызывающем процедуру. Директива PROC позволяет вам задать параметры в том же порядке, как они определены в программе Borland Pascal. Если вы определяете функцию, которая возвращает строку, обратите внимание на то, что директива PROC имеет опцию RETURNS, позволяющую вам получить доступ к временному указателю строки в стеке и не оказывающую влияния на число байт параметра, добавляемых в операторе RET. Приведем примеры кода, в которых используются директивы .MODEL и PROC: .MODEL LARGE, PASCAL .CODE MyProc PROC FAR 1:BYTE, j : BYTE RETURNS result : DWORD PUBLIC MyProc les di,result ; получить адрес временной строки mov al,i ; получить первый параметр i mov bl,j ; получить второй параметр j . . . ret Определение функции в Borland Pascal будет выглядеть следующим образом: function MyProc(i,j : char) : string; external; Пример программы: unit Strings; interface function UpperCase(S: string): string; function StringOf(Ch: char; Count: byte): string; inplementation {$L STRS} function UpperCase; external; function StringOf; external; end. CODE SEGMENT BYTE PUBLIC ASSUME CS:CODE PUBLIC UpperCase, StringOf ; объявить имена function Uppercase(S: String): String UpperRes EQU DWORD PTR [BP+10] UpperStr EQU DWORD PTR [BP+6] Uppercase PROC FAR PUSH BP ; сохранить регистр BP MOV BP,SP ; установить стек PUSH DS ; сохранить регистр DS LDS SI,UpperStr ; загрузить адрес строки LES DI,UpperRes ; загрузить адрес результата CLD ; переместить строку LODSB ; загрузить длину строки STOSB ; скопировать результат MOV CL,AL ; поместить длину строки в СХ XOR CH,CH JCXZ U3 ; пропустить в случае пустой ; строки U1: LODSB ; пропустить, если символ отличен ; от 'а'...'z' CPM AL,'a' JB U2 CPM AL,'z' JA U2 ; переместить строку SUB AL,'a'-'A' ; преобразовать в прописные буквы U2: STOBS ; сохранить результат LOOP U1 ; цикл по всем символам U3: POP DS ; восстановить регистр DS POP BP ; восстановить регистр ВР RET 4 ; удалить параметры и возвратить ; управление UpperCase ENDP ; function StringOf(Ch: Char; Count: Byte): String StrOfRes EQU DWORD PTR [BP + 10] StrOfChar EQU BYTE PTR [BP + 8] StrOfCOunt EQU BYTE PTR [BP + 6] StringOf PROC FAR PUSH BP ; сохранить регистр ВР MOV BP,SP ; установить границы стека LES DI,StrOfRes ; загрузить адрес результата MOV AL,StrOfCount ; загрузить счетчик CLD ; продвинуться на строку STOSB ; сохранить длину MOV CL,AL ; поместить значение счетчика в CX XOR CH,CH MOV AL,StrOfChar ; загрузить символ REP STOSB ; сохранить строку символов POP ; восстановить ВР RET ; извлечь параметры и выйти SrtingOf ENDP CODE ENDS END |
|||
карма: 6 |
|