Похожие презентации:
Основы языка Ассемблера
1. Основы языка Ассемблера. Команды Ассемблера
Лекция 1_2026Основы языка
Ассемблера.
Команды
Ассемблера
© 2026
2. Конах Валентина Владимировна, ауд. 529
Пример ассемблерной программы(16-битный ассемблер)
1)
2)
3)
4) message
5)
6)
7)
8)
9)
10)
11)
.model small
.stack 100h
.data
db
'Hello, world!',13,10,'$'
.code
.startup
mov
dx, offset message
mov
ah, 9
int
21h
.exit
end
4
3.
Введение в машинно-ориентированноепрограммирование
Схематическое изображение уровня языков
программирования
5
4. Пример ассемблерной программы (16-битный ассемблер)
Введение в машинно-ориентированноепрограммирование
Процессор представляет собой электронное
устройство, которое, несмотря на свою маленькую
размерность сегодня (раньше процессоры занимали
целые залы), не обладает способностью понимать
слова или цифры. Его реакция основана
исключительно на двух уровнях напряжения:
высокий уровень соответствует «1», а низкий
уровень — «0». Таким образом, каждая команда
процессора представляет собой последовательность нулей и единиц: «1» — это импульс, а «0» —
его отсутствие.
6
5. Введение в машинно-ориентированное программирование
Машинный язык — это язык, который безперевода понимает центральный процессор, т. е.
множество нулей и единиц, которыми кодируются
все команды. Каждая команда (инструкция)
определяет одну простую машинную операцию:
арифметические действия над числами, логические
операции (побитовые), ввод-вывод и так далее.
7
6. Введение в машинно-ориентированное программирование
Программировать на машинном языке оченьтрудно хотя бы потому, что нужно помнить, какой
команде какая последовательность нулей и единиц
соответствует, и придется иметь дело с реальными
физическими адресами памяти, что очень неудобно.
Написание или проверка программы, состоящей из
цепочек нулей и единиц, требует большого труда,
не говоря уже о понимании чужого кода.
Примеры машинных команд сложения и
вычитания двух чисел в архитектуре Intel:
0000001111000011B
0010101111000011B
8
7. Введение в машинно-ориентированное программирование
Языки низкого уровня (машинно-ориентированные языки, или языки ассемблера - этотоже машинные команды, только им присвоены
символьные обозначения, которые легко
запоминаются. Операции обозначаются буквами и
сокращениями английских слов, отражающих суть
команды.
Помимо этого добавлен целый ряд
возможностей, облегчающих написание программ:
различные способы адресации операндов, метки,
директивы определения данных и др.
9
8. Введение в машинно-ориентированное программирование
История создания ассемблераЭто произошло в период сороковых годов
прошлого века. Для первых электронно-ламповых
ЭВМ программы писались на машинном языке.
Объем памяти у компьютеров был ограничен,
команды вводились путем переключения тумблеров
и нажатия кнопок. Простейшие вычисления
занимали значительное количество времени.
10
9. Введение в машинно-ориентированное программирование
История создания ассемблераСледующим этапом развития ЭВМ была
возможность хранения программы в памяти.
В 1950 году была разработана первая программатранслятор, которая переводила программы,
написанные на понятном человеку языке, в
машинный код. Эта программа была названа
программой-сборщиком, а язык программирования
получил название «ассемблера» (от английского
слова «assembler» — сборщик). Впервые этот
термин стал использовать английский учёный
Морис Уилкс (Maurice Wilkes).
11
10. История создания ассемблера
Почему для разных семейств процессоровнужен свой ассемблер?
У каждого процессора существует своя
архитектура — набор характеристик, определяющих
его конструкцию, принцип работы, регистры,
адресацию памяти и используемые команды. Если
процессоры имеют одинаковую архитектуру, они
считаются принадлежащими к одному семейству.
Поскольку наборы команд для различных
архитектур процессоров отличаются друг от друга,
программы на языке ассемблера, написанные для
одного семейства, не будут работать на
процессорах другого семейства. В связи с этим его
называют машинно-ориентированным языком.
12
11. История создания ассемблера
Почему для разных семейств процессоровнужен свой ассемблер?
В итоге «Ассемблер» объединяет целую
группу языков программирования, каждый из
которых ориентирован на архитектуру конкретного
процессора. Единого языка ассемблера нет, и для
разных процессоров языки разные, хотя между
ними есть и нечто общее.
13
12. Почему для разных семейств процессоров нужен свой ассемблер?
Кому и зачем нужен язык ассемблера?Конечно, ассемблер не так удобен для
разработки, как языки высокого уровня. Поэтому
большие программы на этом языке уже никто не
пишет, но есть области, где он становится
незаменимым:
14
13. Почему для разных семейств процессоров нужен свой ассемблер?
Сферы применения ассемблера15
14. Кому и зачем нужен язык ассемблера?
Сферы применения ассемблера1. Прошивка микроконтроллеров – это
разработка встроенных программ для
микроконтроллеров, которые устанавливаются в
системах сигнализации, пультах управления,
датчиках, бытовой технике, модемах и других
устройствах. Микроконтроллеры даже используются
в робототехнике и спутниковых навигационных
системах. Память у них ограничена, поэтому
ассемблер идеально подходит для их
программирования, так как каждая его команда
транслируется в одну команду в двоичном коде. Это
позволяет определить время выполнения
программы и объем памяти, необходимый для ее
хранения, исходя из исходного текста программы.
16
15. Сферы применения ассемблера
2. Написание драйверов устройств инекоторых компонентов операционных систем,
например, ядра или загрузчика. Некоторые
любительские операционные системы, такие как
MenuetOS и KolibriOS, полностью написаны на
ассемблерном коде. Ассемблер используется также
в программах для игровых приставок и
мультимедийных кодеках. Кодеки, или алгоритмы
сжатия-распаковки , служат для уменьшения
размера цифровых аудио- и видеофайлов с целью
эффективного хранения, передачи и
воспроизведения.
17
16. Сферы применения ассемблера
3. Реверс-инжиниринг - обратнаяразработка программ. Область используется для
понимания работы программ и их алгоритмов в
случаях, когда исходный код программы не
доступен по каким-либо причинам.
Реверс-инжиниринг используют:
- антивирусные компании, исследующие вирусы и
трояны, создатели драйверов и операционных
систем, а также просто любопытные программисты;
- компьютерные злоумышленники для взлома
программ, поиска уязвимостей, написания вирусов,
генерации ключей и прочих противоправных
действий.
18
17. Сферы применения ассемблера
Вывод:С практической точки зрения сегодня есть ряд
направлений, в которых Ассемблер используется
по прямому назначению — для создания программ.
Общекультурная значимость знания
ассемблера определяется тем, что позволяет
понять принципы работы центрального процессора
и внутреннюю логику компьютерных программ. Это
позволит при программировании на других языках
использовать на подсознательном уровне
оптимальные структуры и конструкции, что
положительно скажется на качестве разработок.
19
18. Сферы применения ассемблера
Рейтинг языков программирования посложности
Рассмотрим топ самых сложных языков
программирования: от сравнительно простых до
тех, где даже базовый код требует полной
перестройки мышления. Под номером «10» —
самый «легкий» в этом списке, под номером «1» в
списке — язык, на котором практически невозможно
писать вручную.
20
19.
№Язык
10 Swift
9
8
7
6
5
4
3
2
1
Где используется
В чем сложность
Год
2014 Разработка под iOS/macOS, Требует понимания ARC, типизации,
мобильные приложения
протоколов и архитектуры Apple
TypeScript 2012 Веб-разработка, frontend,
Гибкая система типов, обобщения, типыкорпоративные интерфейсы функции, условные типы
1972 Искусственный интеллект,
Не алгоритмы, а логика. Ошибки — в
экспертные системы,
правилах и порядке вывода
логический вывод
Rust
2010 Системное
Жесткий контроль над памятью: владение,
программирование, вебзаимствование, lifetimes
серверы, блокчейн,
безопасность
Haskell
1990 Наука, финтех, языковые
Функциональный стиль, монады, ленивая
модели, формальные
модель, строгая типизация
системы
C++
1985 Игры, драйверы, банки,
Множественные парадигмы, указатели,
операционные системы
шаблоны, ручная работа с памятью
Ассемблер 1949 Микроконтроллеры,
Работа с регистрами и адресами,
прошивки, BIOS, критичные минимальный уровень абстракции
низкоуровневые задачи
Brainfuck 1993 Учебные цели, теоретическое Только восемь команд, сложность чтения,
программирование
полная ручная логика
INTERCAL 1972 Историческая шутка,
Неадекватный синтаксис, непредсказуемые
учебные задачи,
правила, «вежливость» влияет на код
демонстрация абсурда
Malbolge 1998 Исключительно
Самоизменяющийся код, хаотичный
21
теоретический, не
синтаксис, почти невозможно писать
используется на практике
вручную
Prolog
20. Рейтинг языков программирования по сложности
5. C++C++ — один из самых мощных и одновременно самых сложных
языков программирования. Он дает полный контроль, но требует
полной ответственности — поддерживает несколько парадигм,
позволяет управлять памятью вручную и писать с разной степенью
абстракции.
В языке есть переменные, циклы, функции. Можно быстро написать
простую программу:
#include <iostream>
int main() {
std::cout << "Hello, world!" << std::endl;
return 0;
}
Но даже здесь важно знать: std::endl не просто перенос строки, он
еще и очищает буфер. В C++ важно не только что пишешь, но и как
это работает.
Каждая деталь — указатели, шаблоны, области памяти — требует
точного понимания. Язык не прощает невнимательности, но именно за
счет этого остается стандартом в критичных системах, играх и
высоконагруженных решениях.
22
21.
4. АссемблерАссемблер — язык, максимально близкий к «железу». Каждая команда
— прямая инструкция для процессора. Здесь нет переменных и
функций в привычном смысле, все строится на регистрах, адресах и
флагах.
Чтобы сложить два числа, нужно задать каждое действие вручную:
MOV AX, 5
MOV BX, 3
ADD AX, BX
; загрузить число 5 в регистр AX
; загрузить число 3 в регистр BX
; сложить: результат — в AX
Любая ошибка — даже в порядке инструкций — может привести к сбою.
Язык ничего не проверяет и не подсказывает: все на ответственности
разработчика.
Ассемблер используют там, где важны точность и минимальный
уровень абстракции: в драйверах, микроконтроллерах, загрузчиках. Он
требует глубокого понимания архитектуры и полной сосредоточенности.
23
22.
Принципы фон Неймана1.
Принцип использования двоичной
системы счисления для
представления данных и команд
Вся информация, поступающая в ЭВМ,
кодируется с помощью двоичных сигналов
(двоичных цифр, битов) и разделяется
на единицы, называемые словами.
2.
Принцип однородности памяти
Как программы (команды), так и данные хранятся в одной и
той же памяти (и кодируются в одной и той же системе
счисления — чаще всего двоичной). Над командами можно
выполнять такие же действия, как и над данными.
24
23.
Принципы фон Неймана(продолжение)
3.
Принцип адресуемости памяти
Структурно основная память состоит из
пронумерованных ячеек; процессору в произвольный
момент времени доступна любая ячейка.
4.
Принцип последовательного программного
управления
Программа состоит из набора команд, которые
выполняются процессором друг за другом в
определенной последовательности
25
24. Принципы фон Неймана
(продолжение)5.
Принцип условного перехода
Команды из программы не всегда выполняются одна за
другой. Возможно присутствие в программе команд
условного перехода, которые меняют последовательное
выполнение команд в зависимости от значений данных.
Так организуются ветвления и циклы.
6.
Принцип жесткости архитектуры
Неизменяемость в процессе работы архитектуры,
топологии, списка команд.
26
25.
Принципы фон Неймана(продолжение)
Компьютеры, построенные на этих принципах,
относят к типу фоннеймановских.
27
26. Принципы фон Неймана (продолжение)
Схематическое изображениемашины фон Неймана
28
27. Принципы фон Неймана (продолжение)
Как устроен язык ассемблерАссемблер — язык второго поколения, если считать
машинный язык первым поколением. Он напрямую
взаимодействует с процессором, и каждая его команда
представляет собой инструкцию для процессора, а не для
операционной или файловой системы. Процесс перевода
языка ассемблера в машинный код называется
ассемблированием.
Команды ассемблера состоят из кодов операций и
операндов. Операнды представляют собой адреса, из
которых процессор берет данные для вычислений и в которые
он помещает результат. Эти адреса могут быть ячейками
оперативной памяти или регистрами — внутренней памятью
процессора.
29
28. Схематическое изображение машины фон Неймана
Регистры процессораРегистром называется функциональный узел,
осуществляющий приём, хранение и передачу информации.
Регистры – это специальные ячейки памяти,
расположенные непосредственно в процессоре. Работа с
регистрами выполняется намного быстрее, чем с ячейками
оперативной памяти, поэтому регистры активно используются
как в программах на языке ассемблера, так и компиляторами
языков высокого уровня.
Регистры имеют собственные имена и различаются по
функциональному назначению.
Регистры разделяются на регистры общего назначения,
индексные, регистры состояния и управления, регистр флагов
и сегментные регистры.
30
29. Как устроен язык ассемблер
Регистры процессора x86Названия регистров происходят от их назначения:
EAX/AX/AH/AL (accumulator register) – аккумулятор;
EBX/BX/BH/BL (base register) –регистр базы;
ECX/CX/CH/CL (counter register) – счётчик;
EDX/DX/DH/DL (data register) – регистр данных;
ESI/SI (source index register) – индекс источника;
EDI/DI (destination index register) – индекс приёмника
(получателя);
ESP/SP (stack pointer register) – регистр указателя стека;
EBP/BP (base pointer register) – регистр указателя базы кадра
стека.
31
30. Регистры процессора
x8632
31. Регистры процессора x86
Регистры процессора x86-6433
32. Регистры процессора x86
Регистры процессора x86-64Добавлено 8 новых 64-битных регистров
R8 - R15.
Для обращения к 32-, 16- и 8-битной части 64-разрядных регистров
используются стандартные для архитектуры x86 имена регистров. Для
доступа к частям новых 64-битных регистров R8 - R15 применяется
соответствующий суффикс:
D: для получения младших 32 бит регистра, например, R11D;
W: для получения младших 16 бит регистра, например, R11W;
B: для получения младших 8 бит регистра, например, R11B.
В дополнение к регистрам общего назначения x86-64
предоставляет регистры специального назначения, в том числе восемь
регистров для работы с числами с плавающей точкой, реализованных в
модуле x87 с плавающей точкой (floating-point unit или FPU).
Intel назвала эти регистры ST0 - ST7. Каждый регистр с плавающей
точкой имеет ширину 80 бит.
Более подробно о работе с числами с плавающей точкой
поговорим позже.
34
33. Регистры процессора x86-64
Типы регистроврегистры данных (общего назначения):
RAX/EAX/AX/AH/AL
RBX/EBX/BX/BH/BL
RCX/ECX/CX/CH/CL
RDX/EDX/DX/DH/DL
используются для хранения данных
при выполнении различных арифметических
и логических операций
35
34. Регистры процессора x86-64
Типы регистровиндексные регистры:
RDI/EDI/DI
RSI/ESI/SI
предназначены для хранения индексов при работе
с массивами.
SI (Source Index) содержит индекс источника,
DI (Destination Index) — индекс приёмника, хотя
их можно использовать и как регистры общего
назначения.
36
35. Типы регистров
регистры-указатели:RBP/EBP/BP (Base Pointer)
RBP/ESP/SP (Stack Pointer)
используются для работы со стеком
Программист может (с определенными
ограничениями) использовать их для хранения
своих данных и реализации своих алгоритмов.
37
36. Типы регистров
Однако некоторые машинные команды требуют,чтобы их операнды размещались в строго
определенных регистрах (неявное использование
регистров).
Особую осторожность следует соблюдать при
использовании в своих целях регистров
RSP/ESP/SP и RBP/EBP/BP!
38
37. Типы регистров
регистры состояния и управленияRFLAGS/EFLAGS/FLAGS
содержит текущее состояние процессора
RIP/EIP/IP (Instruction Pointer)
счетчик команд
39
38. Типы регистров
Регистр IPРегистр-указатель команд RIP/EIP/IP
хранит адрес следующей подлежащей исполнению
команды. По мере того, как микропроцессор
загружает команду из памяти и выполняет ее,
регистр IP увеличивается на число байтов в
команде.
Регистр IP программно недоступен, для
изменения его содержимого служат команды
передачи управления.
40
39.
Регистр флагов15
14
13
12
11
10
09
OF DF IF
08
07
06
TF SF ZF
05
04
03
AF
02
01 00
PF
CF
Регистр флагов RFLAGS/EFLAGS/FLAGS
содержит информацию о текущем состоянии
процессора и представляется в виде набора битовых
флагов, изменяющихся и проверяемых независимо
друг от друга
В 16-разрядной версии он включает:
• 6 флагов состояния;
• 3 флага управления процессором.
41
40. Регистр IP
Флаги состоянияCF (Carry Flag) – флаг переноса – фиксирует
перенос или заем при выполнении
арифметических операций. Переносом
называется ситуация, когда в результате
выполнения правильной, вообще говоря,
команды образуется число, содержащее более
16 (32) двоичных разрядов и, следовательно, не
помещающееся в регистр или ячейку памяти.
42
41. Регистр флагов
Флаги состоянияAF (Auxiliary Flag) – вспомогательный флаг
переноса – используется в операциях
над двоично-десятичными числами. Он
индицирует перенос или заем из старшей
тетрады (бита 4).
ZF (Zero Flag) – флаг нуля – устанавливается
в 1, если результат операции равен 0.
43
42. Флаги состояния
SF (Sign Flag) – флаг знака – показывает знакрезультата операции, будучи равным 1 при
отрицательном результате.
OF (Overflow Flag) – флаг переполнения –
фиксирует переполнение, т.е. выход
результата за пределы допустимого диапазона
значений для чисел со знаком.
44
43. Флаги состояния
PF (Parity Flag) – флаг четности –устанавливается в 1, если младшие 8
разрядов результата операции содержат
четное число двоичных единиц, и
сбрасывается в 0, если число двоичных
единиц нечетно.
45
44. Флаги состояния
Управляющие флагиTF (Trace Flag) – флаг трассировки –
используется для осуществления пошагового
выполнения программы. Если TF=1, то после
выполнения каждой команды процессор запускает
прерывание с номером 1.
IF (Interrupt Flag) – флаг прерываний –
разрешает (если равен 1) или запрещает (если
равен 0) процессору реагировать на прерывания
от внешних устройств.
46
45. Флаги состояния
Управляющие флагиDF (Direction Flag) – флаг направления –
используется командами обработки строк. Если
DF=0, строка обрабатывается в прямом
направлении, от меньших адресов к большим;
если DF=1, обработка строки идет в обратном
направлении.
47
46. Управляющие флаги
Типы регистровсегментные 16-разрядные регистры
CS (Code Segment),
DS (Data Segment),
SS (Stack Segment),
ES (Enhanced Segment),
FS, GS.
Использование этих регистров позволяет
реализовать сегментную организацию памяти.
48
47. Управляющие флаги
Форматы данныхРазличают несколько форматов данных, из
которых можно выделить:
целые числа в двоичной системе счисления;
двоично-десятичные числа;
числа с плавающей точкой;
адреса.
49
48.
Категории предложенийАссемблера
команды (инструкции). Команда включает
мнемонический код и операнды, разделённые
запятыми (от 0 до 3);
директивы, которые являются указанием
компилятору на выполнение некоторых действий;
макрокоманды – предложения языка
Ассемблера, которые в процессе трансляции
замещаются другими предложениями;
комментарии – строки, начинающиеся с символа
“;”, перед которым может стоять произвольное
число пробелов. В ассемблерных вставках
допускаются комментарии в стиле С++.
50
49. Форматы данных
Структура машинных команди команд Ассемблера
Как машинная команда, так и команда Ассемблера
содержит:
код команды (что должна делать команда);
операнды команды (описывают, где находятся
данные для обработки и куда необходимо помещать
результат).
Таким образом, процессор извлекает из команды
следующую важную информацию:
какие действия необходимо совершить при
выполнении этой команды;
где находятся данные, которые подлежат обработке, и
куда необходимо поместить результат;
51
какой формат имеют эти данные.
50. Категории предложений Ассемблера
ОперандыОперанды содержат:
информацию о том, где находятся
данные, которые подлежат обработке, и
куда необходимо поместить результат;
информацию о том, какой формат имеют
эти данные (в частности, длину данных).
52
51. Структура машинных команд и команд Ассемблера
Синтаксическая диаграммадля директив и команд
Ассемблера
53
52. Операнды
ПоясненияМетка
–
символьный
идентификатор,
позволяющий обращаться к первому байту
машинной команды, в которую будет преобразована
соответствующая команда Ассемблера:
s1: mov ax, 10
Префикс
–
символическое
обозначение
элементов отдельных команд, предназначенных для
изменения стандартного действия команды:
repne movsb
Операнды – части директивы или команды
ассемблера, обозначающие объекты, с которыми
будут выполняться какие-то действия (в команде)
или уточняющие смысл директивы:
push dx
54
53. Синтаксическая диаграмма для директив и команд Ассемблера
Ключевые слова АссемблераКлючевые слова - служебные слова
Ассемблера, которые можно использовать
только в строго определенном контексте. К
ключевым словам относятся:
имена команд Ассемблера и имена
префиксов;
имена регистров;
имена операторов Ассемблера.
55
54. Пояснения
Идентификаторы и константыИдентификаторы - конструкции,
предназначенные для обозначения различных
объектов в программе.
Константы служат для записи неизменяемых
значений, чаще всего числовых.
25, -3, 0
целые числа в десятичной системе
счисления
101001b
целое число в двоичной системе
счисления
35h, 0ffh
целые числа в 16-ричной системе
счисления
'F'
число,
соответствующее
коду
указанного символа
56
55. Ключевые слова Ассемблера
Операнды команд АссемблераОперанды могут быть:
именами регистров, и в этом случае
данные извлекаются из соответствующих
регистров или записываются в них;
числовыми константами, которые хранятся
непосредственно в командах;
числовыми выражениями,
вычисляющимися во время компиляции;
адресными выражениями.
57
56. Идентификаторы и константы
Адресные выражения АссемблераВ качестве операндов-примитивов адресных
выражений могут выступать:
имена меток операторов Ассемблера;
имена переменных;
специальная константа $ - счетчик адреса. Ее
значение равно смещению строки, в которой
записан счетчик адреса, относительно
соответствующего сегмента.
58
57. Операнды команд Ассемблера
Адресные операторы АссемблераДопустимыми являются следующие адресные
операторы:
адрес + число, адрес – число (результат имеет
адресный тип);
адрес – адрес (результат имеет числовой тип и
равен количеству байт в указанном промежутке)
– не работает в ассемблерных вставках;
SEG адрес;
OFFSET адрес (оба оператора возвращают
числовой тип).
59
58. Адресные выражения Ассемблера
АдресацияАдресация – информация о том, где
находятся обрабатываемые командой данные.
Возможно следующее расположение
данных:
в самой команде (непосредственная
адресация);
в регистрах (регистровая адресация);
в памяти (адресация в памяти).
Как правило, в оперативной памяти
располагается не более одного операнда!
60
59. Адресные операторы Ассемблера
Получение эффективного адресаЭффективный адрес получается как сумма
адресов, хранящихся:
в самой команде;
в регистрах RBX/EBX/BX или RBP/EBP/BP;
в регистрах RSI/ESI/SI или RDI/EDI/DI.
(для защищенного режима могут использоваться
любые регистры общего назначения).
Адрес сегмента при этом находится в одном из
сегментных регистров.
Хотя бы одна часть адреса должна присутствовать!
61
60. Адресация
Способы адресации данных1) Непосредственная - операнд может быть
представлен в виде числа, адреса, кода ASCII, а также
иметь символьное обозначение:
mov
АХ, 4C00h
; Операнд - 16-ричное число
mov
DX, offset mas
;Смещение массива mas заносится в DX
mov
DL, '!'
;Операнд - код ASCII символа '!‘
2) Регистровая
- операнд находится в регистре. Способ
применим ко всем программно-адресуемым регистрам
процессора:
mov
BP, SP
;Пересылка содержимого SP в BP
62
61. Получение эффективного адреса
Способы адресации данных3) Адресация памяти
прямая
- в команде указывается
символическое обозначение ячейки памяти, над
содержимым которой требуется выполнить операцию :
mov DL,mem1
;Содержимое байта памяти
с символическим именем mem1
пересылается в DL
Если нужно обратиться к ячейке памяти с
известным абсолютным адресом, то этот адрес можно
непосредственно указать в качестве операнда:
; Настроим сегментный регистр ES на самое
начало памяти (адрес 0)
mov
АХ, 0
63
mov
ES, AX
62. Способы адресации данных
косвенная – если хотя бы одна компонентаадреса находится в регистре. При этом имя регистра
задается в квадратных скобках.
До 80386 для этого можно было использовать
только BX, SI, DI и BP, но потом эти
ограничения были сняты и адрес операнда разрешили
считывать также и из EAX, EBX, ECX, EDX, ESI,
EDI, EBP и ESP (но не из AX, CX, DX или SP
напрямую; надо использовать EAX, ECX, EDX, ESP
соответственно).
Например:
mov eax,[ebx]
64
63. Способы адресации данных
Характеристики данныхАссемблера
тип данных;
длина данных.
Основные типы данных Ассемблера:
числовой тип;
адресный тип.
Длина обрабатываемых данных задаётся в байтах
(от 1 до 8).
65
64. Способы адресации данных
Директивы описания данныхd1 dw 10 dup (5, 5 dup (?))
выделяет 60 слов, причем изначально заполняются
лишь десять.
66
65. Характеристики данных Ассемблера
Встраиваемыйассемблерный код
Использование ассемблерных вставок в виде
встраиваемого ассемблерного кода – 1-й способ
связи Ассемблера и С++.
Синтаксис:
_asm
команда_ассемблера
[;комментарий]
_asm {
команда_ассемблера [;комментарий]
команда_ассемблера [//комментарий или
/*комментарий*/]
}
67
66. Директивы описания данных
Пример ассемблерной вставки впрограмму на C++ (MS VS 2019)
#include <iostream>
using namespace std;
void main() {
int a, b, sum;
cout << "Enter two integer numbers:\n";
cin >> a >> b;
_asm {
mov
add
mov
}
eax, a
eax, b
sum, eax
cout << " sum is: " << sum << "\n";
}
68
67. Встраиваемый ассемблерный код
Описание данных и совместимостьтипов С++ и Ассемблера
Intel
Ассемблер
Кол-во
байт
С
С++
byte
db
1
word
dw
2
double
word
quad
word
dd
4
dq
8
[unsinged]
char
[unsinged]
short
[unsinged]
int
[unsinged]
long long
int
[unsinged]
__int8
[unsinged]
__int16
[unsinged]
__int32
[unsinged]
__int64
69
68. Пример ассемблерной вставки в программу на C++ (MS VS 2019)
Команда MOV – команда пересылкиданных
MOV оп1, оп2
переносит содержимое второго операнда (оп2) в первый
операнд (оп1). Содержимое второго операнда не
меняется.
Ограничения, накладываемые командой MOV на
комбинации операндов, следующие:
длины операндов должны быть равны;
первый операнд не может быть непосредственным;
запрещена пересылка память – память;
запрещена пересылка в регистры CS и EIP (этим
должны заниматься команды передачи управления);
пересылка в сегментные регистры возможна только из
регистров общего назначения или из памяти.
70
69. Описание данных и совместимость типов С++ и Ассемблера
Команды сложения ивычитания
ADD
оп1, оп2
складывает оп2 и оп1. Результат помещается в оп1.
ADC
оп1, оп2
складывает оп2 , оп1, флаг CF. Результат помещается
в оп1.
SUB
оп1, оп2
вычисляет оп1 – оп2. Результат помещается в оп1.
SBB
оп1, оп2
вычисляет оп1 – (оп2+CF). Результат помещается в
оп1.
Вычитание реализовано через сложение!
71
70. Команда MOV – команда пересылки данных
Команды сложения ивычитания (продолжение)
INC
оп1
увеличивает оп1 на единицу. Флаг CF не
изменяется.
DEC
оп1 уменьшает оп1 на единицу. Флаг CF не
изменяется.
CMP
оп1, оп2 вычисляет оп1 – оп2. Результат не
сохраняется, лишь выставляются флаги.
NEG
оп1 изменяет знак оп1.
Если операнд содержит максимальное по модулю
отрицательное число (например, -128, если операнд – байт),
то выполнить эту команду нельзя – соответствующего
положительного числа не существует. В этом случае
значение операнда не меняется, и устанавливается флаг
72
OF.
71. Команды сложения и вычитания
Команды умноженияMUL
оп1
умножение беззнаковых чисел
IMUL
оп1
умножение чисел со знаком
Второй сомножитель и результат умножения находятся
в регистрах, в зависимости от длины операнда:
Длина операнда
Второй операнд
Результат
байт
AL
AX
слово
AX
DX, AX
двойное слово
EAX
EDX, EAX
Если размер результата превышает размер
множителей, устанавливаются флаги CF и OF
73
72. Команды сложения и вычитания (продолжение)
MULоп1
IMUL оп1
Если оп1 - байт, то (AL) х (оп1) -> AX;
Если оп1 - слово, то (AХ) х (оп1) -> DX:AX;
Если оп1 - двойное слово,
то (EAХ) х (оп1) -> EDX:EAX;
74
73. Команды умножения
Команда знакового умноженияимеет 4 варианта:
IMUL
оп1
IMUL оп1, непосредственный операнд
IMUL оп1, оп2, непосредственный операнд
IMUL оп1, оп2
75
74.
Второй вариант команды IMUL позволяетуказать регистр, который будет содержать один
из сомножителей. В этот же регистр будет
помещён результат. Второй сомножитель
указывается непосредственно в команде.
Третий вариант команды IMUL позволяет указать
и результат, и оба сомножителя. Однако
результат может быть помещён только в регистр,
а второй сомножитель может быть только
непосредственным операндом. Первый
сомножитель может быть регистром или ячейкой
памяти.
76
75.
Четвёртый вариант команды IMUL позволяетуказать оба сомножителя. Первый должен быть
регистром, а второй – регистром или ячейкой
памяти. Результат помещается в регистр,
являющийся первым операндом.
Расширение результата в регистр EDX/DX
происходит только при использовании первого
варианта команды IMUL. В остальных случаях
часть произведения, не помещающаяся в
регистр-результат, теряется, даже если в
качестве результата указан регистр EAX/AX. При
умножении двух 1-байтовых чисел, произведение
которых больше байта, но меньше слова, в
регистре-результате получается корректное
произведение.
77
76.
mov eax, 5mov ebx, -7
imul ebx ; EAX = ffffffdd, EDX = ffffffff, CF = 0
mov
imul
ebx, 3
ebx, 6
; EBX = EBX * 6
mov ebx, 500000
imul eax, ebx, 100000
x dd 40
mov
eax, 55
imul eax, x
;EAX = EBX * 100000, старшая
;часть результата теряется
; EAX = EAX * x
78
77.
Команды целочисленногоделения
DIV
оп1
деление беззнаковых чисел (операнд – делитель)
IDIV
оп1
деление чисел со знаком (операнд – делитель)
Длина
делителя
Делимое
Частное
Остаток
байт
AX
AL
AH
слово
DX, AX
AX
DX
двойное слово
EDX, EAX
EAX
EDX
79
78.
DIVоп1
IDIV оп1
Если оп1 - байт, то (AX) / (оп1) =
частное -> AL, остаток ->AH
Если оп1 - слово, то (DX:AХ) / (оп1) =
частное -> AX, остаток ->DX
Если оп1 - двойное слово, то
(EDХ:EAХ) / (оп1) =
частное -> EAX, остаток ->EDX
80
79. Команды целочисленного деления
Команды управленияпрограммным потоком
Можно выделить следующие категории таких
команд:
переходы
безусловные
условные
вызовы подпрограмм
прерывания
81
80.
Особенности работы командуправления программным потоком
безусловные переходы (JMP)
содержимое регистров EIP и, возможно, CS изменяется
в зависимости от информации, хранящейся в команде
(это справедливо для всех категорий)
условные переходы (Jxxx)
переход выполняется только при выполнении
определенного условия
вызовы подпрограмм (CALL)
перед выполнением перехода в стеке сохраняются
старые значения EIP и CS
выход из подпрограмм (RET)
значения EIP и CS извлекаются из стека
82
81. Команды управления программным потоком
Особенности работы командуправления программным потоком
(продолжение)
прерывание (INT)
перед выполнением перехода в стеке сохраняются
старые значения регистра флагов, EIP и CS
выход из прерывания (IRET)
значения регистра флагов, EIP и CS извлекаются
из стека
83
82. Особенности работы команд управления программным потоком
Безусловный переходФормат команды перехода
jmp адрес_перехода
Классификация безусловных переходов по типу
информации в команде
прямые
jmp metka ;Переход на метку
в команде хранится адрес, который необходимо занести в CS и EIP
(в зависимости от расстояния). Иначе – прямым называется переход,
в команде которого в явной форме указывается метка, на которую
нужно перейти
косвенные
jmp word[bx]
адрес, вычисляется по правилам косвенной адресации
регистровые jmp bx ;Переход по адресу в BX
частный случай косвенной адресации – адрес хранится в регистре
84
83. Особенности работы команд управления программным потоком (продолжение)
Условные переходыФормат команды:
Jxxx адрес_перехода
Решение о переходе принимается в зависимости
от выполнения определенных условий:
значения регистра CX/ECX;
состояния флагов ZF, OF, CF, SF;
результатов сравнения целых чисел со знаком;
результатов сравнения беззнаковых целых чисел.
Команды условного перехода относятся к
ближнему прямому типу перехода (для 16-битного
режима – к короткому прямому типу).
85
84. Безусловный переход
Команды, анализирующиерезультаты сравнения
Код
операции
JE
Проверяемое условие
Флаги
операнд1 == операнд2
ZF=1
JNE
операнд1 != операнд2
ZF=0
JG / JNLE
операнд1 > операнд2
ZF=0 и SF=OF
JGE / JNL
операнд1 >= операнд2
SF=OF
JL / JNGE
операнд1 < операнд2
SF≠OF
JLE / JNG
операнд1 <= операнд2
ZF=1 и SF≠OF
JA / JNBE
операнд1 > операнд2
CF=0 и ZF=0
JAE / JNB
операнд1 >= операнд2
CF=0
JB / JNAE
операнд1 < операнд2
CF=1
JBE / JNA
операнд1 <= операнд2
CF=1 и ZF=1
Тип операндов
любые
знаковые
беззнаковые
86
85. Условные переходы
Команды, анализирующиесодержимое флагов
Флаг
Проверка на 1
Проверка на 0
Флаг переноса CF
JC
JO
JZ (JE)
JP
JS (JL)
JNC
JNO
JNZ (JNE)
JNP
JNS (JNL)
Флаг переполнения OF
Флаг нуля ZF
Флаг четности PF
Флаг знака SF
Команды, анализирующие
содержимое регистра CX/ECX
Состояние регистра
CX == 0
ECX == 0
Команда
JCXZ
JECXZ
87
86. Команды, анализирующие результаты сравнения
Команды пересылки данныхXCHG
оп1, оп2
меняет местами данные оп2 и оп1.
message db 'Hello, world!',13,10,'$'
…
XCHG BL, BH
; верно
XCHG DH, message+3 ; тоже верно
XCHG BP, message
; неверно – несовпадение
; длин
XCHG byte ptr [bx], 2 ; неверно –
;использование непосредственного
; операнда запрещено
XCHG byte ptr [bx], [si] ; неверно – пересылка
;память-память
88
87. Команды, анализирующие содержимое флагов
Команды пересылки данных(продолжение)
LEA
регистр, адрес
загружает в регистр вычисленное во время
выполнения адресное выражение.
Если выражение может быть вычислено во время
компиляции, заменяется машинной командой MOV:
d2
dw
30
…
lea
bx, d2 ; эта команда эквивалентна
mov bx, offset d2
mov bx, d2
; а эта команда пересылает
; содержимое памяти по адресу!
Однако, например, команде
lea bx, d2[bx]
нет эквивалентной записи команды MOV.
89
88. Команды пересылки данных
(продолжение)LDS
регистр, дальний_адрес
пересылает смещение из второго операнда в
указанный регистр, а адрес сегмента – в регистр DS.
LES
регистр, дальний_адрес
LFS регистр, дальний_адрес
LGS регистр, дальний_адрес
выполняют аналогичные действия для регистров ES,
FS, GS.
90
89. Команды пересылки данных (продолжение)
Команды изменения флаговSTx – установить флаг
CLx – сбросить флаг
Например,
STC – установить флаг CF
CLC – сбросить флаг CF
STD – установить флаг DF
CLD – сбросить флаг DF
STI – установить флаг IF
CLI – сбросить флаг IF
91
90. Команды пересылки данных (продолжение)
Спасибо завнимание!
92
Программирование