
- •В.Ф. Гузик, с.М. Гушанский, в.А. Каляев, а.О. Пьявченко, а.И. Костюк основы программирования на языке «ассемблер»
- •1. Введение для кого написано это учебное пособие.
- •2. Предварительные сведения или азы, которые необходимо знать!
- •2.1. Ассемблер, что это такое?
- •2.2. Как писать ассемблерную программу, и какие программы нужны для ее последующей трансляции.
- •2.3. Системы счисления
- •2.4. Оперативная память.
- •2.5. Стек
- •Сегментация памяти.
- •Программная модель процессора.
- •Система команд.
- •Inc word ptr [bx]
- •2.9 Выделение памяти под переменные и массивы
- •2.10 Exe и com программы
- •2.11 Трансляция ассемблерной программы
- •Passes: 1
- •Примеры программирования на ассемблере.
- •3.1. Наша первая программа.
- •3.2. Работа с клавиатурой и экраном.
- •Прерывания dos для работы с клавиатурой.
- •Функция 7 прерывания int 21h
- •Функция 6 прерывания int 21h.
- •Функция 0ah прерывания int 21h.
- •Прерывания bios для работы с клавиатурой
- •1. Функция 0 прерывания int 16h Входные параметры: нет
- •2. Функция 1 прерывание int 16h Входные параметры: нет
- •1. Функция 2 прерывания int 21h
- •2. Функция 9 прерывание int 21h
- •Функция 1 прерывание int 10h
- •Функция 2 прерывание int 10h
- •Функция 3 прерывание int 10h
- •Функция 6 прерывание int 10h
- •Функция 9 прерывание int 10h
- •Функция 0eh прерывания int 10h
- •Работа с гибкими дисками.
- •Inc nomber
- •3.4. Перехват прерываний и создание резидентных программ
- •Inst: mov ah, 9
- •Inst: mov ah,9
- •3.5. Работа со звуком.
- •Отладка программ.
- •Приложение
- •Сервисные прерывания dos.
- •Сервисные прерывания bios.
- •Int 10h, функция 07h. Инициализация или прокрутка окна вниз.
- •Int 10h, функция 08h. Чтение символа и атрибута в позиции курсора.
- •Int 10h, функция 09h. Запись символа и атрибута в позицию курсора.
- •Int 10h, функция 0ah. Запись символа в позицию курсора.
- •Int 10h, функция 0eh. Запись символа в режиме телетайпа.
- •Int 10h, функция 10h, подфункция 03h. Переключение бита «мерцание/яркость».
- •Int 10h, функция 13h. Запись строки в режиме телетайпа.
- •Int 15h, функция 86h. Программная задержка на заданное число микросекунд.
- •Int 16h, функция 00h (10h). Чтение символа с клавиатуры.
- •Int 16h, функция 01h (11h). Чтение символа с клавиатуры.
- •Int 16h, функция 02h (12h). Получение статуса клавиатуры.
- •Int 1ah, функция 0h. Число тиков таймера.
- •Коэффициенты пересчета для нот
- •Значение цветов в байте атрибута
- •Буфер клавиатуры.
- •Литература
- •7. Содержание
Программная модель процессора.
Под программной моделью, понимается набор внутренних регистров и флагов процессора, которые, тем или иным образом доступны программисту. Мы с Вами рассмотрим программную модель процессора 8086 (рис. 2.7), которая является базовой для всех микропроцессоров фирмы Intel, вплоть до процессора Pentium IV.
Как видно из рис. 2.7, процессор включает в свой состав несколько групп 16 разрядных регистров. Регистры ax, cx, dx и bx составляют группу регистров общего назначения (РОНы). Основной функцией этих регистров является временное хранение промежуточных результатов вычислений.
Как видно из рисунка 2.7, любой РОН можно рассматривать как один 16 разрядный регистр или как два 8 разрядных регистра. Например, bx – шестнадцатиразрядный регистр, bh и bl –восьмиразрядные регистры, причем bh соответствует старшему, а bl – младшему байтам bx.
В процессорах фирмы Intel на каждый из РОНов, помимо основной, возлагается еще и ряд дополнительных функций. Например, регистр cx используется в качестве счетчика в команде цикла loop. Мы здесь не будем рассматривать особенности каждого регистра, а будем вводить эти особенности по мере дальнейшего изложения материала. Подчеркнем только, что единственным регистром и группы РОНов, который может быть использован для адресации памяти, является регистр bx. Иначе говоря, невозможны конструкции, в которых ax, cx или dx, а также ah, al, bh, bl, ch, cl, dh или dl стоят в квадратных скобках. Транслятор на такие конструкции будет «ругаться», выдавая сообщения об ошибках.
Регистры sp, bp, si и di составляют группу регистров-указателей. Основное их назначение – участвовать в формировании Аэф в командах обращения к памяти («стоять в квадратных скобках»). Но если в какой-либо момент какие-либо из этих регистров для этих целей не нужны, можно использовать эти регистры (кроме sp!!!) в качестве РОНов. Регистры-указатели могут быть только 16 разрядными!
Следующую группу составляют сегментные регистры, с которыми мы уже познакомились в разделе 2.6.
Рис. 2.7
Особняком стоят два регистра. Это уже знакомый нам «указатель команд» ip и регистр флагов f. В последнем устанавливаются (чаще всего самим процессором) ряд флагов. Большинство флагов характеризуют результат последней операции, выполненной процессором. Состояние флагов, например, анализируют команды условных переходов, то есть флаги используются для организации ветвлений в программах. Формат регистра f приведен на рис. 2.8. Новичок в Ассемблере, как правило, вначале сталкивается только с одним флагом. Это флаг «нулевого результата» z (zero). Однако для полноты картины мы здесь все же приведем описание всех флагов.
15..12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
резерв |
of |
df |
if |
tf |
sf |
zf |
- |
af |
- |
pf |
- |
cf |
Рис. 2.8
cf (carry) – флаг переноса. Этот флаг устанавливается в единицу, если в процессе операции возникает перенос из старшего разряда (или был заем в старший разряд при вычитании). С этим флагом работают некоторые команды условных переходов. Программист может непосредственно влиять на значение этого флага, используя команды stc, clc и cmc (установить, сбросить, инвертировать).
pf (parity)– флаг четности. Устанавливается в единицу, если в младшем байте результата получилось четное число единиц. Флаг можно использовать для организации «контроля по четности», с ним работают некоторые команды условных переходов.
af (adjust) – флаг межтетрадного переноса. Устанавливается в единицу, если в процессе операции возникает перенос из 3-го бита в 4-й (или был заем из 4-го бита при вычитании). С флагом работают команды коррекции для двоично-десятичной (BCD) арифметики.
zf (zero) – флаг нулевого результата. Устанавливается в единицу, если результат операции оказался равен нулю. С флагом работают некоторые команды условных переходов.
sf (sign)– флаг знака. Устанавливается в единицу, если в старшем разряде результата получилась единица, то есть результат является отрицательным числом. С флагом работают некоторые команды условных переходов.
tf (trap)– флаг трассировки. Если этот флаг установлен в единицу, программа выполняется в «пошаговом режиме», так как после каждой команды процессора автоматически генерирует прерывание типа 1. Таким образом, этот флаг используется для отладки. У программиста нет в распоряжении команд, влияющих на этот флаг. Поэтому изменить значение флага tf можно только косвенным образом, через стек.
if (interrupt enable)– флаг разрешения внешних прерываний. Если этот флаг установлен в ноль, процессор игнорирует запросы на прерывание, приходящие на вход INTR процессора, то есть запрещаются внешние прерывания (от клавиатуры, мыши и.т.д). Для работы с этим флагом есть две команды:
sti (set if) - if 1 – разрешить внешние прерывания;
cli (clear if) - if 0 – запретить внешние прерывания.
df (direction)– флаг направления, задает автоинкремент или автодекремент регистров si и di в строковых командах. Программист имеет возможность влиять на этот флаг с помощью команд std и cld.
of (overflow)– флаг переполнения. Устанавливается в единицу, если в результате выполнения арифметической операции произошло переполнение разрядной сетки. С флагом работает команда into – «прерывание, если установлен флаг of» и некоторые команды условных переходов.
В заключение этого раздела отметим, что современные процессоры имеют 32 разрядный формат регистров и эти регистры обозначаются eax, ecx, …., edi.