Программирование на Ассемблер к.т.н., доц. Красов А.В. Лекция 3 Факультет Курс Семестр Форма контроля Лекции Лабораторные работы МТС 3 6 зачет 14 часов 12 часов Автор курса к.т.н., доцент Красов Андрей Владимирович директор УИЦ ИТТ, доцент кафедры ИБТС Куратор специальности 201800 «Защищенные системы связи» Структура машинной команды Машинная команда представляет собой закодированную информацию о выполняемом процессором действии. Структура машинной команды приведена на рис. 3.1. Однобайтовые префиксы: Количество байт повторения 1 или 2 0 или 1 размера адреса код байт размер операнда операции modr/m 0 или 1 0,1,2 или 4 0,1,2 или 4 байт смещение непосредственный sib в команде операнд замены сегмента блокировки шины mod 7 reg/КОП 6 Ss r/m 5 4 3 2 1 0 7 6 index 5 4 base 3 2 1 0 Рис.3.1. Структура машинной команды Префиксы – необязательные элементы машинной команды, модифицирующие выполнение машиной команды. Префикс повторения позволяет организовать цепочное исполнение команд; префикс размера адреса позволяет менять разрядность (16 или 32 разрядов); префикс размера оператора позволяет менять размер оператора (16 или 32 разряда); префикс замены сегмента позволяет сменить сегменты; Код операции – обязательный элемент машинной команды, обозначающий выполняемое действие. Байт режима адресации modr/m – определяет режим работы с адресом. Поле mod на рис.3.1, определяет количество байт адреса. Возможные значения поля mod приведены в табл.3.1. Таблица 3.1. Значения поля mod Значение 00 01 10 11 Описание Смещение не используется, адрес определяется содержимым базового и индексного регистров. Смещение имеет размер 1 байт. Смещение имеет размер 2 или 4 байта (в зависимости от режима). Память не используется, все операторы размещаются в регистрах или заданы числовыми значениями. Поле reg/коп определяет содержимое первого операнда, это может быть либо регистр, либо продолжение кода операции. Поле r/m используется совместно с полем mod и определяет использование первого операнда, который может быть либо регистром, либо использоваться для вычисления эффективного адреса (при значении mod=11). Байт sib – используется для задания адресов операторов. При этом поля mod и b r/m имеют следующие значения mod=01 или mod=10, r/m=100. Поля байта sib имеют следующие значения: ss – масштабный множитель для индексного регистра, возможные значения 1, 2, 4 или 8; index – номер регистра используемого в качестве индексного; base – номер базового регистра. Поле смещения в команде – 8, 16 или 32 разрядное значение адреса операнда. Непосредственный операнд – 8, 16 или 32 разрядное числовое значение. Способы задания операндов Неявный способ – команда работает с конкретными, уже заранее известными операндами или регистрами. Непосредственный операнд – операнд находится в самой команде, см. выше. Регистровый операнд – операнд размещается в одном из регистров процессора. Размещение операнда в памяти – в качестве адреса используется адрес ячейки памяти. Порт ввода/вывода – в качестве операнда выступает адрес ячейки памяти выделенной для обмена с внешними устройствами, например LPT, COM. Стек – в качестве операнда выступает стек. Способы адресации Относительная прямая адресация – эффективный адрес формируется как сумма содержания операнда программы и регистра указателя команд ip/eip. Например, переход на указанное количество операторов, относительно текущей команды. Абсолютная прямая адресация – эффективный адрес содержится в поле операнда. Косвенная адресация – адрес размещается в одном из регистров, например: [ecx] (имя регистра заключается в квадратные скобки). Классификация машинных команд Все машинные команды можно разбить на группы: ●Пересылки данных: ►общего назначения; ►работа со стеком; ►преобразования типов. ●Арифметические: ►двоичные; ►десятичные. ● Логические: ►побитовые; ►сдвиг. ● Передачи управления: ►безусловные; ►условные. ● Цепочные ● Управление состоянием процессора: ►работа с флагами; ►работа с системными регистрами. Команды пересылки данных Пересылка данных – mov. Формат команды: mov <операнд назначения> <операнд источник> Особенности команды mov: ●Команда mov не может непосредственно пересылать данные из одной области памяти в другую, для подобной пересылки необходимо воспользоваться одним из регистров. ●Нельзя загрузить в сегментный регистр значение непосредственно из памяти. ●Нельзя переслать содержимое одного сегментного регистра в другой. ●Нельзя использовать сегментный регистр cs в качестве операнда назначения (в данном регистре содержится адрес следующей команды, изменение его значения приведет к сбою работы программы). Примечание: При пересылки данных необходимо не забывать о типе переменных, для преобразования типов используется оператор ptr. Обмен данными – xchg. Формат команды: xchg <первый операнд> <второй операнд> Команда cxhg позволяет поменять данные. Обмениваемые данные должны иметь один тип, не допускается обмен содержимого двух ячеек памяти. Команды работы с портам ввода/вывода Работу оборудованием компьютера можно представить в виде изображенном на рис. 3.2. Рис. 3.2. Работа программы с аппаратурой компьютера Для взаимодействия с аппаратурой компьютера в адресном пространстве выделен определенный диапазон адресов, называемых портами ввода/вывода. Программа может организовать взаимодействие с аппаратурой одним из трех способов, представленных на рис. 3.2. В данном курсе рассматривается работа программы с аппаратурой непосредственно через порты ввода/вывода. Для работы с портами предусмотрены команды: in <регистр> <порт> out <порт> <регистр> В качестве примера работы с портами приведем организацию работы встроенного динамика. Для генерации звука используется микросхема таймера i8253 и программируемого периферийного интерфейса i8255. Таймер имеет три канала, построенных по одинаковому принципу. На таймер подаются импульсы с частотой 1.19 МГц с системных часов. Выходы каждого из каналов подключены к соответствующим устройствам компьютера. Канал 0 подается на контроллер прерываний и является источником аппаратного прерывания от таймера, возникающего 18.2 раз в секунду. Канал 1 является источником служебных сигналов для контроллера прямого доступа к памяти. Рассматриваемый нами канал 2, подключен к динамику. Служебные регистры каждого канала имеют следующие характеристики: регистр ввода/вывода – 8 разрядов; регистр защелка и регистр счетчик – по 16 разрядов. Значение, записанное в регистр ввода/вывода (порт 42h), сразу же переписывается в регистр-защелку, значение которого сохраняется неизменным до следующего обращения. Режим переноса определяется значением регистра состояния (порт 43h). Назначение битов регистра представлены на рис. 3.3. Из рис. 3.2 видно, что динамик будет издавать звук если установлены соответствующие значения битов по адресу 61h и значение счетчика count=0. Для программирования звука необходимо проделать следующие действия: Занести в порт 43h режим работы и тип операции передачи значения в канал, например – 10110110 (0b6h). Подать ток на динамик, для этого необходимо установить бит 1 порта 61h. Через служебный регистр записать значение в порт 42h, определяющие высоту тона. Работа с адресами и указателями При разработки программ на ассемблере часто приходится работать с адресами переменных. Для поддержки данных операций создана группа команд: lea назначение, источник lds назначение, источник les назначение, источник lgs назначение, источник lfs назначение, источник lss назначение, источник Загрузка эффективного адреса - lea. Команда lea записывает эффективный адрес регистр назначение. Загрузка полного адреса. Команды lds, les, lfs и lss позволяют получить полный адрес переменный. Полный адрес переменной, состоящий из сегментной части и смещения, размещается в указанной паре регистров. Назначение команд загрузки полного адреса представлено в табл.3.2. Таблица 3.2. Назначение команд загрузки полного адреса Подстановка данных из таблицы Команда xalt. Функция xalt замещает значение в регистре al байтом из таблицы. Номер элемента таблицы определяется старым значением al. Формат команды: xalt [адрес таблицы] Адрес таблицы должен быть предварительно загружен в регистр bx (с помощью команды lea). Максимальная длинна таблицы – 256 байт. Работа со стеком Для работы со стеком выделяются следующие регистры: ss – сегментный регистр; sp/esp – Регистр указателя стека; bp/ebp – регистр указателя базы кадра. Максимальный размер стека 64Кбайт. Принцип работы стека иллюстрируется на рис. 3.4. Для работы со стеком есть следующие команды. Записать значение в стек: 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 позволяют извлечь из стека значение регистра флагов.