Инструкция GETFIELD
Инструкция GETFIELD извлекает данные из поля записи. Логика ее работы противоположна инструкции SETFIELD. Она имеет следующий синтаксис:
GETFIELD имя_поля регистр_приемник, регистр/память_источник
где "имя_поля" и "регистр_приемник" работают так же, как в операции SETFIELD. "Регистр/память_источник" можно использовать также, как "регистр_источник" в операции SETFIELD, например:
FOO RECORD R0:1,R1:4,R2:3,R3:1 . . . GETFIELD F1 AX,BL ; рабочим регистром является BX GETFIELD F1 AX,BH ; недопустимо!
Примечание: Операция GETFIELD уничтожает все содержимое рабочего регистра.
Операция GETFIELD извлекает значение поля, обнаруженное в регистре-источнике или по адресу памяти, и устанавливает в это значение соответствующую часть регистра-приемника. На другие регистры (кроме рабочего) и флаги процессора эта инструкция не влияет.
Чтобы выполнить свою функцию, инструкция GETFIELD генерирует эффективную и расширенную последовательность инструкций MOV, XCHG, ROL и ROR.
Дополнительная быстрая инструкции непосредственного умножения
Для эффективной индексации массивов Турбо Ассемблер обеспечивает специальную операцию непосредственного умножения. Инструкция FASTIMUL решает типичную проблему, возникающую при создании массива структур. Для процессора 8086 инструкция непосредственного умножения недоступна. Даже на более развитых процессорах умножение с использованием сдвигов и сложений выполняется в некоторых обстоятельствах существенно быстрее, чем стандартная непосредственная инструкция IMUL. На основе текущего назначения процессора инструкция Турбо Ассемблера FASTIMUL выбирает между наиболее эффективной доступной последовательностью сдвигов и сложений и непосредственной операцией IMUL текущего процессора (если она имеется). Инструкция FASTIMUL имеет следующий синтаксис::
FASTIMUL регистр_приемник, регистр/память_источник, значение
Данная инструкция очень напоминает тернарную операцию IMUL, доступную на процессорах 80186, 80286 и 80386. Регистр-приемник - это регистр размером в слово (или двойное слово при работе на процессора 80386). "Регистр/память_источник" - это регистр или адрес в памяти, который должен соответствовать размеру приемника. "Значение" - это фиксированная константа со знаком (множитель).
Инструкция FASTIMUL использует для выполнения своей функции комбинацию инструкций IMUL, MOV, NEG, SHL, ADD и SUB. При этом содержимое регистра-источника (или адреса памяти) теряется. Флаги процессора не изменяются.
Расширение необходимых инструкций для процессора 80386
Процессор 80386 имеет возможность работы в 16- или 32-разрядном режиме. Многие стандартные инструкции в этих разных режимах имеют разный смысл. В Турбо Ассемблере размером инструкции можно управлять с помощью используемых в выражениях переопределений SMALL и LARGE.
В общем случае, если вы в адресном выражении используете SMALL и LARGE, операция управляет генерацией адресной части инструкции в зависимости от того, должна она быть 16- или 32-разрядной.
Примечание: Более подробно о переопределении размера с помощью операций SMALL и LARGE рассказывается в этом разделе.
Когда SMALL или LARGE указывается вне адресной части выражения, то можно управлять тем, какая инструкция выполняется - 16- или 32-битовая. В тех случаях, когда размер инструкции определяется по типу операнда, Турбо Ассемблер сам выбирает размер инструкции. Действие SMALL и LARGE показано в следующей таблице.
Примечание: Турбо Ассемблер выбирает размер инструкии, используя SMALL и LARGE, только когда нет другой информации.
Действие инструкций SMALL и LARGEИнструкция | Действие |
---|
PUSH[SMALL/LARGE] сегм_рег | Выбирает, какая форма сегментного регистра (16- или 32-разрядная) используется в инструкции PUSH. | POP[SMALL/LARGE] сегм_рег | Выбирает, какая форма сегментного регистра (16- или 32-разрядная) используется в инструкции POP. | FSAVE[SMALL/LARGE] указ_пам | Выбирает, какая форма состояния с плавающей точкой (16- или 32-разрядная) сохраняется. | FRSTOR[SMALL/LARGE] указ_пам | Выбирает, какая форма состояния с плавающей точкой (16- или 32-разрядная) восстанавливается. | FSTENV[SMALL/LARGE] указ_пам | Выбирает, какая форма состояния с плавающей точкой (16- или 32-разрядная) записывается. | FLDENV[SMALL/LARGE] указ_пам | Выбирает, какая форма состояния с плавающей точкой (16- или 32-разрядная) загружается. | LGDT[SMALL/LARGE] указ_пам | Выбирает, какая форма глобальной таблицы дескрипторов (16- или 32 32-разрядная) загружается. | SGDT[SMALL/LARGE] указ_пам | Выбирает, какая форма глобальной таблицы дескрипторов (16- или 32-разрядная) сохраняется. | LIDT[SMALL/LARGE] указ_пам | Выбирает, какая форма таблицы дескрипторов прерываний (16- или 32-разрядная) загружается. | SIDT[SMALL/LARGE] указ_пам | Выбирает, какая форма таблицы дескрипторов прерываний (16- или 32-разрядная) сохраняется. | JMP[SMALL/LARGE] указ_пам | Для адресов памяти размером в двойное слово (DWORD) выбирает между 16-битовым переходом JMP типа FAR и 32-битовым переходом JMP типа NEAR. | CALL[SMALL/LARGE] указ_пам | Для адресов памяти размером в двойное слово (DWORD) выбирает между 16-битовой инструкцией CALL типа FAR и 32-битовой инструкцией CALL типа NEAR. |
1 2 3 4 5 6
8 8 8
| |