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

MAIN PROC NEAR

MOV AX, STOKNIN ;Завантаження № елемента

XCHG AL, AH ; Взаємозаміна байтів.

MOV CX, 06 ; Лічильник циклів/кількість елементів таблиці.

LEA Si, STOKTAB ;B Si завантаження початкової адреси таблиці.

A20:

CMP AX, [Si]; орівняння вмісту АХ з елементом таблиці, що відп.інв. №

JE A 30 Якщо рівні – вийти з циклу на мітку А 30.

ADD Si, 12 Встановлення в Si адреси наступного інвент. №

LOOP A20

CALL RIOERR

RET

A30:

MOV CX, OA ; Довжина найменуваня елемента

LEA Di, DESCRN ; Поч. Адрес куди заноситься назва елемента.

INC Si

INC Si ; Встановлення в SIV поч. Адреси назви вибраного елемента.

REP MOVSW ; Запис назви елемента з адреси Si за адресою Di

RET

MAIN ENDP

RIOERR PROC

;<Вивід повідомлення про відсутність елемента>

RET

RIOERR ENDP

CODESG ENDS

END BEGIN.

 

Цикл пошуку починається з порівняння введеного інвентарного номера в полі STOKNIN з першим номером в таблиці. Якщо номера не співпадають, то адрес збільшується до наступного інв. № в таблиці. Якщо номера співпадають, то виконується програма з мітки A30 – виділення найменування з таблиці і запис його в поле DESCRN.

Після 6-го повторення циклу, якщо введений номер не знайдено, то виконується програма обробки помилок RIOERR, яка виводить на екран відповідне повідомлення .

На початку програми виконується команда пересилки вмісту поля STOKNIN в регіст. АХ. Хоч STOKNIN визначено як 3233, команда MOV завантажить в AX це значення в зворотній послідовності 3233. Тому необхідно виконувати команду XCHG, яка міняє байти місцями.

 

Таблиці з рангуванням.

Характерним прикладом таблиці з рангова ними значеннями є обчислення по доходного податку, яка містить розмір прибутків, процент податку і поправочний коефіцієнт:

Розмір прибутків Процент податку Поправочний коефіцієнт

0 – 1000.0 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.

 

Для організації пошуку в такій таблиці програма порівнює прибуток платника податків з табличними значеннями прибутку починаючи з найменшого:

- якщо менше або рівне, то використовується вибрані значення проценту і коефіцієнта.

- якщо більше, то перейти до наступного елемента таблиці.

Розмір податку розраховується як:

(Прибуток х % податку)/100–Поправочний коефіцієнт.

 

Табличний пошук з використанням порівняння рядків.

Якщо елемент таблиці перевищує довжину в два байти, то для операції порівняння використовується команда REPE CMPS. Припустимо, що таблиця інвентаризаційних номерів має виділених 3 байти під номер.

Визначимо таблицю інвентаризаційних номерів і найменувань як STOKTAB, а заданий елемент, як STOKNIN. Для індикації закінчення таблиці при пошуку включимо останній елемент `999`.

Програма пошуку порівнює вміст кожного значення таблиці з полем STOKNIN:

Елемент таблиці STOKNIN Результат пошуку

035 123 Менше: провірити наступний елемент.

038 123 Менше: провірити наступний елемент.

049 123 Менше: провірити наступний елемент.

102 123 Менше: провірити наступний елемент.

123 123 Дорівнює: елемент знайдено

 

Приклад.

 

Page 60,132.

TITLE TABSRCH (COM) Табличний пошук з CMPS

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

 

MAIN PROC NEAR

CLD

LEA Si, STOLTAB ; Занесення в Si поч. адресу таблиці.

A20:

MOV CX,03 ;Порівняння 3 байт

LEA Di, STOKNIN ;Адрес заданого номера

REPE CMPSB ;Порівняння

JE A30 ;Якщо рівне перейти на A30.

JA A40 ;Якщо більше – нема е таблиці (перехід на A40)

ADD Si,CX ;Додати СХ до адреси в Si

ADD Si,000A ;Повторення процедури.

A30:

MOV CX,05

LEA Di,DESCRN

REP MOV SV

RET

A40:

CAL R10ERR

RET

MAIN ENDPR

R10ERR PROC

;<Вивід повідомлення про відсутність елемента>

RET

R10ERR ENDPR

CODESG ENDS

END BEGIN.

 

Дані в сегменті даних розміщені з наступними зміщеннями:

 

Дані:123| 035 Excavators| 038 Lifters| 049 Presses| ….

| | | | | | |

00 03 06 16 19 29 32

 

Команда CMPSB порівнює байти послідовно. Якщо перші байти рівні, то вона переходить до порівняння наступних, інакше припиняється.

Порівняння з першим елементом таблиці завершується на першому байті, після чого Si міститься 04, в Di – 01, CX – 02. Для наступного порівняння регістр SI повинен містити значення 16, а регістр Di – 00. Збільшення адреси наступного елемента таблиці залежить від того на якому байті припинилося порівняння. В регістрі СХ міститься число байт , які не брали участі в порівнянні, в даному випадку 02. Таким чином адрес наступного елемента таблиці визначається додаванням Si + CX + довжина найменування (000А).

В таблицях з елементами змінної довжини, кожен елемент може завершуватися спеціальним символом – обмежувачем, наприклад 00; кінець таблиці можна позначити обмежувачем FF. Втаких випадках необхідно забезпечити відсутність всередині елементів таблиці значень, що відповідають обмежувачем. Для пошуку обмежувчів можна використати команду SCAS.

 

Транслюючf команда XLAT.

Команда XLAT переміщає байт з таблиці в память за адресою BX зі зміщеням відносно початку таблиці рівним AL.

В наступному прикладі відбувається перетворення цифр від 0 до 9 з ASCII коду в код EBCDIC, а всіх інших символів ASCII в пробіли (40h) в коді EBCDIC.

Цифрам 0 і 9 в ASCII кодах відповідають коди в шістнадцятковому представлені 30 – 39, а в EBCDIC – F0 – F9. Для використання команди XLAT необхідно визначити таблицю перекодування, яка враховує всі 256 можливих символів з кодами EBCDIC в ASCII – позиціях.

 

XLTBL DB 47 DUP (40h) ;Пробіли EBCDIC

DB F0h, F1h, F2h,… F9h, ;Цифри 0 – 9 в EBCDIC

DB 199 DUP (40h) ;Пробіли EBCDIC

 

Наступні команди виконують підготовку і трансляцію байта:

 

LEA BX, XLTBL

MOV AL, ASCNO

XLAT

Якщо поле ASCNO містить 00, то адрес байта 9 таблиці буде рівний XLTBL + 00 і команда XLAT замінить 00 на 40 h з таблиці. Якщо поле ASCNO містить 32h, то адрес відповідного байту в таблиці буде XLTBL + 50, який містить значення F2h (2 в коді EBCDIC).

 

Оператори типу, довжини і розміру.

При програмуванні на асемблері з використанням таблиць використовується 3 команди:

TYPE (типу), LENGTH (довжина) і SIZE (розмір).

При визначені таблиці з 10 слів:

 

TABLEXDW 10DUP(?) ; Таблиця з 10 символів.

 

Програма може використовувати TYPE для визначення типу (DW в даному випадку), оператор LENGTH – для визначення DUP – фактора (10) і оператор SIZE – для визначення числа байтів (10 ´ 2 = 20).

Приклад

MOV AX, TYPE TABLEX ; AX=0002

MOV BX, LENGTH TABLEX ; BX=000A (10)

MOV CX, SIZE TABLEX ; CX=0014 (20)

 








Дата добавления: 2015-10-09; просмотров: 593;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.021 сек.