Почему такие скоропалительные суждения?
Если не понятно, то это совсем не значит что вопрос глупый.
Вот собственно чего мне надо было:
Оператор 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
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