Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
BOUND
Влияние команды на флаги и форматы команды:
62 /r |
BOUND r16,m16&16 |
Проверяет индекс r16 на выход за границы массива m16&16 |
Intel186 |
bound ax,array |
62 /r |
BOUND r32,m32&32 |
Проверяет индекс r32 на выход за границы массива m32&32 |
Intel386 |
bound edx,arr |
Описание:
Команда BOUND позволяет убедиться в том, что знаковый индекс массива находится в пределах, определенных в блоке памяти, состоящем из верхней и нижней границ. Каждая граница занимает слово при атрибуте размера операнда равном 16 бит и двойное слово при атрибуте размера операнда равном 32 бита. Первый операнд (всегда регистр) должен быть больше или равен первой границе в памяти (нижней границе) и меньше или равен сумме второй границы в памяти (верхней границы) и количества байт, отведенных размеру операнда. Если значение регистра не находится в пределах границ, то происходит генерация особой ситуации #BR, а сохраняемый при этом CS:EIP указывает на команду BOUND.
Данные структуры пределов границ помещаются обычно непосредственно перед массивом, делая тем самым пределы адресуемыми при помощи постоянного смещения от начала массива.
Операция:
IF ( LeftSRC < [RightSRC] OR LeftSRC > [RightSRC + OperandSize/8] )
(* Под нижней границей или над верхней границей *)
THEN #BR;
FI;
Особые ситуации защищенного режима:
#BR, если тест на проверку границ потерпел неудачу.
#GP(0), если результат находится в сегменте, запрещенном для записи, а также если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS или GS.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки), страничная ошибка;
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
#UD, если в команде BOUND поле ModR/M задает регистр в качестве второго операнда (второй операнд должен быть операндом в памяти, но не регистром).
Особые ситуации режима реальной адресации:
#BR, если тест на проверку границ потерпел неудачу.
#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.
#UD, если в команде BOUND поле ModR/M задает регистр в качестве второго операнда (второй операнд должен быть операндом в памяти, но не регистром).
Особые ситуации режима V86:
Такие же, как и в режиме реальной адресации.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru