ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


ГЛАВА 23. Прерывания BIOS и DOS

------------------------------------------------------------ Прерывания BIOS и DOS Цель: Описать функции, доступные через прерывания BIOS иDOS. ВВЕДЕНИЕ------------------------------------------------------------ Прерывание представляет собой операцию, которая приостанавливает выполнение программ для специальных системныхдействий. Необходимость прерываний обусловлено двумяосновными причинами: преднамеренный запрос таких действий,как операции ввода-вывода на различные устройства инепредвиденные программные ошибки (например, переполнениепри делении). Система BIOS (Basic Input/Output System) находится в ROMи управляет всеми прерываниями в системе. В предыдущихглавах уже использовались некоторые прерывания для вывода наэкран дисковых операций ввода-вывода и печати. В этой главеописаны различные BIOS- и DOS-прерывания, резидентныепрограммы и команды IN и OUT. ОБСЛУЖИВАНИЕ ПРЕРЫВАНИЙ------------------------------------------------------------ В компьютерах IBM PC ROM находится по адресу FFFF0H. Привключении компьютера процессор устанавливает состояниесброса, выполняет контроль четности, устанавливает врегистре CS значение FFFFH, а в регистре IP - нуль. Перваявыполняемая команда поэтому находится по адресу FFFF:0 илиFFFF0, что является точкой входа в BIOS. BIOS проверяетразличные порты компьютера для определения и инициализацииподключенных устрой ств. Затем BIOS создает в начале памяти(по адресу 0) таблицу прерываний, которая содержит адресаобработчиков прерываний, и выполняет две операции INT 11H(запрос списка присоединенного оборудования) и INT 12H(запрос размера физической памяти). Следующим шагом BIOS определяет имеется ли на диске илидискете операционная система DOS. Если обнаружена системнаядискета, то BIOS выполняет прерывание INT 19H для доступа кпервому сектору диска, содержащему блок начальной загрузки.Этот блок представляет собой программу, которая считываетсистемные файлы IBMBIO.COM, IBMDOS.COM и COMMAND.COM с дискав память. После этого память имеет следующее распределение: Таблица векторов прерываний Данные BIOS IBMBIO.COM и IBMDOS.COM Резидентная часть COMMAND.COM Ассемблер для IBM PC. Глава 23 56 Доступная память для прикладных программ Транзитная часть COMMAND.COM Конец RAM (ОЗУ) ROM BASIC ROM BIOS Внешние устройства передают сигнал внимания через контактINTR в процессор. Процессор реагирует на этот запрос, еслифлаг прерывания IF установлен в 1 (прерывание разрешено), и(в большинстве случаев) игнорирует запрос, если флаг IFустановлен в 0 (прерывание запрещено). Операнд в команде прерывания, например, INT 12H, содержиттип прерывания, который идентифицирует запрос. Для каждоготипа система содержит адрес в таблице векторов прерываний,начинающейся по адресу 0000. Так как в таблице имеется 256четырехбайтовых элементов, то она занимает первые 1024байта памяти от шест.0 до шест.3FF. Каждый элемент таблицыуказывает на подпрограмму обработки указанного типапрерывания и содержит адрес кодового сегмента и смещение,которые при прерывании устанавливаются в регистры CS и IPсоответственно. Список элементов таблицы векторов прерыванийприведен на рис. 23.1. Прерывание заносит в стек содержимое флагового регистра,регистра CS и регистра IP. Например, для прерывания 12H(которое возвращает в регистре AX размер памяти) адресэлемента таблицы равен шест.0048 (шест.12 х 4 = шест.48).Операция выделяет четырехбайтовый элемент по адресу шест.0048 и заносит два байта в регистр IP и два байта в регистрSS. Адрес, который получается в регистровой паре CS:IP,представляет собой адрес начала подпрограммы в области BIOS,которая получает управление. Возврат из этой подпрограммыосуществляется командой IRET (Interrupt Return), котораявосстанавливает флаги и регистры CS и IP из стека ипередает управление на команду, следующую за выполненнойкомандой прерывания. ПРЕРЫВАНИЯ BIOS------------------------------------------------------------ В данном разделе представлены основные прерывания BIOS. INT 05H (Печать экрана). Приводит к передаче содержимогоэкрана на печатающее устройство. INT 05H применяется длявнутренних целей, т.е. из программ, клавиши Ctrl/PrtScактивизируют печать с клавиатуры. Данная операция маскируетпрерывания и сохраняет позицию курсора. ------------------------------------------------------------ Адрес Функция прерыаний (шест) (шест) 0-3 0 Деление на нуль 4-7 1 Пошаговый режим (трассировка DEBUG) Ассемблер для IBM PC. Глава 23 57 8-B 2 Немаскированное прерывание (NMI) C-F 3 Точка останова (используется в DEBUG) 10-13 4 Переполнение регистра 14-17 5 Печать экрана 18-1F 6,7 Зарезервировано 20-23 8 Сигнал от траймера 24-27 9 Сигнал от клавиатуры 28-37 A,B,C,D Используются в компьютерах AT 38-3B E Сигнал от дискетного дисковода 3C-3F F Используется для принтера 40-43 10 Управление дисплеем (см.гл. 8, 9, 10) 44-47 11 Запрос оборудования (см.гл.9) 48-4B 12 Запрос размера памяти (см.гл.2) 4C-4F 13 Дисковые операции ввода-вывода (см.гл.18) 50-53 14 Управление коммуникационным адаптером 54-57 15 Кассетные операции и спец. функции AT 58-5B 16 Ввод с клавиатуры (см.гл.9) 5C-5F 17 Вывод на принтер (см.гл.19) 60-63 18 Обращение к BASIC, встроенному в ROM 64-67 19 Перезапуск системы 68-6B 1A Запрос и установка времени и даты 6C-6F 1B Прерывание от клавиатуры 70-73 1C Прерывание от таймера 74-77 1D Адрес таблицы параметров дисплея 78-7B 1E Адрес таблицы параметров дисковода 7C-7F 1F Адрес таблицы графических символов 80-83 20 Нормальное завершение программы (DOS) 84-87 21 Обращение к функциям DOS 88-8B 22 Адрес обработки завершения задачи (DOS) 8C-8F 23 Адрес реакции по Ctrl/Break (DOS) 90-93 24 Адрес реакции на фатальную ошибку (DOS) 94-97 25 Абсолютное чтение с диска (DOS) 98-9B 26 Абсолютная запись на диск (DOS) 97-9F 27 Создание резидентной программы (DOS) AO-FF 28-3F Другие функции DOS 100-1FF 40-7F Зарезервировано 200-217 80-85 Зарезервировано для BASIC 218-3C3 86-F0 Используются BASIC-интерпретатором 3C4-3FF F1-FF Зарезервировано Примечание: Прерывания 00-1F относятся к BIOS, прерывания 20-FF относятся к DOS и BASIC. ------------------------------------------------------------ Рис.23.1. Таблица адресов прерываний. ПРЕРЫВАНИЯ BIOS------------------------------------------------------------ В данном разделе приведены основные прерывания BIOS. Ассемблер для IBM PC. Глава 23 58 INT 05H Печать экрана. Выполняет вывод содержимого экранана печатающее устройство. Команда INT 05H выполняет даннуюоперацию из программы, а нажатие клавишей Ctrl/PrtSc - склавиатуры. Операция запрещает прерывания и сохраняетпозицию курсора. INT 10H Управление дисплеем. Обеспечивает экранные и клавиатурные операции, детельно описанные в главе 9. INT 11H Запрос списка присоединенного оборудования. Определяет наличие различных устройств в системе, результирующеезначение возвращает в регистре AX. При включении компьютерасистема выполняет эту операцию и сохраняет содержимое AX впамяти по адресу шест.410. Значения битов в регистре AX: Бит Устройство 15,14 Число подключенных принтеров 13 Последовательный принтер 12 Игровой адаптер 11-9 Число последовательных адаптеров стыка RS232 7,6 Число дискетных дисководов, при бите 0=1: 00=1, 01=2, 10=3 и 11=4 5,4 Начальный видео режим: 00 = неиспользуется 01 = 40х25 плюс цвет 10 = 80х25 плюс цвет 11 = 80х25 черно-белый режим 1 Значение 1 говорит о наличии сопроцессора 0 Значение 1 говорит о наличии одного или более дисковых устройств и загрузка операционной системы должна осуществляться с диска INT 12H Запрос размера физической памяти. Возвращает врегистре AX размер памяти в килобайтах, например, шест.200соответствует памяти в 512 К. Данная операция полезна длявыравнивания размера программы в соответствии с доступнойпамятью. INT 13H Дисковые операции ввода-вывода. Обеспечивает операции ввода-вывода для дискет и винчестера, рассмотренные вглаве 16. INT 14H Управление коммуникационным адаптером. Обеспечивает последовательный ввод-вывод через коммуникационный портRS232. Регистр DX должен содержать номер (0 или 1) адаптерастыка RS232. Четыре типа операции, определяемые регистромAH, выполняют прием и передачу символов и возвращают врегистре AX байт состояния коммуникационного порта. INT 15H Кассетные операции ввода-вывода и специальныефункции для компьютеров AT. Обеспечивает операции ввода-вывода для касетного магнитофона, а также расширенныеоперации для компьютеров AT. Ассемблер для IBM PC. Глава 23 59 INT 16H Ввод с клавиатуры. Обеспечивает три типа командввода с клавиатуры, подробно описанные в главе 9. INT 17H Вывод на принтер. Обеспечивает вывод данных на печатающее устройство. Подробно рассмотрено в главе 19. INT 18H Обращение к BASIC, встроенному в ROM. ВызываетBASIC-интерпретатор, находящийся в постоянной памяти ROM. INT 19H Перезапуск системы. Данная операция при доступномдиске считывает сектор 1 с дорожки 0 в область начальнойзагрузки в памяти (сегмент 0, смещение 7C00) и передаетуправление по этому адресу. Если дисковод не доступен, тооперация передает управление через INT 18H в ROM BASIC.Данная операция не очищает экран и не инициализирует данныев ROM BASIC, поэтому ее можно использовать из программы. INT 1AH Запрос и установка текущего времени и даты. Считывает и записывает показание часов в соответствии созначением в регистре AH. Для определения продолжительностивыполнения программы можно перед началом выполненияустановить часы в 0, а после считать текущее время. Отсчетвремени идет примерно 18,2 раза в секунду. Значение врегистре AH соответствует следующим операциям: AH=00 Запрос времени. В регистре CX устанавливается старшая часть значения, а в регистре DX - младшая. Если послепоследнего запроса прошло 24 часа, то в регистре AL будет ненулевое значение. AH=01 Установка времени. Время устанавливается по регистрам CX (старшая часть значения) и DX (младшая часть значения). Коды 02 и 06 управляют временем и датой для AT. INT 1FH Адрес таблицы графических символов. В графическомрежиме имеется доступ к символам с кодами 128-255 в 1Ктаблице, содержащей по восемь байт на каждый символ. Прямойдоступ в графическом режиме обеспечивается только к первым128 ASCII-символам (от 0 до 127). ПРЕРЫВАНИЯ DOS------------------------------------------------------------ Во время своей работы BIOS использует два модуля DOS:IBMBIO.COM и IBMDOS.COM. Так как модули DOS обеспечиваютбольшое количество разных дополнительных проверок, тооперация DOS обычно проще в использовании и менее машиннозависимы, чем их BIOS аналоги. Модуль IBMBIO.COM обеспечивает интерфейс с BIOS низкогоуровня. Эта программа выполняет управление вводом-выводомпри чтении данных из внешних устройств в память и записи изпамяти на внешние устройства. Ассемблер для IBM PC. Глава 23 60 Модуль IBMDOS.COM содержит средства управления файлами иряд сервисных функций, таких как блокирование и деблокирование записей. Когда пользовательская программа выдаетзапрос INT 21H, то в программу IBMDOS через регистрыпередается определенная информация. Затем программа IBMDOSтранслирует эту информацию в один или несколько вызововIBMBIO, которая в свою очередь вызывает BIOS. Указанныесвязи приведены на следующей схеме: Пользовательский Высший Низший ROM Внешний уровень уровень уровень уровень +-----------+ +----------+ +----------+ |Программный| | DOS | | DOS | +----+ +----------+ |запрос в/в ||IBMDOS.COM||IBMBIO.COM||BIOS||Устройство| +-----------+ +----------+ +----------+ +----+ +----------+ Как показано выше, прерывания от шест.20 до шест.62зарезервированы для операций DOS. Ниже приведены наиболееосновные из них: INT 20H Завершение программы. Запрос завершает выполнениепрограммы и передает управление в DOS. Данный запрос обычнонаходится в основной процедуре. INT 21H Запрос функций DOS. Основная операция DOS, вызывающая определенную функцию в соответствии с кодом в регистреAH. Назначение функций DOS описано в следующем разделе. INT 22H Адрес подпрограммы обработки завершения задачи.(см.INT 24H). INT 23H Адрес подпрограммы реакции на Ctrl/Break. (см.INT24H). INT 24H Адрес подпрограммы реакции на фатальную ошибку. Вэтом элементе и в двух предыдущих содержатся адреса, которыеинициализируются системой в префиксе программного сегментаи, которые можно изменить для своих целей. Подробности приведены в техническом описании DOS. INT 25H Абсолютное чтение с диска. См.гл.17. INT 26H Абсолютная запись на диск. См.гл.17. INT 27H Завершение программы, оставляющее ее резедентной.Позволяет сохранить COM-программу в памяти. Подробно даннаяоперация рассмотренна в последующем разделе "Резиденныепрогарммы". ФУНКЦИИ ПРЕРЫВАНИЯ DOS INT 21H------------------------------------------------------------ Ассемблер для IBM PC. Глава 23 61 Ниже приведены базовые функции для прерывания DOS INT21H. Код функции устанавливается в регистре AH: 00 Завершение программы (аналогично INT 20H). 01 Ввод символа с клавиатуры с эхом на экран. 02 Вывод символа на экран. 03 Ввод символа из асинх. коммуникационного канала. 04 Вывод символа на асинх. коммуникационный канал. Ассемблер для IBM PC. Приложения 1 ПРИЛОЖЕНИЕ 1----------------------------------------------------------- Коды ASCII-символов Ниже представлены первые 128 символов ASCII-кода. В руководстве по языку BASIC приведены остальные 128 символов. Напомним, что шест.20 представляет стандартный символ пробела. ПРИЛОЖЕНИЕ 2------------------------------------------------------------ Шестнадцатерично-десятичные преобразования В данном приложении представлены приемы преобразованиямежду шестнадцатеричным и десятичным форматами. В первомразделе показан пример преобразования шест. A7B8 вдесятичное 42936, а во втором - 42936 обратно в шест. A7B8. Преобразование шестнадцатеричного формата в десятичный --------------------------------------------------------- Для перевода шест. A7B8 в десятичное число необходимопоследовательно, начиная с самой левой шест. цифры (A),умножать на 16 и складывать со следующей цифрой. Так какоперации выполняются в десятичном формате, то шест. числа отA до F необходимо преобразовать в десятичные от 10 до 15. Первая цифра: A (10) 10 Умножить на 16 *16 160 Прибавить следующую цифру, 7 7 167 Умножить на 16 *16 2672 Прибавить следующую цифру, B (11) 11 2683 Умножить на 16 *16 42928 Прибавить следующую цифру, 8 8 Десятичное значение 42936 Можно использовать также таблицу преобразования. Дляшест. числа A7B8 представим правую цифру (8) как позицию 1,следующую влево цифру (B) как позицию 2, следующую цифру (7)как позицию 3 и самую левую цифру (A) как позицию 4. Изтаблицы B-1 выберем значения для каждой шест. цифры: Для позиции 1 (8), столбец 1 8 Для позиции 1 (8), столбец 1 176 Для позиции 1 (8), столбец 1 1792 Для позиции 1 (8), столбец 1 40960 Ассемблер для IBM PC. Приложения 2 Десятичное значение 42936 Преобразование десятичного формата в шестнадцатеричный --------------------------------------------------------- Для преобразования десятичного числа 42936 в шестнадцатеричный формат необходимо сначала исходное число 42936разделить на 16; число, получившееся в остатке, (6) являетсямладшей шестнадцатеричной цифрой. Затем полученное частноенеобходимо снова разделить на 16 и полученный остаток (11или B) дает следующую влево шестнадцатеричную цифру. Продолжая таким образом деления до тех пор, пока в частном неполучится 0, получим из остатков все необходимые шестнадцатеричные цифры. Частное Остаток Шест. 42936 / 16 2683 8 8 (младшая цифра) 2683 / 16 167 11 B 167 / 16 10 7 7 10 / 16 0 10 A (старшая цифра) Для преобразования чисел из десятичного формата в шестнадцатеричный можно также воспользоваться таблицей B-1. Длядесятичного числа 42936 необходимо найти в таблице числоравное или ближайшее меньшее исходному, и записать соответствующую шестнадцатеричную цифру и ее позицию. Затемследует вычесть найденное десятичное число из 42936 и с полученной разностью проделать проделать ту же операцию: Дес. Шест. Исходное десятичное число 42936 Вычесть ближайшее меньшее 40960 A000 Разность 1976 Вычесть ближайшее меньшее 1792 700 Разность 184 Вычесть ближайшее меньшее 176 B0 Разность 8 8 Результирующее шест. число 7 A7B8 ПРИЛОЖЕНИЕ 3------------------------------------------------------------ Зарезервированные слова Большинство из следующих зарезервированных слов при использовании их для определении элементов данных могут привести к ошибкам ассемблирования (в ряде случаев - к весьмагрубым): Имена регистров AH BH CH DH CS SS BP AL BL CL DL DS SI SP Ассемблер для IBM PC. Приложения 3 AX BX CX DX ES DI Мнемокоды AAA DIV JLE JS OR SBB AAD ESC JMP JZ OUT SCAS AAM HLT JNA LAHF POP SHL AAS IDIV JNAE LDS POPF SHR ADC IMUL JNB LEA PUSH STC ADD IN JNBE LES PUSHF STD AND INC JNE LOCK RCL STI CALL INT JNG LODS RCR STOS CBW INTO JNGE LOOP REP SUB CLC IRET JNL LOOPE REPE TEST CLD JA JNLE LOOPNE REPNE WAIT CLI JAE JNO LOOPNZ REPNZ XCHG CMC JB JNP LOOPZ REPZ XLAT CMP JBE JNS MOV RET XOR CMPS JCXZ JNZ MOVS ROL CWD JE JO MUL ROR DAA JG JP NEG SAHF DAS JGE JPE NOP SAL DEC JL JPO NOT SAR Директивы ассемблера ASSUME END EXTRN IFNB LOCAL PURGECOMMENT ENDIF GROUP IFNDEF MACRO RECORDDB ENDM IF IF1 NAME REPTDD ENDP IFB IF2 ORG SEGMENTDQ ENDS IFDEF INCLUDE OUT STRUCDT EQU IFDIF IRP PAGE SUBTTLDW EVEN IFE IRPC PROC TITLEELSE EXITM IFIDN LABEL PUBLIC Прочие элементы языка BYTE FAR LENGTH MOD PRT THISCOMMENT GE LINE NE SEG TYPECON GT LT NEAR SHORT WIDTHDUP HIGH LOW NOTHING SIZE WORDEQ LE MASK OFFSET STACK Ассемблер для IBM PC. Программы. 9 Двоич. Дес. Шест. Двоич. Дес. Шест. 0000 0 0 1000 8 80001 1 1 1001 9 90010 2 2 1010 10 A0011 3 3 1011 11 B0100 4 4 1100 12 C0101 5 5 1101 13 D0110 6 6 1110 14 E0111 7 7 1111 15 F +======================+ I D O S I I I +---------+ г - - - - - - - - - - - + SS | Адрес +------->I Сегмент стека I | + - - - - + I I | DS | Адрес +----+ г - - - - - - - - - - - | Переме- + - - - - + +-->I Сегмент данных I | щаемые CS | Адрес +---+ I I | в +---------+ | г - - - - - - - - - - - | памяти +--->I Сегмент кода I | Сегментные I I | регистры г - - - - - - - - - - - + I I I I I I I I +======================+ Память Ассемблер для IBM PC. Программы. 10 | ОУ: Операционное | ШИ: Шинный интерфейс устройство | | +--------+--------+ | | AH | AL | | +--------+--------+ | | BH | BL | | +--------+--------+ | | CH | CL | | +--------+--------+ | Управление | DH | DL | | программами +--------+--------+ | +-----------------+ | SP | | | CS | +-----------------+ | +-----------------+ | BP | | | DS | +-----------------+ | +-----------------+ | SI | | | SS | +-----------------+ | +-----------------+ | DI | | | ES | +-----------------+ | +-------+---------+ Л | | | | | +-------+ V | V | Управ-| Шина ======================ь==============>| ление |<==> 8088 Л | Л | шиной | | | | +-------+ V | | +-----------------+ | +---+---+ | АЛУ: Арифметико-| | +---+ 1 | Очередь | логическое | | | +-------+ команд | устройство | | | | 2 | (Четыре байта)+->+ - - - - - - - - + | | +-------+| | УУ: Устройство | | | | 3 || | управления | | | +-------+| + - - - - - - - - + | | | 4 || | Флаговый регистр| | | +-------+| +-----------------+ | || | || +-----------------+ | |+--+ Командный |<--+--+ | указатель | | +-----------------+ | | Ассемблер для IBM PC. Программы. 11 Начальный адрес Память Дес. Шест. +-----------------------------+ 0K 00000 | RAM 256K основная оператив- | | ная память | +-----------------------------+ 256K 40000 | RAM 384K расширение опера- | | тивной памяти в канале I/O | +-----------------------------+ 640K A0000 | RAM 128K графический/экран- | | ный видео буфер | +-----------------------------+ 768K C0000 | ROM 192K дополнительная | | постоянная память | +-----------------------------+ 960K F0000 | ROM 64K основная системная | | постоянная память | +-----------------------------+ Ассемблер для IBM PC. Программы. 12 D>DEBUG-E CS:100 B8 23 01 05 25 00-E CS:106 8B D8 03 D8 8B CB-E CS:10C 2B C8 2B C0 90 CB-RAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0100 NV UP EI PL NZ NA PO NC13C6:0100 B8230 MOV AX,0123-T AX=0123 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0103 NV UP EI PL NZ NA PO NC13C6:0103 052500 ADD AX,0025-T AX=0148 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0106 NV UP EI PL NZ NA PE NC13C6:0106 8BD8 MOV BX,AX-T AX=0148 BX=0148 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0108 NV UP EI PL NZ NA PO NC13C6:0108 03D8 ADD BX,AX-T AX=0148 BX=0290 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=010A NV UP EI PL NZ AC PO NC13C6:010A 8BCB MOV CX,BX-T AX=0148 BX=0290 CX=0290 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=010C NV UP EI PL NZ AC PO NC13C6:010C 2BC8 SUB CX,AX-T AX=0148 BX=0290 CX=0148 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0100 NV UP EI PL NZ AC PO NC13C6:010E 2BC0 SUB AX,AX-T AX=0000 BX=0290 CX=0148 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0110 NV UP EI PL ZR NA PO NC13C6:0110 90 NOP-T AX=0000 BX=0290 CX=0148 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0111 NV UP EI PL ZR NA PO NC13C6:0111 CB RETF- Ассемблер для IBM PC. Программы. 13 -D CS:10013C6:0100 B8 23 01 05 25 00 8B D8-03 D8 8B CB 2B C8 2B C0 .#..%.......+.+.13C6:0110 90 CB 8D 46 14 50 51 52-FF 76 28 E8 74 00 8B E5 ...F.PQR.v(.t...13C6:0120 B8 01 00 50 FF 76 32 FF-76 30 FF 76 2E FF 76 28 ...P.v2.v0.v..v(13C6:0130 E8 88 15 8B E5 BF 36 18-12 FF 36 16 12 8B 76 28 ......6...6...v(13C6:0140 FF 74 3A 89 46 06 E8 22-CE 8B E5 30 E4 3D 0A 00 .t:.F.."...0.=..13C6:0150 75 32 A1 16 12 2D 01 00-8B 1E 18 12 83 DB 00 53 u2...-.........S13C6:0160 50 8B 76 28 FF 74 3A A3-16 12 89 1E 18 12 E8 FA P.v(.t:.........13C6:0170 CD 8B E5 30 E4 3D 0D 00-74 0A 83 06 16 12 01 83 ...0.=..t.......-Q Ассемблер для IBM PC. Программы. 14 D>DEBUG-E DS:23 01 25 00 00-E DS:2A 2A 2A-E CS:100 A1 00 00 03 06 02 00-E CS:107 A3 04 00 CB-D DS:013C6:0000 23 01 25 00 00 9A 2A 2A-2A F0 F5 02 2C 10 2E 03 #.%...***...,...13C6:0010 2C 10 BD 02 2C 10 B1 0D-01 03 01 00 02 FF FF FF ,...,...........13C6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF EF 0F 64 00 ..............d.13C6:0030 61 13 14 00 18 00 C7 13-FF FF FF FF 00 00 00 00 a...............13C6:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................13C6:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........13C6:0060 20 20 20 20 20 20 20 20 00 00 00 00 00 20 20 20 .....13C6:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........-RAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0100 NV UP EI PL NZ NA PO NC13C6:0100 A10000 MOV AX,[0000] DS:0000=0123-T AX=0123 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0103 NV UP EI PL NZ NA PO NC13C6:0103 03060200 ADD AX,[0002] DS:0002=0025-T AX=0148 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0107 NV UP EI PL NZ NA PE NC13C6:0107 A30400 MOV [0004],AX DS:0004=9A00-T AX=0148 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0108 NV UP EI PL NZ NA PO NC13C6:010A CB RETF-D DS:013C6:0000 23 01 25 00 00 9A 2A 2A-2A F0 F5 02 2C 10 2E 03 #.%...***...,...13C6:0010 2C 10 BD 02 2C 10 B1 0D-01 03 01 00 02 FF FF FF ,...,...........13C6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF EF 0F 64 00 ..............d.13C6:0030 61 13 14 00 18 00 C7 13-FF FF FF FF 00 00 00 00 a...............13C6:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................13C6:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........13C6:0060 20 20 20 20 20 20 20 20 00 00 00 00 00 20 20 20 .....13C6:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........-Q CODESG SEGMENT PARA 'CODE' BEGIN PROC FAR 1. ASSUME CS:CODESG,DS:DATASG,SS:STACKG 2. PUSH DS ;Записать DS в стек 3. SUB AX,AX ;Установить ноль в AX PUSH AX ;Записать ноль в стек Ассемблер для IBM PC. Программы. 15 4. MOV AX,DATASG ;Занести адрес MOV DS,AX ; DATASG в DS . . . 5. RET ;Возврат в DOS BEGIN ENDP CODESG ENDS END BEGIN page 60,132TITLE EXASM1 (EXE) Пример регистровых операций;------------------------------------------------STACKSG SEGMENT PARA SACK 'Stack' DB 12 DUP('STACKSEG')STACKSG ENDS;------------------------------------------------CODESG SEGMENT PARA 'Code'BEGIN PROC FAR ASSUME SS:STACKSG,CS:CODESG,DS:NOTHING PUSH DS ;Записать DS в стек SUB AX,AX ;Записать ноль PUSH AX ; в стек MOV AX,0123H ;Записать шест.0123 в AX ADD AX,0025H ;Прибавить шест.25 к AX MOV BX,AX ;Переслать AX в BX ADD BX,AX ;Прибавить BX к AX MOV CX,BX ;Переслать BX в CX SUB CX,AX ;Вычесть AX из CX SUB AX,AX ;Очистить AX NOP RET ;Возврат в DOSBEGIN ENDP ;Конец процедуры CODESG ENDS ;Конец сегмента END BEGIN ;Конец программы Ассемблер для IBM PC. Программы. 16 1 page 60,1322 TITLE EXASM1 (EXE) Пример регистровых операций3 ;------------------------------------------------4 0000 STACKSG SEGMENT PARA SACK 'Stack'5 0000 0C [ DB 12 DUP('STACKSEG')6 53 54 41 437 4B 53 45 478 ]910 0060 STACKSG ENDS11 ;-------------------------------------------------12 0000 CODESG SEGMENT PARA 'Code'13 0000 BEGIN PROC FAR14 ASSUME SS:STACKSG,CS:CODESG,DS:NOTHING15 0000 1E PUSH DS ;Записать DS в стек16 0001 2B C0 SUB AX,AX ;Записать ноль17 0003 50 PUSH AX ; в стек1819 0004 B8 0123 MOV AX,0123H ;Записать шест.0123 в AX20 0007 05 0025 ADD AX,0025H ;Прибавить шест.25 к AX21 000A 8B D8 MOV BX,AX ;Переслать AX в BX22 000C 03 D8 ADD BX,AX ;Прибавить BX к AX23 000E 8B CB MOV CX,BX ;Переслать BX в CX24 0010 2B C8 SUB CX,AX ;Вычесть AX из CX25 0012 2B C0 SUB AX,AX ;Очистить AX26 0014 90 NOP27 0015 CB RET ;Возврат в DOS28 0016 BEGIN ENDP ;Конец процедуры2930 0016 CODESG ENDS ;Конец сегмента31 END BEGIN ;Конец программы-------------------------------------------------------------------------- Segments and Groups: N a m e Size Align Combine Class CODESG . . . . . . . . . . . . 0016 PARA NONE 'CODE' STACKSG. . . . . . . . . . . . 0060 PARA STACK 'STACK' Symbols: N a m e Type Value Attr BEGIN. . . . . . . . . . . . . F PROC 0000 CODESG Length=0016-------------------------------------------------------------------------- Ассемблер для IBM PC. Программы. 17 1 page 60,1322 TITLE EXASM2 (EXE) Операции пересылки и сложения3 ;---------------------------------------------------4 0000 STACKSG SEGMENT PARA SACK 'Stack'5 0000 20 [ DB 32 DUP(?)6 ????7 ]89 0040 STACKSG ENDS10 ;---------------------------------------------------11 0000 DATASG SEGMENT PARA 'Data'12 0000 00FA FLDA DW 25013 0002 007D FLDB DW 12514 0004 ???? FLDC DW ?15 0006 DATASG ENDS16 ;---------------------------------------------------17 0000 CODESG SEGMENT PARA 'Code'18 0000 BEGIN PROC FAR19 ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:NOTHING20 0000 1E PUSH DS ;Записать DS в стек21 0001 2B C0 SUB AX,AX ;Записать в стек22 0003 50 PUSH AX ; нулевой адрес 23 0004 B8 ---- R MOV AX,DATASG ;Поместить адрес DATASG24 0007 8E D8 MOV DS,AX ; в регистр DS2526 0009 A1 0000 R MOV AX,FLDA ;Переслать 0250 в AX27 000C 03 06 0002 R ADD AX,FLDB ;Прибавить 0125 к AX28 0010 A3 0004 R MOV FLDC,AX ;Записать сумму в FLDC 29 0013 CB RET ;Вернуться в DOS30 0014 BEGIN ENDP31 0014 CODESG ENDS END BEGIN ---------------------------------------------------------------------------- Segments and Groups: N a m e Size Align Combine Class CODESG . . . . . . . . . . . . 0014 PARA NONE 'CODE' DATASG . . . . . . . . . . . . 0006 PARA NONE 'DATA' STACKSG. . . . . . . . . . . . 0040 PARA STACK 'STACK' Symbols: N a m e Type Value Attr BEGIN. . . . . . . . . . . . . F PROC 0000 CODESG Length=0014 FLDA . . . . . . . . . . . . . L WORD 0000 DATASG FLDB . . . . . . . . . . . . . L WORD 0002 DATASG FLDC . . . . . . . . . . . . . L WORD 0004 DATASG---------------------------------------------------------------------------- Ассемблер для IBM PC. Программы. 18 EXASM2 (EXE) Операции пересылки и сложения Symbol Cross Reference (# is definition) Cref-1 BEGIN. . . . . . . . . . . . 18# 30 32 CODE . . . . . . . . . . . . 17 CODESG . . . . . . . . . . . 17# 19 31 DATA . . . . . . . . . . . . 11 DATASG . . . . . . . . . . . 11# 15 19 23 FLDA . . . . . . . . . . . . 12# 26 FLDB . . . . . . . . . . . . 13# 27 FLDC . . . . . . . . . . . . 14# 28 STACK. . . . . . . . . . . . 4 STACKSG. . . . . . . . . . . 4# 9 19 10 Symbols Ассемблер для IBM PC. Программы. 19 page 60,132 TITLE EXDEF (EXE) Определение данных 0000 DATASG SEGMENT PARA 'Data' ; Определение байта - DB: ; ---------------------- 0000 ?? FLD1DB DB ? ;Неинициализирован 0001 50 65 72 73 6F 6E FLD2DB DB 'Personal Computer' ;Сим. строка 61 6C 20 43 6F 6D 70 75 74 65 72 0012 20 FLD3DB DB 32 ;Десятичная константа 0013 20 FLD4DB DB 20H ;Шест. константа 0014 59 FLD5DB DB 01011001B ;Двоичная константа 0015 01 4A 41 4E 02 46 FLD6DB DB 01,'JAN',02,'FEB',03,'MAR' ;Таблица 45 42 03 4D 41 52 0021 33 32 36 35 34 FLD7DB DB '32654' ;Символьные числа 0026 0A [ 00 ] FLD8DB DB 10 DUP(0) ;Десять нулей ; Определение слова - DW: ; ---------------------- 0030 FFF0 FLD1DW DW 0FFF0H ;Шест. константа 0032 0059 FLD2DW DW 01011001B ;Двоичная константа 0034 0021 R FLD3DW DW FLD7DB ;Адресная константа 0036 0003 0004 0007 FLD4DW DW 3,4,7,8,9 ;Пять констант 0008 0009 0040 05 [ 0000 ] FLD5DW DW 5 DUP(0) ;Пять нулей ; Определение двойного слова - DD: ; ------------------------------- 004A ???????? FLD1DD DD ? ;Неинициализировано 004E 43 50 00 00 FLD2DD DD 'PC' ;Символьная строка 0052 3C 7F 00 00 FLD3DD DD 32572 ;Десятичное значение 0056 11 00 00 00 FLD4DD DD FLD3DB - FLD2DB ;Разность адресов 005A 0E 00 00 00 31 00 FLD5DD DD 14,49 ;Две константы 00 00 ; Определение учетверенного слова - DQ: ; ------------------------------------ 0062 ???????????????? FLD1DQ DQ ? ;Неинициализировано 006A 47 4D 00 00 00 00 FLD2DQ DQ 04D47H ;Шест. константа 00 00 0072 3C 7F 00 00 00 00 FLD3DQ DQ 32572 ;Десятич. константа 00 00 ; Определение десяти байт - DT: ; ---------------------------- 007A ?????????????????? FLD1DT DT ? ;Неинициализировано ?? 0084 43 50 00 00 00 00 FLD2DT DT 'PC' ;Символьная строка 00 00 00 00 008E DATASG ENDS END----------------------------------------------------------------------------- Ассемблер для IBM PC. Программы. 20 Segments and Groups: N a m e Size Align Combine Class DATASG . . . . . . . . . . . . 008E PARA NONE 'DATA' Symbols: N a m e Type Value Attr FLD1DB . . . . . . . . . . . . L BYTE 0000 DATASG FLD1DD . . . . . . . . . . . . L DWORD 004A DATASG FLD1DQ . . . . . . . . . . . . L QWORD 0062 DATASG FLD1DT . . . . . . . . . . . . L TBYTE 007A DATASG FLD1DW . . . . . . . . . . . . L WORD 0030 DATASG FLD2DB . . . . . . . . . . . . L BYTE 0001 DATASG FLD2DD . . . . . . . . . . . . L DWORD 004E DATASG FLD2DQ . . . . . . . . . . . . L QWORD 006A DATASG FLD2DT . . . . . . . . . . . . L TBYTE 0084 DATASG FLD2DW . . . . . . . . . . . . L WORD 0032 DATASG FLD3DB . . . . . . . . . . . . L BYTE 0012 DATASG FLD3DD . . . . . . . . . . . . L DWORD 0052 DATASG FLD3DQ . . . . . . . . . . . . L QWORD 0072 DATASG FLD3DW . . . . . . . . . . . . L WORD 0034 DATASG FLD4DB . . . . . . . . . . . . L BYTE 0013 DATASG FLD4DD . . . . . . . . . . . . L DWORD 0056 DATASG FLD4DW . . . . . . . . . . . . L WORD 0036 DATASG FLD5DB . . . . . . . . . . . . L BYTE 0014 DATASG FLD5DD . . . . . . . . . . . . L DWORD 005A DATASG FLD5DW . . . . . . . . . . . . L WORD 0040 DATASG Length =0005 FLD6DB . . . . . . . . . . . . L BYTE 0015 DATASG FLD7DB . . . . . . . . . . . . L BYTE 0021 DATASG FLD8DB . . . . . . . . . . . . L BYTE 0026 DATASG Length =000A------------------------------------------------------------------------------- Ассемблер для IBM PC. Программы. 21 D:\ D>DEBUG D:EXDEF.EXE-D1421:0000 00 50 65 72 73 6F 6E 61-6C 20 43 6F 6D 70 75 74 .Personal Comput1421:0010 65 72 20 20 59 01 4A 41-4E 02 46 45 42 03 4D 41 er Y.JAN.FEB.MA1421:0020 52 33 32 36 35 34 00 00-00 00 00 00 00 00 00 00 R32654..........1421:0030 F0 FF 59 00 21 00 03 00-04 00 07 00 08 00 09 00 ..Y.!...........1421:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 43 50 ..............CP1421:0050 00 00 3C 7F 00 00 11 00-00 00 0E 00 00 00 31 00 ..<...........1.1421:0060 00 00 00 00 00 00 00 00-00 00 47 4D 00 00 00 00 ..........GM....1421:0070 00 00 3C 7F 00 00 00 00-00 00 00 00 00 00 00 00 ..<.............-D1421:0080 00 00 00 00 43 50 00 00-00 00 00 00 00 00 33 33 ....CP........331421:0090 3E 36 33 33 73 00 00 00-0A 0E 00 00 3E 63 63 30 >633s.......>cc01421:00A0 1C 06 63 63 3E 00 00 00-0A 0E 00 00 FF DB 99 18 ..cc>...........1421:00B0 18 18 18 18 3C 00 00 00-0A 0E 00 00 63 63 63 63 ....<.......cccc1421:00C0 63 63 63 63 3E 00 00 00-0A 0E 00 00 C3 C3 C3 C3 cccc>...........1421:00D0 C3 C3 66 3C 18 00 00 00-0A 0E 00 00 C3 C3 C3 C3 ..f<............1421:00E0 DB DB FF 66 66 00 00 00-0A 0E 00 00 C3 C3 66 3C ...ff.........f<1421:00F0 18 3C 66 C3 C3 00 00 00-0A 0E 00 00 C3 C3 C3 66 .<f............f-Q Ассемблер для IBM PC. Программы. 22 page 60,132 TITLE EXIMM (EXE) Пример непосредственных операндов ; (Кодируется для ассемблирования, ; но не для выполнения)0000 DATASG SEGMENT PARA 'Data'0000 ?? FLD1 DB ?0001 ???? FLD2 DW ?0003 DATASG ENDS 0000 CODESG SEGMENT PARA 'Code'0000 BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG ; Операции пересылки и сравнения: ; ------------------------------0000 BB 0113 MOV BX,275 ;Пересылка0003 3C 19 CMP AL,H ;Сравнение ; Арифметические операции: ; -----------------------0005 14 05 ADC AL,5 ;Сложение с переносом0007 80 C7 0C ADD BH,12 ;Сложение000A 1C 05 SBB AL,5 ;Вычитание с заемом000C 80 2E 000 R 05 SUB FLD1,5 ;Вычитание ; Ротация и сдвиг (только на 1 бит): ; ---------------------------------0011 D0 D3 RCL BL,1 ;Ротация влево с переносом0013 D0 DC RCR AH,1 ;Ротация вправо с переносом0015 D1 06 0001 R ROL FID2,1 ;Ротация влево0019 D0 C8 ROR AL,1 ;отация вправо001B D1 E1 SAL CX,1 ;Сдвиг влево001D D1 FB SAR BX,1 ;Арифм. сдвиг вправо001F D0 2E 0000 R SHR FLD1,1 ;Сдвиг вправо ; Логические операции: ; -------------------0023 24 2C AND AL,00101100B ;AND (регистр)0025 80 CF 2A OR BH,2AH ;OR (регистр)0028 F6 C3 7A TEST BL,7AH ;TEST (регистр)002B 80 36 0000 R 23 OR FLD1,23H ;XOR (память)0030 BEGIN ENDP0030 CODESG ENDS END Ассемблер для IBM PC. Программы. 23 page 60,132TITLE XCOM1 COM-программа для пересылки и сложенияCODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H ;Начало в конце PSPBEGIN: JMP MAIN ;Обход через данные; ---------------------------------------------------FLDA DW 250 ;Определение данныхFLDB DW 125FLDC DW ?; ---------------------------------------------------MAIN PROC NEAR MOV AX,FLDA ;Переслать 0250 в AX ADD AX,FLDB ;Прибавить 0125 к AX MOV FLDC,AX ;Записать сумму в FLDC RET ;ернуться в DOSMAIN ENDPCODESG ENDS END BEGIN page 60,132 TITLE EXJUMP (COM) Организация цикла с помощью JMP0000 CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG0100 ORG 100H 0100 MAIN PROC NEAR0100 B8 0001 MOV AX,01 ;Инициализация AX,0103 BB 0001 MOV BX,01 ; BX,0106 B9 0001 MOV CX,01 ; и CX0109 A20:0109 05 0001 ADD AX,01 ;Прибавить 01 к AX010C 03 D8 ADD BX,AX ;Прибавить 01 к BX010E D1 E1 SHL CX,1 ;Удвоить CX0110 EB F7 JMP A20 ;Переход на A200112 MAIN ENDP0112 CODESG ENDS END MAIN Ассемблер для IBM PC. Программы. 24 page 60,132 TITLE EXLOOP (COM) Организация цикла командой LOOP0000 CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG0100 ORG 100H 0100 BEGIN PROC NEAR0100 B8 0001 MOV AX,01 ;Инициализация AX,0103 BB 0001 MOV BX,01 ; BX,0106 BA 0001 MOV DX,01 ; и DX0109 B9 000A MOV CX,10 ;Число циклов010C A20:010C 40 INC AX ;Прибавить 01 к AX010D 03 D8 ADD BX,AX ;Прибавить AX к BX010F D1 E2 SHL DX,1 ;Удвоить DX0111 E2 F9 LOOP A20 ;Уменьшить CX и повторить ; цикл, если ненуль0113 C3 RET ;Завершить работу0114 BEGIN ENDP0114 CODESG ENDS END BEGIN +-------------------------+ | CODESG SEGMENT PARA | +-------------------------+ | BEGIN PROC FAR | | . | | . | | CALL B10 | | CALL C10 | | RET | | BEGIN ENDP | +-------------------------+ | B10 PROC NEAR | | . | | . | | RET | | B10 ENDP | +-------------------------+ | C10 PROC NEAR | | . | | . | | RET | | C10 ENDP | +-------------------------+ | CODESG ENDS | | END BEGIN | +-------------------------+ Ассемблер для IBM PC. Программы. 25 TITLE CALLPROC (EXE) Вызов процедур0000 STACKSG SEGMENT PARA STACK 'Stack'0000 20 [ ???? ] DW 32 DUP(?)0040 STACKG ENDS 0000 CODESG SEGMENT PARA 'Code'0000 BEGIN PROC FAR ASSUME CS:CODESG,SS:STACKSG0000 1E PUSH DS0001 2B C0 SUB AX,AX0003 50 PUSH AX0004 E8 0008 R CALL B10 ;Вызвать B10 ; ...0007 CB RET ;Завершить программу0008 BEGIN ENDP ;--------------------------------------0008 B10 PROC0008 E8 000C R CALL C10 ;Вызвать C10 ; ...000B C3 RET ;Вернуться в000C B10 ENDP ; вызывающую программу ;----------------------------------------------000C C10 PROC ; ...000C C3 RET ;Вернуться в000D C10 ENDP ; вызывающую программу ;----------------------------------------------000D CODESG ENDS END BEGIN Ассемблер для IBM PC. Программы. 26 page 65,132TITLE EXMOVE (EXE) Операции расширенной пересылки;------------------------------------------------------STACKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?)STACKSG ENDS;------------------------------------------------------DATASG SEGMENT PARA 'Data'NAME1 DB 'ABCDEFGHI'NAME2 DB 'JKLMNOPQR'NAME3 DB 'STUVWXYZ*'DATASG ENDS;-------------------------------------------------------CODESG SEGMENT PARA 'Code'BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX CALL B10MOVE ;Вызвать JUMP подпрограмму CALL C10MOVE ;Вызвать CALL подпрограмму RET ;Завершить программуBEGIN ENDP ; Расширенная пересылка (JUMP-подпрограмма),; использующая переход по условию:; -----------------------------------------B10MOVE PROC LEA SI,NAME1 ;Инициализация адресов LEA DI,NAME2 ; NAME1 и NAME2 MOV CX,09 ;Переслать 9 символовB20: MOV AL,[SI] ;Переслать из NAME1 MOV [DI],AL ;Переслать в NAME2 INC SI ;Следующий символ в NAME1 INC DI ;Следующая позиция в NAME2 DEC CX ;Уменьшить счетчик цикла JNZ B20 ;Счетчик > 0? Да - цикл RET ;Если счетчик = 0, тоB10MOVE ENDP ; вернуться ; Расширенная пересылка (LOOP-подпрограмма),; использующая команду LOOP:; -----------------------------------------;C10MOVE PROC LEA SI,NAME2 ;Инициализация адресов LEA DI,NAME3 ; NAME2 и NAME3 MOV CX,09 ;Переслать 9 символовC20 Ассемблер для IBM PC. Программы. 27 MOV AL,[SI] ;Переслать из NAME2 MOV [DI],AL ;Переслать в NAME3 INC DI ;Следующий символ в NAME2 INC SI ;Следующая позиция в NAME3 LOOP C20 ;Уменьшить счетчик, ; если не ноль, то цикл RET ;Если счетчик = 0, тоC10MOVE ENDP ; вернутьсяCODESG ENDS END BEGIN TITLE CASE (COM) Перекодировка в заглавные буквы0000 CODESG SEGMENT PARA 'CODE' ASSUME CS:CODESG,DS:CODESG,SS:CODESG0001 ORG 100H0001 EB 1C 90 BEGIN: JMP MAIN ; -------------------------------------------0003 43 68 61 6E 67 65 TITLEX DB 'Change to uppercase letters' 20 74 6F 20 75 70 70 65 72 63 61 73 65 20 6C 65 74 74 65 72 73 ; -------------------------------------------011E MAIN PROC NEAR011E 8D 1E 0104 R LEA BX,TITLEX+1 ;Адрес первого символа0122 B9 001F MOV CX,31 ;Число символов0125 B20:0125 8A 27 MOV AH,[BX] ;Символ из TITLEX0127 80 FC 61 CMP AH,61H ;Это012A 72 0A JB B30 ; прописная012C 80 FC 7A CMP AH,7AH ; буква012F 77 05 JA B30 ; ?0131 80 E4 DF AND AH,11011111B ;Да - преобразовать0134 88 27 MOV [BX],AH ;Записать в TITLEX0136 B30:0136 43 INC BX ;Следующий символ0137 E2 EC LOOP B20 ;Повторить цикл 31 раз0139 C3 RET013A MAIN ENDP013A CODESG ENDS END BEGIN Ассемблер для IBM PC. Программы. 28 page 60,132TITLE ALLASC (COM) Вывод на экран ASCII-символов 00-FFCODESC SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:NOTHING ORG 100HBEGIN: JMP SHORT MAINCTR DB 00,'S' ; Основная процедура:; ------------------MAIN PROC NEAR CALL B10CDR ;Очистить экран CALL C10SET ;Установить курсор CALL D10DISP ;Вывести символ на экран RETMAIN ENDP; Очистка экрана:; --------------B10CLR PROC MOV AX,0600H MOV BH,07 MOV CX,0000 ;Левая верхняя позиция MOV DX,184FH ;Правая нижняя позиция INT 10H RETB10CLR ENDP; Установка курсора в 00,00:; -------------------------C10SET PROC MOV AN,02 MOV BN,00 MOV DX,0000 INT 10H RETC10SET ENDP; Вывод на экран ASCII символов:; -----------------------------D10DISP PROC MOV CX,256 ;256 итераций LEA DX,CTR ;Адрес счетчикаD20 MOV AH,09 ;Функция вывода символа INT 21H INC CTR ;Увеличить счетчик LOOP D20 ;Уменьшить CX, ; цикл, если не ноль RET ;ВернутьсяD10DISP ENDP CODESG ENDS END BEGIN Ассемблер для IBM PC. Программы. 29 page 60,132TITLE CTRNAME (EXE) Ввод имен и вывод в центр экрана;--------------------------------------------------------STSCKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?)STACKSG ENDS;--------------------------------------------------------DATASG SEGMENT PARA 'Data'NAMEPAR LABEL BYTE ;Имя списка параметров:MAXNLEN DB 20 ; макс.длина имениNAMELEN DB ? ; число введенных символовNAMEFLD DB 20 DUP(' '),'$' ; имя и ограничитель ; для вывода на экранPRIMPT DB 'Name? ', '$'DATASG ENDS;--------------------------------------------------------CODESG SEGMENT PARA 'Code"BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASC PUSH DS SUB AX,AX PUCH AX MOV AX,DATASC MOV DS,AX MOV ES,AX CALL Q10CLR ;Очистить экранA20LOOP: MOV DX,0000 ;Установить курсор в 00,00 CALL Q20CURS CALL B10PRMP ;Выдать текст запроса CALL D10INPT ;Ввести имя CALL Q10CLR ;Очистить экран CMP NAMELEN,00 ;Имя введено? JE A30 ; нет - выйти CALL E10CODE ;Установить звуковой сигнал ; и ограничитель '$' CALL F10CENT ;Центрирование и вывод JMP A20LOOP A30: RET ;Вернуться в DOSBEGIN ENDP; Вывод текста запроса:; --------------------B10PRMP PROC NEAR MUV AN,09 ;Функция вывода на экран LEA DX,PROMPT INT 21H RETB10PRMP ENDP; Ввод имени с клавиатуры:; -----------------------D10INPT PROC NEAR Ассемблер для IBM PC. Программы. 30 MOV AN,0AN ;Функция ввода LEA DX,NAMEPAR INT 21H RETD10INPT ENDP; Установка сигнала и ограничителя '$':; ------------------------------------E10CODE PROC NEAR MOV BN,00 ;Замена символа Return (0D) MOV BL,NAMELEN ; на зв.сигнал (07) MOV NAMEFLD[BX],07 MOV NAMEFLD[BX+1],'$' ;Установить ограничитель RETE10CODE ENDP; Центрирование и вывод имени на экран:; ------------------------------------F10CENT PROC NEAR MOV DL,NAMELEN ;Определение столбца: SHR DL,1 ; разделить длину на 2, NEG DL ; поменять знак, ADD DL,40 ; прибавить 40 MOV DH,12 ;Центральная строка CALL Q20CURS ;Установить курсор MOV AN,09 LEA DX,NAMEFLD ;Вывести имя на экран INT 21H RETF10CENT ENDP; Очистить экран:; --------------Q10CLR PROC NEAR MOV AX,0600H ;Функция прокрутки экрана MOV BH,30 ;Цвет (07 для ч/б) MOV CX,0000 ;От 00,00 MOV DX,184FH ;До 24,79 INT 10H ;Вызов BIOS RETQ10CLR; Установка курсора (строка/столбец):; ----------------------------------Q20CURS PROC NEAR ;DX уже установлен MOV AH,02 ;Функция установки курсора MOV BH,00 ;Страница #0 INT 10H ;Вызов BIOS RETQ20CURS ENDP CODESG ENDS END BEGIN Ассемблер для IBM PC. Программы. 31 page 60,132TITLE NMSCROLL (EXE) Инвертирование, мигание, прокрутка; -------------------------------------------------------STACKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?)STACKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?)STACKG ENDS; -------------------------------------------------------DATASG SEGMENT PARA 'Data'NAMEPAR LABEL BYTE ;Имя списка параметров:MAXNLEN DB 20 ; макс.длина имениACTNLEN DB ? ; число введенных символовNAMEFLD DB 20 DUP(' ') ; имя COL DB 00COUNT DB ?PROMPT DB 'Name? 'ROW DB 00DATASG ENDS; -------------------------------------------------------CODESG SEGMENT PARA 'Code'BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PUSH DS MOV AX,DATASG MOV ES,AX MOV AX,0600H CALL Q10CLR ;Очистить экранA20LOOP: MOV COL,00 ;Установить столбец 0 CALL Q20CURS CALL B10PRMP ;Выдать текст запроса CALL D10INPT ;Ввести имя с клавиатуры CMP ACTNLEN,00 ;Нет имени? (т.е. конец) JNE A30 MOV AX,0600H CALL Q10CLR ;Если да, то очистить экран, RET ; и завершить программуA30: CALL E10NAME ;Вывести имя на экран JMP A20LOOPBEGIN ENDP; Вывод текста запроса:; --------------------B10PRMP PROC NEAR LEA SI,PROMPT ;Адрес текста MOV COUNT,05B20: MOV BL,70H ;Видеоинверсия Ассемблер для IBM PC. Программы. 32 CALL F10DISP ;Подпрограмма вывода INC SI ;Следующий символ в имени INC COL ;Следующий столбец CALL Q20CURS DEC COUNT ;Уменьшение счетчика JNZ B20 ;Повторить n раз RETB10PRMP ENDP; вод имени с клавиатуры:; ----------------------D10INPT PROC NEAR MOV AN,0AH LEA DX,NAMEPAR INT 21H RETD10INPT ENDP; Вывод имени с миганием и инверсией:; ----------------------------------E10NAME PROC NEAR LEA SI,NAMEFLD ;Адрес имени MOV COL,40 ;Установить столбецE20: CALL Q20CURS ;Установить курсор MOV BL,0FOH ;Мигание и инверсия CALL F10DISP ;Подпрограмма вывода INS SI ;Следующий символ в имени INS COL ;Следующий столбец на экране DES ACTNLEN ;Уменьшить счетчик длины JNZ E20 ;Циклить n раз CMP ROW,20 ;Последняя строка экрана? JAE E30 ; нет INC ROW RETE30: MOV AX,0601H ; да -- CALL Q10CLR ; очистить экран RETE10NAME ENDP; Вывод символа на экран:; ----------------------F10DISP PROC NEAR ;BL (атрибут) уже установлен MOV AN,09 ;Функция вывода на экран MOV AL,[SI] ;Получить символ из имени MOV BH,00 ;Номер страницы MOV CX,01 ;Один символ INT 10H ;Вызов BIOS RETF10DISP ENDP; Очистка экрана:; --------------Q10CLR PROC NEAR ;AX установлен при вызове MOV BH,07 ;Нормальный ч/б MOV CX 0000 MOV DX,184FH Ассемблер для IBM PC. Программы. 33 INT 10H ;Вызов BIOS RETQ10CLR ENDP; Установить курсор (строка/столбец):; ----------------------------------Q20CURS PROC NEAR MOV AN,02 MOV BH,00 MOV DH,ROW MOV DL,COL INT 10H RETQ20CURS ENDPCODESG ENDS END BEGIN Расширенная функция Скэн-код Alt/A до Alt/Z 1E - 2C F1 до F10 3B - 44 Home 47 Стрелка вверх 48 PgUp 49 Стрелка влево 4B Стрелка вправо 4D End 4F Стрелка вниз 50 PgDn 51 Ins 52 Del 53 Ассемблер для IBM PC. Программы. 34 TITLE GRAPHIX (COM) Пример цвета и графикиCODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H MAIN PROC NEAR MOV AN,00 ;Установка режима графики MOV AL,0DH ; для EGA (CGA=04) MOV AH,0BH ;Установить палитру MOV BH,00 ;Фон MOV BL,02 ;Зеленый INT 10H MOV BX,00 ;Начальные цвет, MOV CX,00 ; столбец MOV DX,00 ; и строкаA50: MOV AH,0CH ;Функция вывода точки MOV AL,BL ;Установить цвет INT 10H ;BX, CX, и DX сохраняются INC CX ;Увеличить столбец CMP CX,320 ;Столбец 320? JNE A50 ; нет - цикл, MOV CX,00 ; да - сбросить столбец INS BL ;Изменить цвет INS DX ;Увеличить строку CMP DX,40 ;Строка 40? JNE A50 ; нет - цикл, RET ; да - завершитьMAIN ENDPCODESG ENDS END MAIN Ассемблер для IBM PC. Программы. 35 page 60,132TITLE STRING (EXE) Проверка строковых операций; ---------------------------------------------------STACKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?)STACKG ENDS; ---------------------------------------------------DATASG SEGMENT PARA 'Data'NAME1 DB 'Assemblers' ;Элементы данныхNAME2 DB 10 DUP(' ')NAME3 DB 10 DUP(' ')DATASG ENDS; ---------------------------------------------------CODESG SEGMENT PARA 'Code'BEGIN PROC FAR ;Основная процедура ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX CALL C10MVSB ;Подпрограмма MVSB CALL D10MVSW ;Подпрограмма LODS CALL E10LODS ;Подпрограмма LODS CALL F10STOS ;Подпрограмма CMPS CALL H10SCAS ;Подпрограмма SCAS RETBEGIN ENDP; Использование MOVSB:; -------------------C10MVSB PROC NEAR CLD LEA SI,NAME1 LEA D1,NAME2 MOV CX,10 ;Переслать 10 байтов REP MOVSB ; из NAME1 в NAME2 RETC10MVSB ENDP; Использование MOVSW:; -------------------D10MVSW PROC NEAR CLD LEA SI,NAME2 LEA DI,NAME3 MOV CX,05 ;Переслать 5 слов REP MOVSW ; из NAME2 в NAME3 RETD10MVSW ENDP; Использование LODSW:; -------------------E10LODS PROC NEAR Ассемблер для IBM PC. Программы. 36 CLD LEA SI,NAME1 ;Загрузить первое слово LODSW ; из NAME1 в AX RETE10LODS ENDP; Использование STOSW:; -------------------F10STOS PROC NEAR CLD LEA D1,NAME3 MOV CX,05 MOV AX,2020H ;Переслать пробелы REP STOSW ; в NAME3 RETF10STOS ENDP; Использование CMPSB:; -------------------G10CMPS PROC NEAR CLD MOV CX,10 LEA SI,NAME1 LEA DI,NAME2 REPE CMPSB ;Сравнить NAME1 и NAME2 JNE G20 ;Не равны? MOV BH,01 G20: MOV CX,10 LEA SI,NAME2 LEA DI,NAME3 REPE CMPSB ;Сравнить NAME2 и NAME3 JE G30 ;Если равны, то выйти MOV BL,02G30: RETG10CMPS ENDP ; Использование SCASB:; -------------------H10SCAS PROC NEAR CLD MOV CX,10 LEA DI,NAME1 MOV AL,'m' ;Поиск символа 'm' REPNE SCASB ; в NAME1 JNE H20 ;Если не найден - выйти MOV AH,03H20: RETH10SCAS ENDP CODES ENDS END BEGIN Ассемблер для IBM PC. Программы. 37 page 60,132TITLE EXRING (COM) Вывод имен, выровненных справаCODESG SEGMENT PARA 'Code' ASSUME C

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти