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

1. Преобразовать введенный номер месяца из ascii 33 в двоичное

03.

2. Вычесть единицу из номера месяца: 03 - 1 = 02

3. Умножить результат на длину элемента (9): 02 х 9 = 18

4. Прибавить произведение (18) к адресу montbl; в результате

получится адрес требуемого названия месяца: MONTBL+18.

__________________________________________________________________________

page 60,132

TITLE DIRECT (COM) Прямой табличный доступ

CODESG SEGMENT PARA 'Code'

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

ORG 100H

BEGIN: JMP SHORT MAIN

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

THREE DB 3

MONIN DB '11'

ALFMON DB '???','$'

MONTAB DB 'JAN','FEB','MAR','APR','MAY','JUN'

DB 'JUL','AUG','SEP','OKT','NOV','DEC'

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

MAIN PROC NEAR ;Основная процедура

CALL C10CONV ;Получить двоичное значение

CALL D10LOC ;Выделить месяц из таблицы

CALL F10DISP ;Выдать месяц на экран

RET

MAIN ENDP

; Перевод ASCII в двоичное представление:

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

C10CONV PROC

MOV AH,MONIN ;Загрузить номер месяца

MOV AL,MONIN+1

Xor ax,3030h ;Удалить ascii тройки

CMP AH,00 ;Месяц 01-09?

JZ C20 ; да - обойти

SUB AH,AH ; нет - очистить AH,

ADD AL,10 ; и перевести в двоичное

C20 RET

C10CONV ENDP

; Выделение месяца из таблицы:

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

D10LOC PROC

LEA SI,MONTAB

DEC AL ;Коррекция для таблицы

MUL THREE ;Умножить AL на 3

ADD SI,AX

MOV CX,03 ;Трехсимвольная пересылка

CLD

LEA DI,ALFMON

REP MOVSB ;Переслать 3 символа

RET

D10LOC ENDP

; Вывод на экран симв.месяца:

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

F10DISP PROC

LEA DX,ALFMON

MOV AH,09

INT 21H

RET

F10DISP ENDP

CODESG ENDS

END BEGIN

__________________________________________________________________________

Рис.14.1. Прямая табличная адресация.

На рис.14.1 приведен пример прямого доступа к таблице названий

месяцев. Для краткости в программе используются вместо девятисимвольных

названий - трехсимвольные. Введенный номер месяца определен в поле MONIN.

Предположим, что некоторая подпрограмма формирует запрос на ввод номера

месяца в ASCII-формате в поле MONIN.

Описанная техника работы с таблицей называется прямым табличным

доступом. Поскольку данный алгоритм непосредственно вычисляет адpес

необходимого элемента в таблице, то в программе не требуется выполнять

операции поиска.

Хотя прямая табличная адресация очень эффективна, она возможна только

при последовательной организации. То есть можно использовать такие

таблицы, если элементы располагаются в регулярной последовательности: 1,

2, 3,... Или 106, 107, 108,... Или даже 5, 10, 15. Однако, не всегда

таблицы построены таким образом. В следующем разделе рассматриваются

таблицы, имеющие нерегулярную организацию.

ТАБЛИЧНЫЙ ПОИСК

________________________________________________________________

Некоторые таблицы состоят из чисел, не имеющих видимой

закономерности. Характерный пример - таблица инвентарных номеров с

последовательными номерами, например, 134, 138, 141, 239 и 245. Другой тип

таблиц состоит из распределенных по ранжиру величин, таких как подоходный

налог. В следующих разделах рассмотрим эти типы таблиц и организацию

табличного поиска.

Таблицы с уникальными элементами

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

Инвентарные номера большинства фирм часто не имеют последовательного

порядка. Номера, обычно, группируются по категориям, первые цифры

указывают на мебель или приборы, или номер отдела. Кроме того время от

времени номера удаляются, а новые добавляются. В таблице необходимо

связать инвентарные номера и их конкретные наименования (и, если

требуется, включить стоимость). Инвентарные номера и наименования могут

быть определены в различных таблицах, например:

STOKNOS DB '101','107','109',...

STOKDCR DB 'Excavators','Processors','Assemblers',...

или в одной таблице, например:

STOKTAB DB '101','Excavators'

DB '107','Processors'

DB '109','Assemblers'

...

Программа на рис.14.2 определяет инвентарную таблицу и выполняет

табличный поиск. Таблица содержит шесть пар номеров и наименований. Цикл

поиска начинается со сравнения введенного инвентарного номера в поле

STOKNIN с первым номером в таблице. Если номера различные, то адрес в

таблице увеличивается для сравнения со следующим инвентарным номером. Если

номера равны, то программа (A30) выделяет наименование из таблицы и

записывает его в поле DESCRN.

Поиск выполняет максимум шесть сравнений и если требуемый номер в

таблице отсутствует, то происходит переход на программу обработки ошибки,

которая выводит на экран соответствующее сообщение.

Обратите внимание, что в начале программы имеется команда, которая

пересылает содержимое поля STOKNIN в регистр AX. Хотя STOKNIN определенно

как 3233, команда MOV загрузит в регистр AX это значение в обратной

последовательности байтов 3332. Так как элементы таблицы имеют прямую

последовательность байтов, то после команды MOV имеется команда XCHG,

которая меняет местами байты в регистре AX, возвращая им прямую

последовательность, т.е. 3233. Команда CMP, предполагая обратную

последовательность, сравнивает сначала правые байты, а затем - левые.

Следовательно, проверка на pавенство будет корректной, но проверки на

больше или меньше дадут неправильные результаты. Для сравнения на больше

или меньше следует опустить команду XCHG, переслать элемент таблицы

командой MOV, скажем, в регистр BX и затем сравнить содержимое регистров

AX и BX следующим образом:

MOV AX,STOKNIN

LEA SI,STOKTAB

C20:

MOV BX,[SI]

CMP AX,BX

JA или JB ...

В программе такого типа другая таблица может определять стоимость

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

продажную стоимость (количество товара умножить на стоимость единицы

товара) и выдать на экран наименование и продажную стоимость товара.

В примере на рис.14.2 таблица содержит двухбайтовые номера и

десятибайтовые наименования. Детальное программирование будет oтличаться

для различного числа и длины элементов. Например, для сравнения

трехбайтовых полей можно использовать команду REPE CMPSB, хотя эта команда

также включает использование pегистра CX.

__________________________________________________________________________

page 60,132

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

CODESG SEGMENT PARA 'Code'

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

ORG 100H

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 10 DUP(?)

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

MAIN PROC NEAR

MOV AX,STOKNIN ;Загрузить номер элемента