196.21K
Категория: ПрограммированиеПрограммирование

Программирование на языке ассемблер. Система команд процессора

1.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Лекция №2.
Система команд процессора

2.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Структура машинной команды
Машинная команда представляет собой закодированную информацию о выполняемом
процессором действии.
Байт режима адресации modr/m – определяет режим работы с адресом. Поле mod на
рисунке определяет количество байт адреса.
Префиксы – необязательные элементы машинной команды, модифицирующие выполнение
Поле sib
Байт
reg/коп
-команды.
используется
определяет
для
содержимое
задания адресов
первого
операторов.
операнда,
это
Приможет
этом
поля
бытьmod
либо
ирегистр,
b r/m имеют
машиной
Префикс
повторения
позволяет
организовать
цепочное
исполнение
Значение
Описание
либо продолжение
следующие
значения
кода
mod=01
операции.
илипозволяет
mod=10,
r/m=100.
Поля
байта sib
команд;
префикс
адреса
менятьадрес
разрядность
(16имеют
или
32следующие
разрядов);
Смещение
не используется,
определяется
Код операции
Поле
смещения
– обязательный
вразмера
команде
– 8,элемент
16 или
32
машинной
разрядное
команды,
значение
обозначающий
адреса
операнда.
выполняемое
00
Поле r/mразмера
значения:
используется
ss – масштабный
совместно
множитель
с полем
дляmod
индексного
и определяет
регистра,
использование
возможные
первого
значения 1, 2,
содержимым
базового
иразмер
индексного
регистров.
префикс
оператора
позволяет
менять
оператора
(16
или
32
разряда);
действие.
Непосредственный
операнд – 8, 16 или 32 разрядное числовое значение.
01может
Смещение
имеет
размер
байт. использоваться
операнда,
4
или 8; замены
index
который
– номер
регистра
быть используемого
либо
регистром,
в1 либо
качестве
индексного; для
baseвычисления
– номер
префикс
сегмента
позволяет
сменить
сегменты;
Смещение имеет размер 2 или 4 байта (в зависимости от
эффективного
базового
регистра.
адреса
10 (при значении mod=11).
11
режима).
Память не используется, все операторы размещаются в
регистрах или заданы числовыми значениями.

3.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Способы задания операндов
• Неявный способ – команда работает с конкретными,
уже заранее известными операндами или регистрами.
• Непосредственный операнд - операнд находится в
самой команде, см. выше.
• Регистровый операнд – операнд размещается в одном
из регистров процессора.
• Размещение операнда в памяти – в качестве адреса
используется адрес ячейки памяти.
• Порт ввода/вывода – в качестве операнда выступает
адрес ячейки памяти выделенной для обмена с внешними
устройствами, например LPT, COM.
• Стек – в качестве операнда выступает стек.

4.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Способы адресации
• Относительная прямая адресация – эффективный
адрес формируется как сумма содержания операнда
программы и регистра указателя команд ip/eip.
Например, переход на указанное количество
операторов, относительно текущей команды.
• Абсолютная прямая адресация – эффективный
адрес содержится в поле операнда.
• Косвенная адресация – адрес размещается в
одном из регистров, например: [ecx] (имя регистра
заключается в квадратные скобки).

5.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Классификация машинных команд
Все машинные команды можно разбить на группы:
Пересылки данных:
• общего назначения;
• работа со стеком;
• преобразования типов.
Арифметические:
• двоичные;
• десятичные.
Логические:
• побитовые;
• сдвиг.
Передачи управления:
• безусловные;
• условные.
Цепочные
Управление состоянием процессора:
• работа с флагами;
• работа с системными регистрами.

6.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Команды пересылки данных
Пересылка данных – mov.
Формат команды: mov <операнд назначения> <операнд источник>
К примеру, рассмотрим фрагмент программы для пересылки байта из
ячейки
fls в ячейку
fld: mov:
Особенности
команды
Примерпересылать данные из одной
• Команда mov не может непосредственно
области памяти в другую, дляmasm
подобной пересылки необходимо
воспользоваться одним из регистров.
model small
• Нельзя загрузить в сегментный
.dataрегистр значение непосредственно из
памяти.
fls db 5
• Нельзя переслать содержимое
одного
сегментного регистра в другой.
fld db
?
• Нельзя использовать сегментный
.code регистр cs в качестве операнда назначения
(в данном регистре содержится
адрес следующей команды, изменение его
start:
значения приведет к сбою работы
программы).
...
• Примечание: При пересылки
данных
mov
al,fls необходимо не забывать о типе
переменных, для преобразования
типов используется оператор ptr.
mov fld,al
...
end

7.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Обмен данными – xchg.
• Формат команды: xchg <первый операнд>
<второй операнд>
• Команда xchg позволяет поменять данные.
Обмениваемые данные должны иметь
один тип, не допускается обмен
содержимого двух ячеек памяти.

8.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Команды работы с портам ввода/вывода
Работу оборудованием компьютера можно представить в виде
изображенном на рисунке.
Программа
Функции операционной системы
Функции BIOS
… Порты ввода/вывода …
Аппаратура компьютера

9.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Для взаимодействия с аппаратурой компьютера в
адресном пространстве выделен определенный
диапазон адресов, называемых портами
ввода/вывода.
Для работы с портами предусмотрены команды:
in <регистр> <порт>
out <порт> <регистр>
Пример
k equ 100
in ax, 200;
in al, k;
out 30h, ax ;

10.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Таймер i8253
Регистр
управления
(порт 43h)
Системные часы
Канал 0
Порт 40h
(частота 1.19 МГц)
Канал 1
Порт 41h
Канал 2
Регистр ввода/вывода
(порт 42h)
Регистр-защелка
Регистр-счетчик
(count=count-1)
Count = = 0
Да
И
И
I8255
Порт 61h
7
6
5
4
3
2
1
0
Режим
переноса
определяется
Организация
работы
Служебные
регистры
каждого
Для программирования
звука
значением
регистра
состояния
Выходы
каждого
из
каналов
канала
имеют
следующие
встроенного
динамика.
необходимо
проделать
(порт 43h). Назначения битов
подключены
к соответствующим
характеристики:
регистр
Для
генерации
звука
следующие
действия:
регистра
представлены
наКанал 0
устройствам компьютера.
ввода/вывода
–43h
8 разрядов;
используется
микросхема
Занести
в контроллер
порт
режим
рисунке. на
подается
регистр
таймера
и и регистр
прерываний
и является
работы защелка
иi8253
тип
операции
счетчик
– по
16 разрядов.
источником
аппаратного
программируемого
передачи
значения
в канал,
прерывания
от
таймера,
Значение,
в(0b6h).
периферийного
интерфейса
напримерзаписанное
– 10110110
возникающего
18.2 раз в секунду.
регистр
ввода/вывода
(порт
i8255.
Подать
ток
на
динамик,
Канал 1 является источником для
42h),
сразу
же
этого
необходимо
установить
служебных
сигналов
Таймер имеет тридля
канала,
переписывается
в регистрконтроллера
прямого
доступа к
бит
1
порта
61h.
построенных по одинаковому
защелку,
значение
которого
памяти.
Рассматриваемый
нами
Видно,
динамик будет
Через что
служебный
регистр
принципу.
На
таймер
канал
2, подключен
к динамику.
издавать
звук
если
установлены
сохраняется
неизменным
записать
значение
вспорт до
42h,
подаются
импульсы
соответствующие
значения битов
следующего
обращения.
определяющие
высоту
тона.
частотой
с
по адресу 1.19
61h и МГц
значение
счетчика count=0.
системных
часов.

11.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Работа с адресами и указателями
При разработки программ на ассемблере часто
приходится работать с адресами переменных. Для
поддержки данных операций создана группа команд:
• lea назначение, источник
• lds назначение, источник
• les назначение, источник
• lgs назначение, источник
• lfs назначение, источник
• lss назначение, источник

12.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Загрузка эффективного адреса – lea
Команда lea записывает эффективный адрес регистр
назначение.
Загрузка полного адреса. Команды lds, les, lfs и lss
позволяют получить полный адрес переменный. Полный
адрес переменной, состоящий из сегментной части и
смещения, размещается в указанной паре регистров.
Пример
mov
di,4
lea bx,mas[di]
;или
lea bx,mas[4]

13.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Назначение команд загрузки полного адреса
представлено в таблице
Команда
Действие
Lds
загрузка указателя в регистр сегмента данных ds
Les
загрузка указателя в регистр дополнительного сегмента данных es
Lgs
загрузка указателя в регистр дополнительного сегмента данных gs
Lfs
загрузка указателя в регистр дополнительного сегмента данных fs
Lss
загрузка указателя в регистр дополнительного сегмента данных ss
Пример
les reg,mem
эквивалентна следующей группе команд:
mov reg,word ptr mem
mov es,word ptr mem+2

14.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Подстановка данных из таблицы
Команды xlat. Функция xlat замещает значение в регистре al
байтом из таблицы. Номер элемента таблицы определяе6тся
старым значением al.
Формат команды:
xalt [адрес таблицы]
Адрес таблицы должен быть предварительно загружен в
регистр bx (с помощью команды lea). Максимальная длинна
таблицы – 256 байт.
Пример
al
5
6
al
1
4
2
0
1
7
4
7

15.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Работа со стеком
Для работы со стеком выделяются следующие регистры:
ss – сегментный регистр;
sp/esp – Регистр указателя стека;
bp/ebp – регистр указателя базы кадра.
Максимальный размер стека 64Кбайт.
Принцип работы стека иллюстрируется на рисунке.
ss : 0000
ss : sp
Вершина стека
ss : ffff
Дно стека

16.

Программирование на языке ассемблер
к.т.н., проф. Красов А.В.
Для работы со стеком есть следующие команды
Записать значение в стек push.
Формат команды: push <Источник>
Команда push помещает значение в стек, при этом указатель ss:sp уменьшается на 2.
Прочитать значение из стека pop.
Формат команды: pop <Куда>
Команда pop извлекает значение из стека и записывает его по указанному адресу, при этом
указатель ss:sp увеличивается на 2.
Записать в стек все регистры pusha. По команде pusha в стек последовательно заносятся
значение регистров ax, cx, dx, bx, sp, bp, si, di. Заносимое в стек значение регистра sp соответствует
значению указателя до выполнения команды push.
Значение указателя сдвигается после помещения значений регистров в стек.
Записать в стек все регистры pushw. В отличие от команды pusha, команда работает с
регистрами размером в одно машинное слово не зависимо от разрядности модели памяти. При
модели памяти use16 команды pusha и pushw полностью идентичны.
Извлечь значение регистров из стека popa и popw. Команды popa и popw позволяют извлечь
значения регистров из стека.
Сохранить значение регистра флагов pushf и pushfw. Команды pushf и pushfw позволяют
сохранить в стеке содержимое регистра флагов.
Извлечь из стека значение регистра флагов popf и popfw. Команды popf и popfw позволяют
извлечь из стека значение регистра флагов.
English     Русский Правила