Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Турбо Ассемблер / Использование Турбо Ассемблера /
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
Расширенные инструкции



Расширенные инструкции сдвига


При использовании процессор 8086 инструкции сдвига RCL, RCR, ROL, ROR, SHL, SHR, SAL и SAR не могут воспринимать константу циклического сдвига, отличную от 1. При работе на процессорах 80186, 80286 и 80386 можно использовать константу циклического сдвига со значением до 255.


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


.8086
SHL ax,4


генерируют последовательность:


SHL ax,1
SHL ax,1
SHL ax,1
SHL ax,1


Принудительное переопределение сегментов: инструкции SEGxx


В Турбо Ассемблере предусмотрены 6 инструкций, которые приводят к генерации переопределений сегмента. Эти инструкции перечислены в следующей таблице:




Инструкции переопределения сегмента
ИнструкцияЗначение
SEGCS Генерирует префиксный байт переопределения CS.
SEGSSГенерирует префиксный байт переопределения SS.
SEGDSГенерирует префиксный байт переопределения DS.
SEGESГенерирует префиксный байт переопределения ES.
SEGFSГенерирует префиксный байт переопределения FS.
SEGGS Генерирует префиксный байт переопределения GS.



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


SEGCS XLATB


Заметим, что в большинстве инструкций имеется альтернативная форма, при которой, чтобы указать на необходимость переопределения, вы можете задать пустой аргумент:


XLAT BYTE cs:[bx]


Приведенные два примера генерируют один и тот же код.


Дополнительные инструкции работы с флагами


Часто, чтобы улучшить эффективность и уменьшить размер кода, можно упростить инструкции работы с флагами. Например, если единственным желаемым результатом является установка конкретного бита в AX, а флаги процессора, на которые влияет данная инструкция, значение не имеют, инструкцию:


OR ax,1000h


можно упростить до инструкции:


OR, ah,10h


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


Эффективные инструкции работы с флагами
ИнструкцияФункцияСоответствует инструкции
SETFLAGУстановка бит (бита) флага.OR
MASKFLAG Размаскирование бит (бита) флага.AND
TESTFLAGПроверка бит (бита) флага. TEST
FLIPFLAGДополнение бит (бита) флага.XOR



Эти инструкции можно использовать для улучшения модульности записей, например:


FOO RECORD R0:1,R1:4,R2:3,R3:1
.
.
.
TESTFLAG AX,R0




В данном примере TESTFLAG будет генерировать наиболее эффективные инструкции, независимо от того, где в записи находится R0.


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


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


Инструкции для установки и извлечения значения
ИнструкцияФункция
SETFIELDУстанавливает значение поля записи.
GETFIELDИзвлекает значение из поля записи.



Инструкция SETFIELD


Инструкция SETFIELD генерирует код, устанавливающий значение поля записи. Она имеет синтаксис:


SETFIELD имя_поля регистр/память_приемник, регистр_источник


где "имя_поля" - имя поля записи, "регистр/память_приемник" для SETFIELD представляет собой регистр или адрес в памяти типа BYTE или WORD (DWORD для процессора 80386). "Регистр_источник" должен быть регистром того же или меньшего размера. Если источник меньше, чем приемник, то регистр-источник должен быть младшей частью другого регистра, имеющего тот же размер, что и приемник. Этот полный регистр называется рабочим регистром. Используйте данный регистр для сдвига значения в регистре-источнике, благодаря чему оно выравнивается по приемнику. Например:


FOO RECORD R0:1,R1:4,R2:3,R3:1
.
.
.
SETFIELD F1 AX,BL ; рабочим регистром является BX
SETFIELD F1 AX,BH ; недопустимо!


SETFIELD сдвигает регистр-источник, чтобы эффективно выровнять его на поле приемника, выполняет операцию OR и помещает результат в регистр-приемник.


Примечание: Операция SETFIELD уничтожает все содержимое рабочего регистра.


Чтобы выполнить свою функцию, инструкция SETFIELD генерирует эффективную и расширенную последовательность инструкций XOR, XCHG, ROL, ROR, OR и MOVZX.


Операция SETFIELD не пытается очистить целевое поле перед выполнением над его значением операции OR. Если это необходимо, вы можете очистить поле явным образом, используя инструкцию MASKFLAG.


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


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

8  В тему

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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