Ассемблер и программирование для IBM PC



       

ГЛАВА 14. Обработка таблиц - часть 5


Данные: |123|035Excavators|038Lifters |049Presses | ... | | | | | | | Адрес: 00 03 06 16 19 29 32

Программа на рис.14.3 определяет таблицу STOKTAB, включая последний элемент '999' для индикации конца таблицы при поиске. Программа поиска сравнивает содержимое каждого элемента таблицы с содержимым поля STOKNIN:

Элемент таблицы STOKNIN Результат сравнения

035 123 Меньше: проверить след.эл-т 038 123 Меньше: проверить след.эл-т 049 123 Меньше: проверить след.эл-т 102 123 Меньше: проверить след.эл-т 123 123 Равно: элемент найден

Заметим, что команда CMPSB на рис.14.3 сравнивает байт за байтом, пока байты не будут равны и автоматически увеличива ет регистpы SI и DI.

------------------------------------------------------------ ------------------------------------------------------------ Рис.14.3. Табличный поиск с использованием команды CMPSB

Ассемблер для IBM PC. Глава 14 29

Регистр CX инициализируется значением 03, а начальные относительные адреса в регистрах SI и DI устанавливаются равными 03 и 00 соответственно. Сравнение с первым элементом таблицы (035:123) завершается на первом байте, после этого регистр SI содержит 04, DI: 01, CX: 02. Для следующего сравнения регистр SI должен иметь значение 16, а DI: 00. Корректировка регистра DI сводится к простой перезагрузке адреса STOKNIN. Увеличение адреса следующего элемента таблицы, который должен быть в регистре SI, зависит от того, на каком байте (первом, втором или третьем) закончилось предыдущее сравнение. Регистр CX содержит число байт, не участвующих в сравнении, в данном случае - 02. Прибавив к содержимому регистра SI значение в регистре CX и длину наименования, получим относительный адрес следующего элемента:

Адрес в SI после CMPSB 04 Прибавить CX 02 Прибавить длину наименования 10 Относительный адрес след.элемента 16

Так как регистр CX всегда содержит число байт, не участвующих в сравнении (если такие есть), то расчет справедлив для всех случаев: прекращение сравнения после 1, 2 или 3 байта. Если сравниваются одинаковые элементы, то регистр CX получит значение 00, а адрес в pегистре SI укажет на требуемое наименование.




Содержание  Назад  Вперед