Расширенные инструкции сдвига
При использовании процессор 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
| |