56 lines
6.3 KiB
Markdown
56 lines
6.3 KiB
Markdown
|
||
# Описание функций FASM.DLL
|
||
|
||
### fasm_GetVersion()
|
||
Возвращает двойное слово(dword) содержащее основную чать версии в младших 16 битах, и подверсию в сташих 16 битах.
|
||
|
||
### fasm_Assemble(lpSource,lpMemory,cbMemorySize,nPassesLimit,hDisplayPipe)
|
||
Ассемблирует переданный исходный код, используя переданный блок памяти как рабочее пространство(вывод также будет находиться в нём).
|
||
|
||
lpSource должен содержать указатель на оканчивающийся нулём(zero-ended?ansi string) исходный код(pansichar).
|
||
|
||
lpMemory должен содержать указатель на блок памяти,а cbMemorySize должен содержать его размер. Вначале этого блока будет создана структура FASM_STATE(TFASM_STATE в Delphi). Ассемблер не выделяет память вне этого блока, еси её недостаточно функция вернёт FASM_OUT_OF_MEMORY.
|
||
|
||
nPassesLimit должен быть в диапозоне от 1 до 65536. Он задёт максимальное количество проходов, которые ассемблер может выполнить во время генерации кода (рекомендованая величина 100). Если лимит достигнут, вуткция вернёт FASM_CANNOT_GENERATE_CODE.
|
||
|
||
hDisplayPipe должен содержать handle pipe'а, в котрорый будет записан вывод на экран. Если это праметр равен 0, весь вывод будет отброшен.
|
||
|
||
Если ассемблирование пройдёт удачно, функция вернёт FASM_OK и заполнит output_data и output_length в структуре FASM_STATE (которая находится в начале выделнного блока памяти).
|
||
|
||
Если ассемблирование неудалось, функция вернёт один из других основных кодов ошибок(см. "General errors and conditions" в Fasm4Delphi.pas). Если код ошибки - FASM_ERROR, это значит что ошибка произошла в определённом месте кода, тогда поля error_code and error_line FASM_STATE'а будут заполнены, первое из них будет содержать детальный код ошибки(см. "Error codes for FASM_ERROR condition" в Fasm4Delphi.pas),а вторая - указатель(pointer) на структуру содержащую информацию о строке в котрой произошла ошибка(см. "TLINE_HEADER" в Fasm4Delphi.pas).
|
||
|
||
### fasm_AssembleFile(lpSourceFile,lpMemory,cbMemorySize,nPassesLimit,hDisplayPipe)
|
||
Эта функция работает идентично fasm_Assemble, но в отличии от неё принимает параметр lpSourceFile вместо lpSource. Этот параметр должен содержать указатель(pointer) на оканчивающийся нулём(zero-ended?ansi string) путь до файла содержащего исходный код для ассемблироания(pansichar).
|
||
|
||
********************************************
|
||
# Описание структур используемых FASM.DLL
|
||
Следующая структура находится в начале блока памяти передаваемого в fasm_Assemble. Поле condition содержит тоже значение которое возвращается функцией.
|
||
|
||
Когда функция возвращает FASM_OK, поля output_length и output_data заполнены указателем(pointer) на результат ассемблирования(он находится внутри блока памяти) и длинной этого блока памяти соответственно.
|
||
|
||
Когда функция возвращает FASM_ERROR - error_code содержит детальный код ошибки(см. "Error codes for FASM_ERROR condition" в Fasm4Delphi.pas), а error_line - указатель(pointer) на структуру LINE_HEADER, передающую информацию о строке в которой произошла ошибка.
|
||
|
||
TFASM_STATE=record
|
||
condition:Int32;
|
||
case byte of
|
||
0:(error_code:Int32;
|
||
error_line:PLINE_HEADER;);
|
||
1:(output_length:cardinal;
|
||
output_data:pointer;);
|
||
end;
|
||
|
||
Следующая структура имеет два варианта - она либо определяет линию, котрая была загружена непосредственно из исходного кода, либо линию,которая была сгенерирована макроинструкцией. В первом случае старший бит line_number'а установлен в 0, в товремя как во втором этот бит установлен в 1.
|
||
|
||
В превом случае, поле file_path содержит указатель(pointer) на путь до файла с исходным кодом(пустая строка означает, что это исходный код переданный в fasm_Assemble), line_number - номер линии в этом файле(считая с 1), а поле file_offset содержит смешение в файле, на котопом начинается линия.
|
||
|
||
Во вторм случае поле macro_calling_line содержит указатель(pointer) на структуру TLINE_HEADER для линии, которую вызывает макроинструкция, а поле macro_line содержит указатель(pointer) на структуру TLINE_HEADER для линии, в которой находится макро инструкция, указывающая на текущую.
|
||
|
||
TLINE_HEADER=record
|
||
file_path:PAnsiChar;
|
||
line_number:cardinal;
|
||
case byte of
|
||
0:(file_offset:cardinal);
|
||
1:(macro_calling_line:^TLINE_HEADER;
|
||
macro_line:^TLINE_HEADER;);
|
||
end;
|