МЕТОДИЧЕСКИЕ УКАЗАНИЯ. Предположим, что пользователь ввел номермесяца-03ипрограмма должна преобразовать этот номер в алфавитное значение March
Предположим, что пользователь ввел номермесяца-03ипрограмма должна преобразовать этот номер в алфавитное значение March. Программа для выполнения такого преобразования включает определениетаблицыалфавитных названий месяцев, имеющих одинаковую длину. Так как самое длинное название - September, то таблица имеет следующий вид: MONTBLDB '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. page60, 132 TITLEDIRECT(COM) Прямой табличный доступ CODESGSEGMENT PARA 'Code' ASSUMECS: CODESG, DS: CODESG, ES: CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ------------------------------------------------ THREE DB3 MONIN DB'11' ALFMONDB'??? ', '$' MONTABDB'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN' DB'JUL', 'AUG', 'SEP', 'OKT', 'NOV', 'DEC' ; ------------------------------------------------ MAINPROCNEAR; Основная процедура CALLC10CONV; Получить двоичное значение CALLD10LOC; Выделить месяц из таблицы CALLF10DISP; Выдать месяц на экран RET MAINENDP ; Перевод ASCII в двоичное представление: ; -------------------------------------- C10CONVPROC MOVAH, MONIN; Загрузить номер месяца MOVAL, MONIN+1 XORAX, 3030H; Удалить ASCII тройки CMPAH, 00; Месяц 01-09? JZC20; да - обойти SUBAH, AH; нет - очистить AH, ADDAL, 10; и перевести в двоичное C20RET C10CONVENDP ; Выделение месяца из таблицы: ; --------------------------- D10LOCPROC LEASI, MONTAB DECAL; Коррекция для таблицы MULTHREE; Умножить AL на 3 ADDSI, AX MOVCX, 03; Трехсимвольная пересылка CLD LEADI, ALFMON REPMOVSB; Переслать 3 символа RET D10LOCENDP ; Вывод на экран симв.месяца: ; -------------------------- F10DISP PROC LEA DX, ALFMON MOV AH, 09 INT 21H RET F10DISP ENDP CODESGENDS ENDBEGIN Рис. 8.1. Прямая табличная адресация. На рис. 8.1 приведен пример прямого доступа к таблице названий месяцев. Для краткости в программе используются вместодевятисимвольных названий - трехсимвольные. Введенный номер месяца определен в поле MONIN. Предположим, что некоторая подпрограмма формирует запроснавводномера месяца в ASCII-формате в поле MONIN. Описанная техника работыс таблицей называется прямым табличным доступом.Поскольку данный алгоритмнепосредственно вычисляет адрес необходимого элемента в таблице, то в программе не требуетсявыполнять операции поиска. Хотя прямая табличная адресация очень эффективна, она возможна только припоследовательнойорганизации.Тоестьможноиспользовать такие таблицы, если элементы располагаются в регулярной последовательности: 1, 2, 3,... или 106, 107, 108,... или даже5, 10, 15.Однако, невсегда таблицы построенытакимобразом.Вследующемразделерассматриваются таблицы, имеющие нерегулярную организацию. TITLE TABSRCH (COM) Табличный поиск CODESGSEGMENT PARA 'Code' ASSUMECS: 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 ' DESCRN10DUP(?) ; ----------------------------------------------- MAINPROCNEAR MOVAX, STOKNIN; Загрузитьномерэлемента XCHGAL, AH MOVCX, 06; Число элементов в таблице LEASI, STOKTAB; Начальный адрес таблицы A20: CMPAX, [SI]; Сравнить элементы JEA30; Если равны - выйти, ADDSI, 12; нет - следующий элемент LOOPA20 CALLR10ERR; Элемент в таблице не найден RET A30: MOVCX, 05; Длина описания элемента LEADI, DESCRN; Адрес описания элемента INCSI INCSI; Выделить описание REPMOVSW; изтаблицы RET MAINENDP R10ERRPROC ; < Вывод сообщения об ошибке> RET R10ERRENDP CODESGENDS END BEGIN Рис. 8.2. Табличный поиск СОДЕРЖАНИЕ РАБОТЫ Отладить примеры и убедиться в их работоспособности ВОПРОСЫ ВЫХОДНОГО КОНТРОЛЯ 1. Как в ассемблере задается таблица? 2. Перечислите способы адресации?
|