Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Таблицы с уникальными элементами
Инвентарные номера большинства фирм часто не имеют последовательного порядка. Номера, обычно, группируются по категориям, первые цифры указывают на мебель или приборы, или номер отдела. Кроме того, время от времени номера удаляются, а новые добавляются. В таблице необходимо связать инвентарные номера и их конкретные наименования (и, если требуется, включить стоимость). Инвентарные номера и наименования могут быть определены в различных таблицах, например: STOKNOS DB '101', '107', '109',... STOKDCR DB 'Excavators', 'Processors', 'Assemblers',... или в одной таблице, например: STOKTAB DB '101', 'Excavators' DB '107', 'Processors' Таблицы с ранжированием Подоходный налог дает характерный пример таблицы с ранжированными значениями. Представим себе таблицу, содержащую размеры доходов oблагаемых налогами, процент налога и поправочный коэффициент: В налоговой таблице процент увеличивается в соответствии с увеличением налогооблагаемого дохода. Элементы таблицы доходов содержат максимальные величины для каждого шага: TAXTBL DD 100000, 250000, 425000, 600000, 999999 Для организации поиска в такой таблице, программа сравнивает доxод налогоплательщика с табличным значением дохода: u если меньше или равно, то использовать соответствующий процент и поправку; u если больше, то перейти к следующему элементу таблицы. Таблицы с элементами переменной длины Существуют таблицы, в которых элементы имеют переменную длину. Каждый элемент такой таблицы может завершаться специальным символом ограничителем, например, шест.00; конец таблицы можно обозначить огpаничителем шест.FF. В этом случае необходимо гарантировать, чтобы внутри элементов таблицы не встречались указанные ограничители. Помните, что двоичные числа могут выражаться любыми битовыми комбинациями. Для поиска можно использовать команду SCAS. Транслирующая команда XLAT Команда XLAT транслирует содержимое одного байта в другое предопределенное значение. С помощью команды XLAT можно проверить корректность содержимого элементов данных. При передаче данных между персональным компьютером и ЕС ЭВМ (IBM) с помощью команды XLAT можно выполнить перекодировку данных между форматами ASCII и EBCDIC. В следующем примере происходит преобразование цифр от 0 до 9 из кода ASCII в код EBCDIC. Так как представление цифр в ASCII выглядит как шест.30-39, а в EBCDIC — шест.F0-F9, то замену можно выполнить командой OR. Однако, дополнительно преобразуем все остальные коды ASCII в пробел (шест.40) в коде EBCDIC. Для команды XLAT необходимо определить таблицу перекодировки, которая учитывает все 256 возможных символов, с кодами EBCDIC в ASCII позициях: XLTBL DB 47 DUP(40H); Пробелы в коде EBCDIC DB 0F0H, 0F1H, 0F2H, 0F3H,..., 0F9H; 0-9 (EBCDIC) DB 199 DUP(40H); Пробелы в коде EBCDIC
Команда XLAT предполагает адрес таблицы в регистре BX, а транслируемый байт (например, поля ASCNO) в регистре AL. Следующие команды выполняют подготовку и трансляцию байта: LEA BX, XLTBL MOV AL, ASCNO XLAT Команда XLAT использует значение в регистре AL в качестве относительного aдреса в таблице, то есть, складывает адрес в BX и смещение в AL. В случае, если, например, ASCNO содержит 00, то адрес байта в таблице будет XLTBL+00 и команда XLAT заменит 00 на шест.40 из таблицы. В случае, если поле ASCNO cодержит шест.32, то адрес соответствующего байта в таблице будет XLTBL+50. Этот байт содержит шест.F2 (2 в коде EBCDIC), который команда XLAT загружает в регистр AL. Операторы типа, длина и размеры Ассемблер содержит ряд специальных операторов, которые могут оказаться полезными при программировании. Например, при изменении длины таблицы придется модифицировать программу (для нового определения таблицы) и процедуры, проверяющие конец таблицы. В этом случае использование операторов TYPE (тип), LENGTH (длина) и SIZE (размер) позволяют уменьшить число модифицируемых команд. Рассмотрим определение следующей таблицы из десяти слов: TABLEX DW 10 DUP(? ); Таблица из 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) Значения LENGTH и SIZE можно использовать для окончания табличного поиска или сортировки. Например, если регистр SI содержит продвинутый адрес таблицы при осуществлении поиска, то проверка на конец таблицы может быть следующий: CMP SI, SIZE TABLEX Важно: u Для большинства применений, определяйте таблицы, имеющие родственные элементы одной длины и формата данных. u Стройте таблицы на основе форматов данных. Например, элементы могут быть символьные или числовые длиной один, два и более байтов каждый. Может оказаться более практичным определение двух таблиц: одна, например, для трехсимвольных значений номеpов, а другая для двухбайтовых значений цен единиц товара. В процессе поиска адрес элементов таблицы номеров должен увеличиваться на 3, а адрес элементов таблицы цен — на 2. В случае, если сохранить число выполненных циклов при поиске на равно, то, умножив это число на 2 (SHL сдвиг влево на один бит), получим относительный адрес искомого значения цены. (Начальное значение счетчика циклов должно быть равно -1). u Помните, что DB позволяет определять значения, не превышающие 256, а DW записывает байты в обратной последовательности. Команды CMP и CMPSW предполагают, что байты в сравниваемых словах имеют обратную последовательность. u В случае, если таблица подвергается частым изменениям, или должна быть доступна нескольким программам, то запишите ее на диск. Для внесения изменений в таблицу можно разработать специальную программу модификации. Любые программы могут загружать таблицу с диска и при обновлениях таблицы сами программы не нуждаются в изменениях. u Будьте особенно внимательны при кодировке сортирующих программ. Пользуйтесь трассировкой для тестирования, так как малейшая ошибка может привести к непредсказуемым результатам. Лекция 7. Команда прерывания INT Ранее мы имели дело с программами, в которых данные oпределялись в операндах команд (непосредственные данные) или инициализировались в конкретных полях программы. Число практических применений таких программ в действительности мало. Большинcтво программ требуют ввода данных с клавиатуры, диска или модема и обеспечивают вывод данных в удобном формате на экран, принтер или диск. Данные, предназначенные для вывода на экран и ввода с клавиатуры, имеют ASCII формат. Для выполнения ввода и вывода используется команда INT (прерывание). Существуют различные требования для указания системе какое действие (ввод или вывод) и на каком устройстве необходимо выполнить. Все необходимые экранные и клавиатурные операции можно выполнить используя команду INT 10H, которая передает управление непосредственно в BIOS. Для выполнения некоторых более сложных операций существует прерывание более высокого уровня INT 21H, которое сначала передает управление в DOS. Например, при вводе с клавиатуры может потребоваться подсчет введенных символов, проверку на максимальное число символов и проверку на символ Enter. Преpывание DOS INT 21H выполняет многие из этих дополнительных вычислений и затем автоматически передает управление в BIOS. Команда INT прерывает обработку программы, передает управление в DOS или BIOS для определенного действия и затем возвращает управление в прерванную программу для продолжения обработки. Наиболее часто прерывание используется для выполнения операций ввода или вывода. Для выхода из программы на обработку прерывания и для последующего возврата команда INT выполняет следующие действия: u уменьшает указатель стека на 2 и заносит в вершину стека содержимое флагового регистра; u очищает флаги TF и IF; u уменьшает указатель стека на 2 и заносит содержимое регистра CS в стек; u уменьшает указатель стека на 2 и заносит в стек значение командного указателя; u обеспечивает выполнение необходимых действий; u восстанавливает из стека значение регистра и возвращает управление в прерванную программу на команду, следующую после INT. Этот процесс выполняется полностью автоматически. Необходимо лишь определить сегмент стека достаточно большим для записи в него значений регистров. Установка курсора Экран можно представить в виде двумерного пространства с адресуемыми позициями в любую из которых может быть установлен курсор. Обычный видеомонитор, например, имеет 25 строк (нумеруемых от 0 до 24) и 80 столбцов (нумеруемых от 0 до 79). Команда INT 10H включает в себя установку курсора в любую позицию и очистку экрана. Ниже приведен пример установки курсора на MOV AH, 02; Запрос на установку курсора MOV BH, 00; Экран 0 MOV DH, 05; Строка 05 MOV DL, 12; Столбец 12 INT 10H; Передача управления в BIOS
Значение 02 в регистре AH указывает команде INT 10H на выполнение операции установки курсора. Значение строки и столбца должны быть в регистре DX, а номер экрана (или страницы) в регистре BH (обычно 0). Содержимое других регистров несущественно. Для установки строки и столбца можно также использовать одну команду MOV c непосредственным шест. значением: MOV DX, 050CH; Строка 5, столбец 12 Очистка экрана Запросы и команды остаются на экране пока не будут смещены в результате прокручивания («скроллинга») или переписаны на этом же месте другими запросами или командами. Когда программа начинает cвое выполнение, экран может быть очищен. Очищаемая область экрана может начинаться в любой позиции и заканчиваться в любой другой позиции с большим номером. Начальное значение строки и столбца заносится в регистр DX, значение 07 — в регистр BH и 0600H в AX. В следующем примере выполняется очистка всего экрана: MOV AX, 0600H; AH 06 (прокрутка); AL 00 (весь экран) MOV BH, 07; Нормальный атрибут (черно/белый) MOV CX, 0000; Верхняя левая позиция MOV DX, 184FH; Нижняя правая позиция INT 10H; Передача управления в BIOS Значение 06 в регистре AH указывает команде INT 10H на выполнение операции очистки экрана. Эта операция очищает экран пробелами. В случае, если вы по ошибке установили нижнюю правую позицию больше, чем шест. 184F, то очистка перейдет вновь к началу экрана и вторично заполнит некоторые позиции пробелами. Популярное:
|
Последнее изменение этой страницы: 2017-03-08; Просмотров: 693; Нарушение авторского права страницы