В разделе "Работа команды" находится алгоритмическое описание команды, использующее запись, аналогичную языкам Алгол и Паскаль. Алгоритмы составлены из следующих элементов:
Комментарии заключаются в пары символов "(*" и "*)".
Составные операторы заключаются между ключевыми словами оператора "if" (IF, THEN, ELSE, FI) или оператора "do" (DO, OD), либо оператора "case" (CASE...OF,ESAC).
Имя регистра подразумевает содержимое регистра. Имя регистра в квадратных скобках подразумевает содержимое позиции памяти, адрес которой содержится в регистре. Например, ES:[DI] означает содержимое адреса памяти, задаваемого относительно регистра ES содержимым регистра DI. [SI] указывает на содержимое адреса, содержащегося в регистре SI относительно сегмента для SI по умолчанию (DS) или относительно переопределенного сегмента.
Таблица 26-5. Время выполнения переключения задачи ----------------------------------------------------------------- | Новая задача Старая задача |-------------------------------------------- |На TSS i486 | на TSS 80286 | на TSS VM-----------------------------------------------------------------VM/i486/80286 TSS | 199 | 180 | 177-----------------------------------------------------------------VM = виртуальный режим
Квадратные скобки используются также для операндов памяти, где они означают, что содержимое адреса памяти задается смещением относительно сегмента. Например, [SRC] указывает, что содержимое исходного операнда является смещением относительно сегмента. A <- B означает, что значение B присваивается А. Символы =, <>, >= и <= это операции отношения, используемые при сравнении двух величин, означающие равенство, неравенство, больше или равно или меньше или равно, соответственно. Выражение отношения, например, A = B, имеет результат TRUE (истина), если значение А равно значению В; в противном случае оно равно FALSE (ложь).
В алгоритмических описаниях используются следующие идентификаторы:
OperandSize представляет собой атрибут размера операнд команды, равный либо 16, либо 32 битам. AddressSize представляет собой атрибут размера адреса, также равный 16 или 32 битам. Например,
· IF instruction = CMPSW· THEN OperandSize <- 16;· ELSE· IF instruction = CMPSD· THEN OperandSize <- 32;· FI;· FI;
означает, что атрибут размера операнда зависит от формы используемой команды CMPS. См. описание атрибутов размера адреса и размера операнда в начале данной главы, где приводятся общие указания относительно определения данных атрибутов.
StackAddrSize представляет собой атрибут размера адреса для стека, связанный с данной командой, и имеет значение 16 или 32 бита, как объяснялось выше в данной главе.
SRC представляет собой исходный операнд. При наличии двух операндов SRC это операнд справа.
DEST представляет собой операнд назначения. При наличии двух операндов DEST это операнд слева.
LeftSRC, RightSRC позволяют различить два операнда, оба из которых являются исходными операндами.
eSP представляет собой либо регистр SP, либо регистром ESP, в зависимости от установки бита B для текущего сегмента стека.
Следующие функции используются в алгоритмических описаниях:
· Truncate to 16 bits (значение) уменьшает размер значения таким образом, чтобы оно помещалось в 16 битах, при необходимости отбрасывая старший байт.
· Addr(операнд) возвращает исполнительный адрес операнда (результат вычисления исполнительного адреса перед сложением с базой сегмента).
· ZeroExtend(значение) возвращает значение, расширенное нулем в соответствии с атрибутом размера операнда команды. Например, если OperandSize = 32, ZeroExtend для байтового значения, равного -10, преобразует байт из значения F6H в двойное слово с шестнадцатиричным значением 000000F6H. Если значение, переданное ZeroExtend, и атрибут размера операнда имеют одинаковое значение, то ZeroExtend возвращает это значение неизмененным.
· SignExtend(значение) возвращает значение, расширенное знаком в соответствии с атрибутом размера операнда команды. Например, если OperandSize = 32, SignExtend для байтового значения, равного -10, преобразует байт из значения F6H в двойное слово с шестнадцатиричным значением FFFFFFF6H. Если значение, переданное SignExtend, и атрибут размера операнда имеют одинаковое значение, то SignExtend возвращает это значение неизмененным.
· Push(значение) помещает значение в стек. Число байтов, помещенных в стек, определяется атрибутом размера операнда команды. Действие Push следующее:
IF StackAddrSize = 16 THEN IF OperandSize = 16 THEN SP <- SP - 2; SS:[SP] <- значение (* присвоение 2 байтов, начиная с байта, адресуемого в SP *) ELSE (* OperandSize = 32 *) SP <- SP - 4; SS:[SP] <- значение (* присвоение 4 байтов, начиная с байта, адресуемого в SP *) FI; ELSE (* StackAddrSize = 32 *) IF OperandSize = 16 THEN ESP <- ESP - 2; SS:[ESP] <- значение (* присвоение 2 байтов, начиная с байта, адресуемого в ESP *) ELSE (* OperandSize = 32 *) ESP <- ESP - 4; SS:[ESP] <- значение (* присвоение 4 байтов, начиная с байта, адресуемого в ESP *) FI; FI;
· Pop(значение) удаляет значение из вершины стека и возвращает его. Оператор EAX <- Pop(); присваивает EAX 32-битовое значение, которое Pop снимает с вершины стека. Pop возвращает либо слово, либо двойное слово, в зависимости от атрибута размера операнда. Действие Pop следующее:
IF StackAddrSize = 16 THEN IF OperandSize = 16 THEN значение возврата <- SS:[SP]; (* 2-байтовое знач *) SP <- SP + 2; ELSE (* OperandSize = 32 *) значение возврата <- SS:[SP]; (* 4-байтовое знач *) SP <- SP + 4; FI; ELSE (* StackAddrSize = 32 *) IF OperandSize = 16 THEN значение возврата <- SS:[ESP]; (* 2-байтовое знач *) ESP <- ESP + 2; ELSE (* OperandSize = 32 *) значение возврата <- SS:[ESP]; (* 4-байтовое знач *) ESP <- ESP + 4; FI; FI; RETURN(значение возврата); (* возврат слова или двойного слова *)
· Pop ST используется для страниц с командами операций с плавающей точкой и означает извлечение из стека регистров FPU.
· Bit[BitBase, BitOffset] (Бит [БазаБита, СмещениеБита]) возвращает адрес бита в строке битов, представляющей собой битовую последовательность в памяти или регистре. Биты нумеруются в регистре или памяти от младшего к старшему. В памяти два байта слова располагаются таким образом, что младший байт содержит младшие адреса битов. Если базовым операндом является регистр, то смещение может находиться в диапазоне 0...31. Это смещение адресует бит в указанном регистре. Например, 'BIT[EAX, 21]' показана на Рисунке 26-4.
· I-O-Permission(I-O-Address, width) (Разрешение ввода-вывода (адрес-ввода-вывода,ширина)) возвращает значения TRUE или FALSE в зависимости от битового массива разрешения ввода/вывода и прочих факторов. Эта функция определяется следующим образом: