ИСПОЛЬЗОВАНИЕ TURBO PASCAL С ЯЗЫКОМ АССЕМБЛЕРА.
ВСТРОЕННЫЙ АССЕМБЛЕР.
Встроенный Ассемблер Turbo Pascal позволяет Вам писать ассемблерный код для 8086/8087 и 80286/80287 прямо в Ваших программах на Паскале. Конечно, Вы еще можете преобразовывать ассемблерные инструкции в машинный код вручную для использования в операторах inline или подредактироватьь .OBJ файлы, которые содержат external процедуры и функции, когда Вы хотите смешивать Паскаль и Ассемблер.
Встроенный Ассемблер реализует большое подмножество синтаксиса, поддерживаемого Turbo Assembler и макроассемблером icrosoft. Встроенный Ассемблер поддерживает все коды операций 8086 /8087 и 80286/80287 и почти все операторы выражений Turbo Assembler.
За исключением DB, DW, DD (определить байт, слово и двойное слово) ни одна из директив Turbo Assembler, таких как EQU, PROC, STRUC, SEGMENT и MACRO не поддерживается встроенным Ассемблером. Однако операции, поддерживаемые директивами Turbo Assembler, во многом соответствуют соответствующим конструкциям Turbo Pascal. Например большинство директив EQU соответствует объявлениям const, var и type в Turbo Pascal, директива PROC соответствует объявлениям procedure и function, а директива STRUC соответсвует типам record в Turbo Pascal. В действительности можно думать о встроенном Ассемблере Turbo Pascal, как о компиляторе с языка Ассемблер, который использует синтаксис Паскаля для всех объявлений.
Оператор asm.
К встроенному Ассемблеру обращаются через оператор asm. Синтаксис оператора asm:
asm AsmStatement < Separator AsmStatement > end
где AsmStatement - это ассемблерный оператор, а Separator - это ";", новая строка или комментарий Паскаля. Несколько примеров оператора asm:
if EnableInts then
asm
sti
end
else
asm
cli
end;
asm
mov ax,Left; xchg ax,Right; mov Left,ax;
end;
asm
mov ah,0
int 16H
mov CharCode,al
mov ScanCode,ah
end;
asm
push ds
lds si,Source
les di,Dest
mov cx,Count
cld
rep movsb
pop ds
end;
Заметим, что на одной строке можно поместить несколько операторов Ассемблера, разделенных ";". Заметим так же, что ";" не требуется между двумя ассемблерными операторами, если они на разных строках. Наконец заметим, что ";" не указывает, что оставшаяся часть строки - комментарий, т.к. комментарий должен быть написан в стиле Паскаля, используя {} и (* *).
Использование регистров.
Правила использования регистров в операторе asm в общем такие же, как и в external процедурах и функциях. Оператор asm должен сохранять регистры BP, SP, SS и DS и может свободно изменять регистры AX, BX, CX, DX, SI, DI, ES и Flags. На входе оператора asm
BP указывает на текущий стек, SP указывает на вершину стека, SS
содержит сегментный адрес сегмента стека, а DS содержит сегментный адрес сегмента данных. За исключением BP, SP, SS и DS, оператор asm
не должен делать предположений о содержимом остальных регистров при входе в оператор.
Синтаксис ассемблерных операторов.
Синтаксис ассемблерного оператора:
[ Label ":" ] < Prefix > [ Opcode [ Operand < "," Operand > ] ]
где Label - идентификатор метки, Prefix - код префикса, Opcode
- директива или инструкция Ассемблера и Opеrand - ассемблерное выражение.
Комментарии разрешены между ассемблерными операторами, но не внутри их. Например, это разрешено:
asm
mov ax,1 {Initial value}
mov cx,100 {Count}
end;
а это нет:
asm
mov {Initial value} ax,1
mov cx,{Count} 100
end;
Метки.
Метки определяются в Ассемблере так же, как в Паскале, записывая идентификатор метки с двоеточием до оператора; как и в
Паскале, метки, определенные в Ассемблере, должны объявляться в декларативной части label в блоке, содержащем оператор asm. Однако существует одно исключение из этого правила: локальные метки.
Локальные метки - это метки, которые начинаются с @. Поскольку
@ не может быть частью идентификатора Паскаля, использование таких локальных меток допускается только внутри оператора asm, который определяет их (т.е. сфера действия локальной метки расширяется от ключевого слова asm до ключевого слова end для этого оператора
asm).
Примечание: В отличие от обычных меток, локальные метки не объявляются в разделе объявления label до их использования.
Идентификатор локальной метки состоит из символа @ с последующей одной или более буквой A..Z, цифр 0..9, "_" или @. Как для всех меток, после идентификатора идет ":".
Следующий фрагмент программы демонстрирует использование локальных и глобальных меток в операторе asm:
label Start, Stop;
...
begin
asm
Start:
...
jz Stop
@1:
...
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.