Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 ... 34 35 36 37 38 39 40  41 42 43 44 45 46 47 ... 85
необязательно.

          STOKTBL DB 12,'Computers',14,'Paper....',17,'Diskettes'

Для ясности можно закодировать элементы таблицы вертикально:

               STOKTBL   DB   12,  'Computers'
                         DB   14,  'Paper....'
                         DB   17,  'Diskettes'

     Рассмотрим  теперь  различные  способы   использования    таблиц    в
программах.


     ПРЯМОЙ ТАБЛИЧНЫЙ ДОСТУП
     ________________________________________________________________

     Предположим, что пользователь ввел номер  месяца  -  03  и  программа
должна преобразовать этот номер в алфавитное значение March. Программа для
выполнения такого преобразования включает определение  таблицы  алфавитных
названий месяцев, имеющих одинаковую длину. Так как самое длинное название
- September, то таблица имеет следующий вид:

               MONTBL    DB   'January..'
                         DB   'February.'
                         DB   'March....'

Каждый элемент таблицы имеет длину 9  байт.  Адрес  элемента  'January'  -
MONTBL+0, 'February' - MONTBL+9,  'March'  -  MONTBL+18.  Для  локализации
месяца 03, программа должна выполнить следующее:

          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      ;Загрузить номер элемента
        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 - вторым, то они
Предыдущая страница Следующая страница
1 ... 34 35 36 37 38 39 40  41 42 43 44 45 46 47 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама