- •Архитектура пэвм
- •Пользовательские регистры
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры состояния и управления
- •Регистры защищенного режима:
- •Организация памяти (реальный режим)
- •Элементы синтаксиса Ассемблера
- •Операторы
- •Директивы сегментации
- •Модели памяти
- •Идентификаторы, создаваемые директивой 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
- •Структура шлюза вызова
-
Пример использования вложенных циклов
Программа заменяет все нулевые байты в области памяти на значение 0ffh
model small
.stack 100h
.data
mas db 1,0,9,8,0,7,8,0,2,0
db 1,0,9,8,0,7,8,0,2,0
db 1,0,9,8,0,7,8,0,2,0
db 1,0,9,8,0,7,8,0,2,0
db 1,0,9,8,0,7,8,0,2,0
.code
start:
mov ax,@data
mov ds,ax
xor ax,ax
lea bx,mas
mov cx,5
cycl1:
push cx
xor si,si
mov cx,10
cycl2:
cmp byte ptr [bx+si],0
jne nozero
mov byte ptr [bx+si],0ffh
nozero:
inc si
loop cycl2
pop cx
add bx,10
loop cycl1
mov ax,4c00h
int21h
end start
-
Массивы
Массив – структурированный тип данных, состоящий из некоторого числа элементов одного типа.
Специальных средств описания массивов в ассемблере не существует, поэтому программист должен знать:
-
как в программах на ассемблере описать массив,
-
как инициализировать массив,
-
как организовать доступ к элементам массива,
-
как организовать выполнение типовых операций с массивами.
Массив в программе можно смоделировать одним из следующих способов:
-
перечисление элементов массива
mas dd 1, 2, 3, 4, 5 ;массив из 5 двойных слов
-
используя оператор повторения
mas dw 10 dup (0) ;массив из 10 нулевых слов
-
используя директивы label и rept
Директива rept относится к макросредствам языка ассемблера и вызывает повторение указанное число раз строк, заключенных между rept и endm.
В качестве метки одной области памяти можно использовать разные имена. Каждому имени соответствует указанный тип данных. В примере можно обращаться к массиву байт по метке masb, либо к массиву слов по метке masw.
masb label byte
masw label word
rept 4
dw 0f1f0h ;массив из 4 повторяющихся слов 0f1f0h
endm
.
В общем случае для получения адреса элемента в одномерном массиве необходимо базовый адрес массива сложить с произведением индекса этого элемента (начиная с нуля) на размер элемента массива.
Адрес = База + (Индекс * Размер элемента массива).
Для работы с массивами используются базовые и индексные регистры, позволяющие реализовать несколько режимов адресации данных.
Индексная адресация со смещением.
Эффективный адрес формируется из двух компонент:
постоянного (базового), указывающего на прямой адрес массива в виде имени идентификатора;
переменного (индексного), указывающего на имя индексного регистра.
Пример:
.data
mas dw 0,1,2,3,4,5
……………..
mov si,0
mov ax,mas[si] ;записать в регистр ax слово 0
mov si,2
mov ax,mas[si] ;записать в регистр ax слово 1
Базовая индексная адресация со смещением
Этот вид адресации используется при работе с двумерными массивами.
Эффективный адрес формируется максимум из трех компонентов:
постоянного (необязательного), указывающего на прямой адрес массива в виде имени идентификатора;
переменного (базового) – имени базового регистра;
переменного (индексного) – имени индексного регистра.
Микропроцессор позволяет масштабировать содержимое индексного регистра (умножать на 2, 4, 8), что обеспечивает вычисление адресов операндов типа w, dw, dd
Пример:
mov eax, mas[ebx*4] ; mas +(ebx)*4
mov ax, mas[ebx] [ecx*2] ; mas +(ebx)+(ecx)*2
sub ax, [ebx+8] [ecx*4] ; (ebx)+8+(ecx)*4
Программист должен трактовать некоторую область памяти как двумерный массив. При этом можно выбрать расположение элементов массива в памяти: по строкам или по столбцам.
Если последовательность однотипных элементов трактуется как двумерный массив, расположенный по строкам, то адрес элемента (i,j) вычисляется по формуле:
база + i*m*d + j*d
где m – число столбцов в массиве,
i – номер строки (0…n-1),
j- номер столбца (0…m-1),
d- размер элемента в массиве (1,2,4,6….).
Пусть число строк в массиве n=4, и число столбцов m=3.
0 2 4
6 8 10
12 14 16
18 20 22
Вычислить адрес элемента во второй строке и первом столбце (i=2, j=1) массива слов mas.
Эффективный адрес элемента массива:
mas(2,1)=mas+2*3*2+1*2=mas+14
Вычисленный адрес указывает на число 14 (совпадает с адресом)
Пример программы
Программа ищет в массиве число 10
.data
mas dw 0, 2, 4, 6, 8, 10, 12, 14,16, 18, 20, 22
found db 0 ; счетчик успешных попыток
d=2
m=3 ;число столбцов в массиве
n=4 ;число строк в массиве
elem=10 ;элемент для поиска
.code
…….
mov bx,0 ; начало с нулевой строки
mov si,0 ; нулевой столбец
mov cx,4 ;параметр внешнего цикла по строкам
exter: ;начало внешнего цикла
push cx ;сохраним в стеке счетчик внешнего цикла
mov cx,3 ; параметр внутреннего цикла по столбцам
mov si,0
inter: ;начало внутреннего цикла
mov ax,mas [bx] [si*2]
inc si
cmp ax,elem
jne $+6
inc found
loop inter
pop cx
add bx,m*d
loop exter
…
….