Табличный поиск с использованием сравнения строк

3.1. Изменить программу tabsrc1.asm с помощью текстового редактора NORTON следующим образом:

.286

TITLE TABSRC2 (COM) Табличный поиск

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H ;Начало в конце PSP

BEGIN: JMP SHORT MAIN ;Обход через данные

;-------------------------------------------------------

STOKNIN DB '123' ;Элементы данных

STOKTAB DB '035','Excavators' ;Начало таблицы

DB '038','Lifters '

DB '049','Presses '

DB '102','Valves '

DB '123','Processors'

DB '127','Pumps '

DB '999', 10 DUP (' ') ;Конец таблицы

DESCRN DB 10 DUP(?)

;--------------------------------------------------------

MAIN PROC NEAR

CLD

LEA SI,STOKTAB ;Нач. адрес таблицы

A20: MOV CX,03 ;Сравнивать по 3

LEA DI,STOKNIN ;Адрес искомого

REPE CMPSB ;Сравнение

JE A30 ;Если равно - выйти

JA A40 ;Если больше - прекратить поиск

ADD SI,CX ;Прибавить СХ к адресу

ADD SI,10 ;Прибавить дл. наименования

JMP A20 ;Следующий эл. таблицы

A30: MOV CX,05 ;Пересылать 5 слов

LEA DI,DESCRN ;Адрес описания

REP MOVSW ;Переслать из таблицы

RET

A40: CALL R10ERR ;Элемент не найден

RET

MAIN ENDP

R10ERR PROC

RET ; <Вывод сообщения об ошибке>

R10ERR ENDP

CODESG ENDS

END BEGIN

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

Так как числовой элемент таблицы превышает длину в два байта, то для операции сравнения используется команда REPE CMPS. Команда REPE CMPS сравнивает байт за байтом, пока байты не будут равны, и автоматически увеличивает содержимое регистров SI и DI.

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

Увеличение адреса следующего элемента таблицы, который должен быть в регистре SI, зависит от того, на каком байте (первом, втором или третьем) закончилось предыдущее сравнение. Регистр СХ будет содержать число байтов, не участвующих в предыдущем сравнении, в данном случае - 02. Прибавив к содержимому регистра SI значение в регистре СХ и длину наименования, получают относительный адрес следующего элемента:

Адрес в SI после REPE CMPSB 06

Прибавить СХ 02

Прибавить длину наименования 10

-------------------------------------

Относительный адрес след. элемента 18 (12Н)

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

3.2. Выполнить ассемблирование и компоновку программы. Листинг программы записать в отчет.

3.3. Вызвать отладчик DEBUG на выполнение программы. Просмотреть сегмент кодов перед трассировкой программы. Выполнить трассировку программы до команды REP MOVSW. Проверить сегмент кодов после выполнения команды REP MOVSW. Выводы о выполнении программы записать в отчет.

Наши рекомендации