Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Турбо Ассемблер / Использование Турбо Ассемблера /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Расширенные инструкции - Программирование от RIN.RU
Расширенные инструкции



Дополнительные инструкции цикла процессора 80386


В инструкциях цикла процессора 80386 в качестве регистра-счетчика может использоваться регистр CX или ECX. Стандартные мнемоники инструкций LOOP, LOOPE, LOOPZ, LOOPNE и LOOPNZ фирмы Intel выбирают регистр-счетчик на основе того, является ли текущий сегмент кода 32-битовым сегментом (тогда используется ECX) или 16-битовым (используется регистр CX).


Турбо Ассемблер имеет специальные инструкции, которые увеличивают гибкость средства LOOP. Инструкции LOOP, LOOPE, LOOPWZ, LOOPWNE и LOOPWNZ используют в качестве счетчика регистр CX, независимо от текущего сегмента. Аналогично, инструкции LOOPD, LOOPDE, LOOPDZ, LOOPDNE и LOOPDNZ используют в качестве счетчика регистр ECX.


Дополнительные инструкции ENTER и LEAVE


Инструкции ENTER и LEAVE используются для удаления из стека кадра процедуры. В зависимости от того, является текущий сегмент кода 16-битовым или 32-битовым, стандартные инструкции ENTER и LEAVE будут модифицировать либо регистры BP и SP, либо EBP и ESP. Если сегмент кода - это 32-битовый сегмент, а сегмент стека - 16-битовый, то данные инструкции могут оказаться неподходящими.


В Турбо Ассемблере предусмотрены 4 дополнительные инструкции, которые всегда выбирают конкретный размер стека, независимо от размера сегмента кода. Инструкции ENTERW и LEAVEW всегда выбирают в качестве регистров кадра стека BP и SP, a ENTERD и LEAVED - регистры EBP и ESP.


Дополнительные инструкции возврата


Стандартная инструкция RET генерирует код, который соответствующим образом завершает текущую процедуру. Это включает в себя генерацию кода завершения процедуры, которая использует интерфейсные соглашения языка высокого уровня. Даже если для процедуры используются соглашения NOLANGUAGE, инструкция RET в зависимости от описания процедуры (описана она как NEAR или FAR) будет генерировать различный код. Для процедуры NEAR Турбо Ассемблер генерирует дальнюю инструкцию возврата. Для процедуры FAR Турбо Ассемблер генерирует ближнюю инструкцию возврата. (Вне процедуры всегда генерируется ближний возврат.)


Турбо Ассемблер включает в себя дополнительные инструкции, которые позволяют задавать генерацию нужных инструкций возврата (без кода завершения). Они перечислены в следующей таблице:


Инструкции возврата
ИнструкцияФункция
RETNВсегда генерирует ближний возврат.
RETNFВсегда генерирует дальний возврат.
RETCODE Генерирует возврат, тип которого соответствует текущей выбранной модели. Для модели TINY, SMALL, COMPACT и TPASCAL генерируется ближний возврат. Для модели MEDIUM, LARGE, HUGE и TCHUGE - дальний возврат.



Расширенные инструкции PUSH и POP


Турбо Ассемблер поддерживает несколько расширений инструкций PUSH и POP. Эти расширения существенно уменьшают объем ввода, необходимого для задания расширенной последовательности инструкций PUSH и POP.


Инструкции PUSH и POP с несколькими операндами


На одной строке вы можете задать несколько инструкций PUSH и POP. Например:


PUSH ax
PUSH bx
PUSH cx
POP cx
POP bx
POP ax


можно записать как:


PUSH ax bx cx
POP cx bx ax


Чтобы Турбо Ассемблер распознавал наличие нескольких операндов в этих инструкциях, нужно чтобы любой операнд не мог рассматриваться как часть соседнего операнда, например инструкция:


PUSH foo [bx]


может привести к непредвиденному результату, поскольку foo,[bx] и foo[bx] являются допустимыми выражениями. Чтобы эта инструкция стала определенней, можно использовать круглые или квадратные скобки, например:


PUSH [foo] [bx]


Использование в инструкциях PUSH и POP указателей


Стандартные инструкции PUSH и POP не могут сохранять в стеке дальние указатели, которые требуют 4 байт в процессорах 8086, 80186 и 80286 и 6 байт в процессоре 80386.


Турбо Ассемблер допускает указание в инструкциях PUSH и POP операнда-указателя размером DWORD для процессора 8086, 80186 и 80286 и QWORD для процессора 80386. Когда обнаруживаются такие инструкции, Турбо Ассемблер генерирует инструкции PUSH и POP для двух частей операнда.


Занесение в стек константа (процессор 8086)


Хотя процессоры 80186б 80286 и 80386 среди основного набора инструкций содержат инструкцию PUSH, которая заносит в стек непосредственное значение, в процессоре 8086 такой инструкции нет.


Однако Турбо Ассемблер позволяет использовать в инструкции PUSH константы и в процессоре 8086. При этом генерируется последовательность инструкций, имеющая тот же результат, что и инструкция PUSH c операндом-константой для процессора 80186 и выше.


Примечание: Это средство вы можете использовать только при разрешении генерации эффективного кода.


Последовательность инструкций, которую Турбо Ассемблер используется для выполнения операции PUSH с константой, имеет длину около 10 байт. Они короче и выполняются быстрее, чем выполнение той же функции, но их выполнение связано с потерей содержимого регистра, например:


MOV ax, constant
PUSH ax


Данная последовательность имеет длину только 6 байт, но в процессе этого теряется содержимое регистра AX.


<<<  НазадВперед  >>>
 1  2  3  4  5  6 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Начало работы на Турбо Ассемблере

Использование директив и параметров

Общие принципы программирования

Объектно-ориентированное программирование

Использование выражений и значений идентификаторов

Директивы выбора процессора

Использование моделей памяти программы и сегментации

Определение типов данных

Задание и использование счетчика адреса

Описание процедур

Управление областью действия идентификаторов

Определение данных

Использование макрокоманд

Использование условных директив

Интерфейс с компоновщиком

Генерация листинга

Интерфейс Турбо Ассемблера и Borland C++

Интерфейс Турбо Ассемблера с Турбо Паскалем

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь