Использование turbo pascal с языком ассемблера. Встроенный ассемблер

Страницы работы

Содержание работы

ИСПОЛЬЗОВАНИЕ 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:

...

Похожие материалы

Информация о работе