Табличный поиск
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: