Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

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

__________________________________________________________________________

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

Таблицы с ранжированием

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

Подоходный налог дает характерный пример таблицы с ранжированными

значениями. Представим себе таблицу, содержащую размеры доходов oблагаемых

налогами, процент налога и поправочный коэффициент:

Размер дохода Процент налога Поправочный к-нт

0-1000.00 10 0,00

1000,01-2500,00 15 050,00

2500,01-4250,00 18 125,00

4250,01-6000,00 20 260,00

6000,01 И более 23 390,00

В налоговой таблице процент увеличивается в соответствии с увеличением

налогооблагаемого дохода. Элементы таблицы доходов содержат максимальные

величины для каждого шага:

TAXTBL DD 100000,250000,425000,600000,999999

для организации поиска в такой таблице, программа сравнивает доxод

налогоплатильщика с табличным значением дохода:

- если меньше или равно, то использовать соответствующий процент

и поправку;

- если больше, то перейти к следующему элементу таблицы.

Величина налога рассчитывается по формуле:

Доход х Процент налога : 100 - поправочный к-нт

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

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

Если элемент таблицы превышает длину в два байта, то для операции

сравнения можно использовать команду REPE CMPS. Предположим, что таблица

инвентарных номеров (рис.14.2) переделана для трехбайтовых номеров. Если

STOKNIN является первым полем в области данных, а STOKTAB - вторым, то они

могут выглядеть cледующим образом:

Данные: |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.

Регистр 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 укажет

на требуемое наименование.

__________________________________________________________________________

page 60,132

TITLE TABSRCH (COM) Табличный поиск, использующий CMPSB

CODESG SEGMENT PARA 'Code'

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

ORG 100H

BEGIN: JMP SHORT MAIN

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

STOKNIN DW '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 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 ;Прибавить CX к адресу

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

A30:

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

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

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

RET

A40:

CALL R10ERR ;элемент в таблице не найден

RET

MAIN ENDP

R10ERR PROC

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

RET

R10ERR ENDP

CODESG ENDS

END BEGIN

__________________________________________________________________________

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

Таблицы с элементами переменной длины

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

Существуют таблицы, в которых элементы имеют переменную длину. Каждый

элемент такой таблицы может завершаться специальным символом

ограничителем, например, шест.00; конец таблицы можно обозначить

огpаничителем шест.FF. В этом случае необходимо гарантировать, чтобы

внутри элементов таблицы не встречались указанные ограничители. Помните,

что двоичные числа могут выражаться любыми битовыми комбинациями. Для

поиска можно использовать команду SCAS.

ТРАНСЛИРУЮЩАЯ КОМАНДА XLAT

________________________________________________________________

Команда XLAT транслирует содержимое одного байта в другое

предопределенное значение. С помощью команды XLAT можно проверить

корректность содержимого элементов данных. При передаче данных между

персональным компьютером и ЕС ЭВМ (IBM) с помощью команды XLAT можно

выполнить перекодировку данных между форматами ASCII и EBCDIC.

В следующем примере происходит преобразование цифр от 0 до 9 из кода

ASCII в код EBCDIC. Так как представление цифр в ASCII выглядит как

шест.30-39, а в EBCDIC - шест.F0-F9, то замену можно выполнить командой

OR. Однако, дополнительно преобразуем все остальные коды ASCII в пробел

(шест.40) в коде EBCDIC. Для команды XLAT необходимо определить таблицу

перекодировки, которая учитывает все 256 возможных символов, с кодами

EBCDIC в ASCII позициях: