Табличный поиск

2.1. Записать в текстовом редакторе NORTON следующую программу в СОМ-формате:

.286

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

CODESG SEGMENT PARA 'Code'

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

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

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

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

STOKNIN DW '23' ;Элементы данных

STOKTAB DB '05','Excavators'

DB '08','Lifters '

DB '09','Presses '

DB '12','Valves '

DB '23','Processors'

DB '27','Pumps '

DESCRN DB 10 DUP(?)

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

MAIN PROC NEAR

MOV AX,STOKNIN ;Загр. N элемента

XCHG AL,AH

MOV CX,06 ;Число элементов

LEA SI,STOKTAB ;Начальный адрес

A20: CMP AX,[SI] ;Сравнить элементы

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

ADD SI,12 ;нет - следующий

LOOP A20

CALL R10ERR ;Элем. в табл. не найден

RET

A30: MOV CX,05 ;Длина описания элем.

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

INC SI

INC SI

REP MOVSW ;Выделить описание из таблицы

RET

MAIN ENDP

R10ERR PROC

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

R10ERR ENDP

CODESG ENDS

END BEGIN

Программа определяет таблицу и выполняет табличный поиск. Таблица содержит шесть пар номеров и наименований. Цикл поиска начинается со сравнения введенного номера в поле STOKNIN с первым номером в таблице. Если номера различные, то адрес в таблице увеличивается для сравнения со следующим номером. Если номера равны, то программа (А30) выделяет наименование из таблицы и записывает

его в поле DESCRN.

Поиск выполняет максимум шесть сравнений, и если требуемый номер в таблице отсутствует, то происходит переход на программу обработки ошибки R10ERR (сама процедура не приводится).

В начале программы имеется команда, которая пересылает содержимое поля STOKNIN в регистр АХ. Хотя STOKNIN определено в сегменте кодов как 3332, команда MOV загрузит в регистр АХ это значение в прямой последовательности байтов 3233. Так как элементы таблицы в сегменте кодов имеют обратную последовательность байтов, то после команды MOV имеется команда XCHG, которая меняет местами байты в регистре АХ, возвращая им обратную последовательность, т.е. 3332. Команда CMP сравнивает сначала правые байты, а затем левые. Следовательно, проверка на равенство будет корректной, но проверки на больше или меньше дадут неправильные результаты.

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

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

2.4. С помощью текстового редактора изменить начало программы tabsrc.asm до команды ADD SI,12: