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; просмотров: 598;