- •Архитектура пэвм
- •Пользовательские регистры
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры состояния и управления
- •Регистры защищенного режима:
- •Организация памяти (реальный режим)
- •Элементы синтаксиса Ассемблера
- •Операторы
- •Директивы сегментации
- •Модели памяти
- •Идентификаторы, создаваемые директивой Model:
- •Этапы создания программы на ассемблере
- •2. Создание объектного модуля (трансляция программы)
- •3. Создание загрузочного модуля (компоновка программы)
- •4. Отладка программы
- •Определение простых типов данных:
- •Способы адресации Регистровая адресация
- •Непосредственная адресация
- •Способы адресации памяти
- •Переопределение сегмента
- •Особенности пересылки данных
- •Xch ax, bx ; команда двунаправленного обмена
- •Команды работы с адресами и указателями
- •Команды сдвига
- •Команды линейного сдвига
- •Команды циклического сдвига
- •Команды сдвига двойной точности
- •Примеры работы с битовыми полями
- •Команды преобразования данных
- •Xor ax, ax ; очистка регистра ax
- •Int 21h ;ожидание вода с клавиатуры
- •Команды обработки строк
- •Команды пересылки строк
- •Команды сравнения строк
- •Пример.
- •Сканирование строки
- •Загрузка элемента строки в аккумулятор
- •Перенос элемента из аккумулятора в строку
- •Ввод элемента цепочки из порта в строку
- •Вывод элемента цепочки в порт
- •Пример использования вложенных циклов
- •Массивы
- •Логические команды
- •Xor операнд1,операнд2
- •Логические команды поиска
- •Структуры
- •Описание шаблона структуры:
- •Заполнение шаблона:
- •Работа с полями структуры
- •Пример:
- •Шаблон записи:
- •Xor bl, mask i2 ; обнуление
- •Команды передачи управления
- •Безусловные переходы
- •Межсегментные переходы
- •Второй сегмент
- •Команды условного перехода
- •Команды условного перехода и флаги
- •Процедуры
- •Процедура в начале кодового сегмента
- •Процедура в конце кодового сегмента
- •Процедура в теле сегмента
- •Вызов процедуры
- •Ret [число]
- •Способы вызова процедуры
- •Прямой ближний вызов
- •Прямой дальний вызов
- •Косвенный ближний вызов
- •Косвенный дальний вызов процедуры
- •Организация интерфейса между процедурами, расположенными в разных модулях
- •Передачи параметров в процедуру через регистры
- •Фрагмент модуля 2
- •Возврат результата из процедуры
- •Макрокоманды и макроопределения
- •Особенности трансляции при получении объектного модуля
- •Где можно разместить макроопределение?
- •Связь Assembler с языками высокого уровня
- •Операторы типа inline
- •Ассемблерные вставки
- •Внешние процедуры Операторы типа inline
- •Ассемблерные вставки
- •Требования к программе на языке Assembler
- •Требования к программе на языке Pascal
- •Передача параметров из Pascal-программы в программу на ассемблере
- •Использование директивы model для организации взаимодействия программ
- •Int 10h; вывод символа
- •Возврат данных в вызывающую программу
- •Пример взаимодействия программ
- •Особенности com-программы
- •Пример программы типа .Com
- •Резидентные программы
- •Формат резидентной программы
- •Собственно программу.
- •Функцию записи в оп адреса точки входа программы для последующего вызова.
- •Функцию, которая оставляет программу резидентной.
- •Пример резидентной программы типа .Com
- •Iret ;возврат из процедуры
- •Int 27h ; оставляем программу резидентной
- •Вызов резидентной программы
- •Запись адреса резидентной программы в область межзадачных связей
- •Iret ;возврат из процедуры
- •Int 27h ; оставляем программу резидентной
- •Вызов резидентной программы через область межзадачных связей
- •Передача параметров в резидентную программу
- •Замена существующего вектора прерывания
- •Динамическое распределение памяти
- •Пример выделения и освобождения блока памяти
- •Int 21h ;блока памяти
- •Дочерние процессы
- •Особенности структуры материнской программы
- •Активизация дочернего процесса
- •Пример материнской программы
- •; Запуск дочернего процесса
- •Int 21h ; запуск дочернего процесса
- •Int 21h ; выход в ос (завершение программы)
- •Получение и анализ кода возврата в материнской программе
- •Int 21h ; код возврата передается через регистр al
- •Передача кода возврата из дочерней программы
- •Прерывания
- •Программируемый контроллер прерываний
- •Прохождение запроса на прерывание через контроллер
- •Программирование контроллера прерываний
- •Формат приказов icw
- •Формат приказов ocw
- •И f спользование таймера в программах на Assembler
- •Формирование задержки
- •Использование прерываний 8h для управления запуском программ
- •Программирование коммуникационного порта (com)
- •Микросхема uart 8250
- •Инициализация порта
- •Пример программы инициализации порта
- •Регистр статуса линии (порта)
- •Работа порта без использования механизма прерываний
- •Получение данных
- •Передача данных
- •Алгоритм работы программы приема /передачи без прерываний
- •Текст программы
- •Работа com – порта в режиме прерываний
- •Регистр разрешения прерываний
- •Регистр идентификации прерывания
- •Вызов обработчика прерывания
- •Управление модемом через порт
- •Пример установления связи через порт и модем
- •Защищенный режим микропроцессора
- •2. Регистры отладки
- •3. Регистры управления Регистры системных адресов
- •Структура дескрипторных таблиц
- •Локальная дескрипторная таблица (ldt)
- •Структура дескриптора:
- •Структура байта ar
- •Обработка прерываний в защищенном режиме
- •Особенности обработки ловушек
- •Шлюз задачи
- •Дескриптор tss
- •Структура шлюза вызова
-
Загрузка элемента строки в аккумулятор
Команда загружает элемент строки в аккумулятор AL. Эту команду удобно использовать с помощью команд сканирования, сравнения, которые локализуют место искомого компонента строки. Строка должна быть помещена по адресу ES:SI
lods <адрес>
lodsb
lodsw
lodsd
Пример программы, которая сравнивает две строки и первый не совпавший элемент строки помещает в аккумулятор:
.data
string1 db ‘1 2 3 4 5 6,$’
string2 db ‘1 2 3 8 5 6,$’
mes db ‘элементы совпали, $’
.code
assume ds:data, es:data
main:
mov ax,@data
mov ds,ax
mov es,ax
cld
lea di, string1
lea si, string2
mov cx,6
repe cmps string1, string2 ; сравнение пока cx>0 и zf=1
jcxz m
dec si ;в регистре si адрес не совпавшего элемента строки
lods string2 ; (можно lodsb) загрузка байта 8 в аккумулятор
jmp m1
m:
mov dx, offset mes ; загрузить адрес в dx
mov ah, 9h
int 21h ; вывод сообщения «Элементы совпали»
m1:
mov ax, 4c00h
int 21h
end main
-
Перенос элемента из аккумулятора в строку
stos <приемник>
stosb
stosw
stosd
Эту операцию удобно использовать вместе с операциями поиска с тем, чтобы, найдя нужный элемент, извлечь его в регистр и записать на его место новое значение. Адрес приемника записывается в пару регистров ES:DI.
После выполнения команды происходит изменение содержимого регистра DI, равное значению размеру элемента строки: увеличение, если DF=0 или уменьшение, если DF=1.
Пример
Записать в строку 15 пробелов:
.data
string db 15 dup (?)
.code
mov ax,@data
mov ds,ax
mov es,ax
cld ; адрес увеличивается
mov al, “ “ ; в al загружается пробел
lea di, string ; в di загружается адрес строки
mov cx, 15
rep stosb ; пересылать 15 байт (пробелов)
:
.
Ввод элемента цепочки из порта в строку
ins <приемник>, <порт>
insb
insw
insd
b,d,w – размеры пересылаемых элементов.
Номер порта должен быть записан в регистр dx. Адрес приемника записать в es:di. Размер элемента цепочки должен быть согласован с элементом порта. В CX указать количество пересылаемых байт (слов, двойных слов). После ввода элемента команда ins производит коррекцию содержимого регистра di на величину, равную размера элемента.
push ds
pop es
mov dx, 5000h
lea di, pole ; адрес строки
mov cx, 10 ; в cx количество пересылаемых байт
rep insb
:
-
Вывод элемента цепочки в порт
Outs <порт>, <источник>
outsb
outsw
outsd
Для работы этой команды необходимо предусмотреть:
-
номер порта записать в регистр dx
-
адрес источника записать в пару регистров DS: SI/ESI
-
размерность элемента строки совпадает с элементом порта.
Пример
mov dx, 378h
lea di, string
mov cx, 16
rep outsb
-
Циклы
Для многократного выполнения некоторого блока команд используется команда loop <метка>
Команда контролирует состояние регистра – счетчика цикла CX. Если состояние счетчика cx <> 0, то управление передается на метку в начале цикла, если cx=0, то происходит выход из цикла. После каждого выполнения тела цикла состояние счетчика cx уменьшается на единицу.
Для преждевременного выхода из цикла применяются команды:
loope (или loopz)<метка>
Если cx>0 и zf=1, то управление передается на метку.
Если cx=0 или zf=0, то управление передается на следующую команду.
loopne (или loopnz)<метка>
Если cx>0 и zf=0, то управление передается на метку.
Если cx=0 или zf=1, то управление передается на следующую команду
Фрагмент программы поясняет обнуление некоторого массива данных:
.
Пример простейшего цикла.
Программа выполняет обнуление массива
.data
mas db 1,2,3,4,5,6,7,8,9,10
.code
………….
mov bx, offset mas
mov si, 0
mov cx, 10
nul:
mov [bx] [si], 0 ; обнуление
inc si
loop nul ; управление на метку nul и cx уменьшается на 1
;выход из цикла, когда CX=0
…………….
Пример использования в цикле команды loopne.
В данном примере программа находит в массиве нулевой байт и выходит из цикла.
.data
len equ 10
mas db 1,0,9,8,0,7,8,0,2,0
mes db “Нет нулевых элементов $”
.code
start:
mov ax,@data
mov ds,ax
mov cx,len
xor ax,ax
xor si,si
mov si,-1
cicl:
inc si
cmp mas[si],0
loopne cicl
jz exit ;если найден 0, то выход
mov ah,9
mov dx,offset mes ;иначе – нет нулей в строке
int 21h
exit:
mov ax,4c00h
int 21h
end start