BOUND
(check array BOUNDs)
Контроль нахождения индекса массива в границах
Схема команды: | bound индекс,границы массива |
Назначение: проверка нахождения значения индекса в границах массива.
Алгоритм работы:
Cравнить значение в регистре индекс с двумя значениями, расположенными последовательно в ячейке памяти, адресуемой операндом границы массива. Диапазон значений индекса определяется используемым регистром индекс:
если это 16-разрядный регистр общего назначения, то содержащееся в нем значение проверяется на попадание в диапазон значений, которые находятся в двух последовательных словах в памяти по адресу, указываемому вторым операндом. Эти два значения являются, соответственно, значениями нижнего и верхнего индекса границы массива;
если это 32-разрядный регистр общего назначения, то содержащееся в нем значение проверяется на попадание в диапазон значений, которые находятся в двух последовательных двойных словах в памяти по адресу, указываемому вторым операндом. Эти два значения являются, соответственно, значениями нижнего и верхнего индекса границы массива;
Если в результате проверки значение из регистра вышло за пределы указанного диапазона значений, то возбуждается прерывание с номером 5, если нет, программа продолжает выполнение.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команду bound очень удобно использовать для контроля выхода за нижнюю или верхнюю границы массива. Значения этих границ должны быть предварительно помещены в два последовательных слова (двойных слова) в памяти. Адрес этих слов (двойных слов) указывается вторым операндом. Далее динамически в ходе работы программы значение в регистре индекс, указываемом первым операндом, сравнивается со значениями этих двух границ, и если нижняя_граница<=(индексindex)<=верхняя_граница, то программа продолжает выполнение. В противном случае генерируется исключительная ситуация 5 (int 5). Далее в программе обработки этой ситуации можно выполнить необходимую корректировку и вернуться в программу (см. урок 17).
Фрагмент, который можно использовать при обработке одномерного массива с размерностью элементов в слово:
.286 ;это обязательная директива, так как bound ;входит в систему команд микропроцессоров, начиная с i286 .data BoundMas label word Low_Bound dw 0 Upp_Bound dw 20 mas dw 10 dup (?) ... xor di,di ;очистка индексного регистра cycl: mov ax,mas[di] ;перебор элементов массива add di,2 bound di,BoundMas ;если значение в di не будет попадать в границы, то будет вызван ;обработчик прерывания 5, где можно скорректировать ;значение ip/eip в стеке с тем, чтобы выйти ;из бесконечного ;цикла, например, на метку М2 или ;выполнить другие действия jmp cycl М2: ... |