Машинно-ориентированное программирование
Ассемблер точно отражает все особенности машинного языка. Именно поэтому, в отличие от языков высокого уровня, язык ассемблера для каждого типа компьютеров свой.
Содержание
Термины
Регистры процессора
- Регистры общего назначения
- Индексные регистры
- Регистры-указатели
- Сегментные регистры
- Управляющие регистры
- Регистры флагов
Директивы
Ограничения на использование режимов адресации
Команды
- Команды общего назначения
- Команды работы со стеком
- Арифметические команды
- Команды безусловной передачи управления
- Команды условной передачи управления
- Команды управления циклом
Термины
Физический адрес – это номер каждого байта, его уникальный адрес.
Сегмент – это независимый, поддерживаемый на аппаратном уровне, блок памяти.
База – это хранилище адреса оперативной памяти.
Флаг – это бит, принимающий значение 1, если выполнено некоторое условие, и значение 0 в противном случае.
Метка – это символьное имя, обозначающее ячейку памяти, которая содержит некоторую команду.
Стек – это область памяти, специально выделяемая для временного хранения данных программы.
Прерывание – это временное прекращение основного процесса вычислений для выполнения некоторых запланированных или незапланированных действий, вызванных работой устройств или программы.
Регистры процессора
Всего процессор содержит 12 программно-доступных регистров, а также регистр флагов и указатель команд.
Регистры общего назначения
Регистры общего назначения используются для хранения данных и выполнения различных арифметических и логических операций.
eax
(Accumulator) – универсальный аккумулятор значений.ebx
(Base) – хранение базового адреса.ecx
(Counter) – регистр-счетчик.edx
(Data) – хранение промежуточных данных.
Данные регистры являются 32-разрядными и делятся на две части по 16 бит, старшая часть не доступна, а младшая (ax
, bx
, cx
, dx
) тоже делится на две части по 8 бит (ah
, al
, bh
, bl
, ch
, cl
, dh
, dl
). Младшие части регистров имеют в названии букву L (от слова Low), а старшие H (от слова High).
Индексные регистры
Индексные регистры предназначены для хранения индексов при работе с массивами.
esi
(Source Index) – индекс источника.edi
(Destination Index) – индекс приёмника.
Данные регистры являются 32-разрядными и имеют младшие 16-разрядные части (si
и di
).
Регистры-указатели
Регистры-указатели используются для работы со стеком.
ebp
(Base Pointer) – указатель базы.esp
(Stack Pointer) – указатель вершины.
Данные регистры являются 32-разрядными и имеют младшие 16-разрядные части (bp
и sp
).
Сегментные регистры
Сегментные регистры предназначены для обеспечения сегментной адресации.
cs
(Code Segment) – сегмент кода.ds
(Data Segment) – сегмент данных.ss
(Stack Segment) – сегмент стека.es
(Enhanced Segment) – дополнительный сегмент данных.
Данные регистры являются 16-разрядными.
Управляющие регистры
eip
(Extended Instruction Pointer) – смещение следующей подлежащей выполнению команды относительно начала сегмента кода.
Данный регистр 32-разрядный, имеет младшую 16-разрядную часть (ip
).
Регистры флагов
Регистр флагов содержит отдельные биты: флаги управления и признаки результата.
Примечание. Ниже представлены не все флаги.
Флаги управления
df
(Direction) – флаг направления. Управляет направлением обработки строк данных.
0 – от младших адресов к старшим.
1 – от старших адресов к младшим.
Флаги состояния
cf
(Carry) – флаг переноса. Идентифицирует перенос или заем при выполнении арифметических операций, а также служит индикатором ошибки при обращении к системным функциям.
0 – переноса или заема не было.
1 – арифметическая операция произвела перенос или заем из старшего бита результата.zf
(Zero) – флаг нулевого результата.
0 – результат ненулевой.
1 – результат нулевой.sf
(Sign) – флаг знака. Отражает состояние старшего бита результата.
0 – старший бит результата равен 0 (результат положительный).
1 – старший бит результата равен 1 (результат отрицательный).of
(Overflow) – флаг переполнения. Используется для фиксирования факта потери значащего бита при арифметических операциях.
0 – в результате операции не происходит переноса(заема) в(из) старшего, знакового бита результата.
1 – в результате операции происходит перенос(заем) в(из) старшего, знакового бита результата.
Системные флаги
if
(Interrupt) – флаг прерывания. Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний.
0 – аппаратные прерывания запрещены.
1 – аппаратные прерывания разрешены.
Директивы
В языке ассемблера директивы указывают общую информацию.
Директивы объявления данных
Формат директив:
имя директива операнд
Примечание. Если операндов несколько, то они перечисляются через запятую.
db
(Byte) – резервирование памяти для данных размером 1 байт.
Со знаком: (-128; 127). Без знака: (0; 255).dw
(Word) – резервирование памяти для данных размером 2 байта.
Со знаком: (-32 768; 32 767). Без знака: (0; 65 535).dd
(Doubleword) – резервирование памяти для данных размером 4 байта.df
иdp
– резервирование памяти для данных размером 6 байт.dq
(Quadword) – резервирование памяти для данных размером 8 байт.dt
– резервирование памяти для данных размером 10 байт.
Примечание. Знак ?
на месте операнда означает резервирование данных.
Директива определения модели памяти
Директива model
связывает сегменты, которые в случае использования упрощенных директив сегментации имеют предопределенные имена, с сегментными регистрами.
Синтаксис:
model модель памяти
Модели памяти
Примечание. Представлены не все модели памяти.
tiny
. Тип кода: near. Тип данных: near. Весь код и все данные комбинируются в одну группу с именем DGROUP. Используется для программ формата .com. Во многих языках высокого уровня не поддерживается.small
. Тип кода: near. Тип данных: near. Код представляет собой один сегмент. Все данные комбинируются в группу с именем DGROUP. Эту модель обычно используют для большинства программ на ассемблере.
Упрощенные директивы определения сегмента
Примечание. Представлены не все упрощенные директивы определения сегмента.
.code
[имя]
– начало или продолжение сегмента кода..data
– начало или продолжение сегмента инициализированных данных. Используется для определения данных типа near..const
– начало или продолжение сегмента постоянных данных (констант) модуля..stack
[размер]
– начало или продолжение сегмента стека модуля. Необязательный параметр[размер]
задает размер стека.
Идентификаторы, создаваемые директивой model
Примечание. Представлены не все идентификаторы.
@code
– физический адрес сегмента кода.@data
– физический адрес сегмента данных типа near.@stack
– физический адрес стека.
Ограничения на использование режимов адресации
- Оба операнда должны иметь одинаковую длину.
- Оба операнда не могут одновременно быть памятью.
- Получатель не может быть регистром
cs
,ip
,eip
. - Нельзя в сегментный регистр пересылать непосредственное значение.
- Приемником не может быть непосредственный режим адресации.
Команды
Команды ассемблера делятся на 6 групп: команды пересылки данных, арифметические команды, логические команды, команды передачи управления, цепочечные команды и команды управления состоянием ЦП.
Примечание. Представлены не все команды.
Команды общего назначения
- Команда
mov
Синтаксис:mov приемник, источник
Копирование содержимого из операнда-источника в операнд-приемник. - Команда
xchg
Синтаксис:xchg операнд, операнд
Обмен значениями между операндами.
Команды работы со стеком
- Команда
push
Синтаксис:push источник
Запись значения в вершину стека. При работе этой команды значение регистраsp
/esp
уменьшается на 2/4. - Команда
pop
Синтаксис:pop приемник
Извлечение значения из вершины стека. При работе этой команды значение регистраsp
/esp
увеличивается на 2/4.
Арифметические команды
- Команда
add
Синтаксис:add приемник, источник
Сложение двух целочисленных двоичных операндов. Результат помещается на место первого операнда. - Команда
sub
Синтаксис:sub приемник, источник
Вычитание двух целочисленных двоичных операндов. Результат помещается на место первого операнда. - Команда
cmp
Синтаксис:cmp приемник, источник
Операнды приемник и источник сравниваются методом вычитания, при этом сами операнды не изменяются. По результатам сравнения устанавливаются флаги.
Примечание. Записьx:y
означает, что старшая часть находится вx
, а младшая — вy
.
- Команда
mul
Синтаксис:mul операнд
Целочисленное умножение без учёта знака. В зависимости от типа операнда (байт/слово/двойное слово) множитель по умолчанию беретсяal
/ax
/eax
, и результат записывается вax
/dx:ax
/edx:eax
. - Команда
div
Синтаксис:div операнд
Целочисленное умножение без учёта знака. В зависимости от типа операнда (байт/слово/двойное слово) делимое по умолчанию беретсяax
/dx:ax
/edx:eax
и результат записывается вal
(целая часть) иah
(остаток)/ax
(целая часть) иdx
(остаток)/eax
(целая часть) иedx
(остаток).
Команды безусловной передачи управления
- Команда
jmp
Синтаксис:jmp операнд
Переход на команду, адрес которой передается операнду, без сохранения информации в точке возврата. - Команда
call
Синтаксис:call операнд
Вызов процедуры или переключение задачи.
Синтаксис описания процедуры:
имя процедуры proc тело процедуры имя процедуры endp
Команды условной передачи управления
Перечень команд условного перехода для команды cmp приемник, источник
.
- Команда
je
Синтаксис:je метка
Типы операндов командыcmp
: любые.
Критерий условного перехода:приемник
=источник
.
Значения флагов для осуществления перехода:zf
= 1. - Команда
jne
Синтаксис:jne метка
Типы операндов командыcmp
: любые.
Критерий условного перехода:приемник
≠источник
.
Значения флагов для осуществления перехода:zf
= 0. - Команды
jl/jnge
Синтаксис:jl метка
илиjnge метка
Типы операндов командыcmp
: со знаком.
Критерий условного перехода:приемник
<источник
.
Значения флагов для осуществления перехода:sf
≠of
. - Команды
jle/jng
Синтаксис:jle метка
илиjng метка
Типы операндов командыcmp
: со знаком.
Критерий условного перехода:приемник
≤источник
.
Значения флагов для осуществления перехода:sf
≠of
илиzf
= 1. - Команды
jg/jnle
Синтаксис:jg метка
илиjnle метка
Типы операндов командыcmp
: со знаком.
Критерий условного перехода:приемник
>источник
.
Значения флагов для осуществления перехода:sf
=of
иzf
= 0. - Команды
jge/jnl
Синтаксис:jge метка
илиjnl метка
Типы операндов командыcmp
: со знаком.
Критерий условного перехода:приемник
≥источник
.
Значения флагов для осуществления перехода:sf
=of
. - Команды
jb/jnae
Синтаксис:jb метка
илиjnae метка
Типы операндов командыcmp
: без знака.
Критерий условного перехода:приемник
<источник
.
Значения флагов для осуществления перехода:cf
= 1. - Команды
jbe/jna
Синтаксис:jbe метка
илиjna метка
Типы операндов командыcmp
: без знака.
Критерий условного перехода:приемник
≤источник
.
Значения флагов для осуществления перехода:cf
= 1 илиzf
= 1. - Команды
ja/jnbe
Синтаксис:ja метка
илиjnbe метка
Типы операндов командыcmp
: без знака.
Критерий условного перехода:приемник
>источник
.
Значения флагов для осуществления перехода:cf
= 0 иzf
= 0. - Команды
jae/jnb
Синтаксис:ja метка
илиjnbe метка
Типы операндов командыcmp
: без знака.
Критерий условного перехода:приемник
≥источник
.
Значения флагов для осуществления перехода:cf
= 0.
Команды управления циклом
- Команда
loop
Синтаксис:loop метка
Декремент содержимого регистраcx
/ecx
. Анализ регистраcx
/ecx
: еслиcx
/ecx
=0, передать управление следующей заloop
команде, еслиcx
/ecx
≠0, передать управление команде, метка которой указана в качестве операнда.