Программирование на языке Ассемблер. Учебное пособие
.pdfМинистерствонауки ивысшегообразованияРоссийской Федерации Федеральное государственное бюджетное образовательное учреждение
высшего образования «Томский государственный архитектурно-строительный университет»
С.П. Батуев, Н.А. Вихорь
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ АССЕМБЛЕР
Учебное пособие
Томск Издательство ТГАСУ
2018
УДК 004.438(075.8)
ББК 32.973.21я73
Батуев, С.П. Программирование на языке Ассемблер Б287 [Текст] : учебное пособие / С.П. Батуев, Н.А. Вихорь. –
Томск : Изд-во Том. гос. архит.-строит. ун-та, 2018. – 63 с.
ISBN 978-5-93057-863-8
В учебном пособии рассматриваются основные понятия низкоуровневого языка программирования Ассемблер. По каждой теме разбираются примеры решения задач. Для закрепления полученных навыков в пособии приведены контрольные задания.
Пособие предназначено для студентов, обучающихся по направлению 09.03.03. «Прикладная информатика» всех форм обучения и изучающих дисциплины «Низкоуровневое программирование» и «Микропроцессорные технологии».
УДК 004.438(075.8)
ББК 32.973.21я73
Рецензенты:
П.А. Радченко, кандидат физ.-мат. наук, заведующий кафедрой прикладной математики ТГАСУ; А.Е. Петелин, кандидат физ.-мат. наук, доцент кафедры
информационного обеспечения инновационной деятельности НИ ТГУ.
ISBN 978-5-93057-863-8 |
© Томский государственный |
|
архитектурно-строительный |
|
университет, 2018 |
|
© С.П. Батуев, |
|
Н.А. Вихорь, 2018 |
|
ОГЛАВЛЕНИЕ |
|
Введение...................................................................................... |
5 |
|
1. |
Структура компьютера......................................................... |
6 |
|
1.1. Строение CPU.................................................................... |
6 |
|
1.2. Регистры общего назначения ........................................... |
7 |
|
1.3. Сегментные регистры........................................................ |
8 |
|
1.4. Регистры специального назначения.................................. |
9 |
2. |
Доступ к памяти................................................................... |
10 |
|
2.1. Команда MOV.................................................................. |
12 |
3. |
Переменные........................................................................... |
14 |
|
3.1. Массивы........................................................................... |
17 |
|
3.2. Получение адреса переменной........................................ |
19 |
|
3.3. Константы........................................................................ |
20 |
4. |
Прерывания.......................................................................... |
23 |
5. |
Библиотека общих функций – еmu8086.inc....................... |
25 |
6. |
Арифметические и логические команды.......................... |
29 |
7. |
Управление ходом программы........................................... |
34 |
|
7.1. Безусловные переходы.................................................... |
34 |
|
7.2. Короткие условные переходы......................................... |
35 |
8. |
Цикл....................................................................................... |
41 |
|
8.1. Инструкция LOOP........................................................... |
41 |
9. |
Процедуры............................................................................. |
43 |
10. |
Стек........................................................................................ |
46 |
11. |
Макросы................................................................................ |
50 |
12. |
Задания для самостоятельной работы .............................. |
53 |
|
Задание1.КомандаMOVиарифметическиекоманды................. |
53 |
|
Задание 2. Команды логических операций, |
|
|
сдвигов, выделение битовых полей....................................... |
54 |
|
Задание3.Ветвления. Командыпередачи управления.................. |
55 |
|
Задание 4. Обработка данных в цикле |
|
|
(без использования ветвления).............................................. |
57 |
3
Задание 5. Обработка данных в цикле |
|
(с использованием ветвлений) .............................................. |
58 |
Задание 6. Стек....................................................................... |
59 |
Вопросы для самостоятельной работы |
|
и самоконтроля....................................................................... |
60 |
Список рекомендуемой литературы..................................... |
62 |
4
ВВЕДЕНИЕ
Каждый компьютер имеет свой язык программирования – машинный язык. Он тесно связан с его аппаратной частью. Язык программирования, ориентированный на конкретный тип процессора и учитывающий его особенности, называется языком программирования низкого уровня. «Низкий уровень» означает, что операторы языка близки к машинному коду и ориентированы на конкретные команды процессора.
Большинство программистов работают с языками высокого уровня, которые значительно ближе и понятнее человеку, нежели компьютеру. Языки высокого уровня были разработаны для того, чтобы освободить программиста от учета технических особенностей конкретных компьютерных архитектур.
Язык Ассемблер – это язык программирования низкого машинного уровня. С его помощью можно получить представление о том, как аппаратная часть компьютера взаимодействует с операционной системой и как прикладные программы обращаются к операционной системе. На языке Ассемблер создаются очень эффективные и компактные программы, так как разработчик получает доступ ко всем возможностям процессора.
5
1. СТРУКТУРА КОМПЬЮТЕРА
Для того чтобы понять принципы работы программы на языке Ассемблер, сначала необходимо ознакомиться с общей структурой компьютера. Упрощенная модель компьютера представлена на рис. 1:
Рис. 1. Упрощенная модель компьютера
System bus – системная шина (окрашена желтым цветом) соединяет различные компоненты компьютера.
CPU – центральный процессор (ЦП) – это сердце компьютера. Большинство вычислений происходит в CPU.
RAM – оперативная память (ОЗУ). В оперативную память загружаются программы для выполнения.
1.1. Строение CPU
Процессор Intel 8086 состоит из 16 16-разрядных регистров, которые представлены на рис. 2.
6
Рис. 2. Строение центрального процессора
1.2. Регистры общего назначения
Процессор 8086 имеет 8 регистров общего назначения, каждый регистр имеет имя:
AX – регистр-аккумулятор (разделен на два регистра:
AH и AL);
BX – регистр базового адреса (разделяется на BH / BL);
CX – регистр-счетчик (разделяется на CH / CL);
DX – регистр данных (разделяется на DH / DL);
SI – регистр – индекс источника;
DI – регистр – индекс назначения;
BP – указатель базы;
SP – указатель стека.
Несмотря на имя регистра, программист сам определяет, для каких целей использовать регистры общего назначения. Основное назначение регистра – хранение числа (переменной). Разрядность регистров составляет 16 бит.
7
Четыре регистра общего назначения (AX, BX, CX, DX) разделены на две части. К каждой части можно обращаться как к отдельному регистру.
Например, если AX=0011000000111001b, то
AH=00110000b, а AL=00111001b. Старший байт обозначается буквой «H», а младший – буквой «L».
Поскольку регистры расположены внутри процессора, то работают они значительно быстрее, чем память. Обращение к памяти требует использования системной шины, а на это уходит больше времени. Обращение к регистрам вообще не отнимает время. Поэтому лучше хранить переменные в регистрах. Количество регистров ограниченно, и многие регистры имеют специальное назначение, которое не позволяет использовать их для хранения переменных, но все же они являются наилучшим местом для записи временных данных и вычислений.
1.3. Сегментные регистры
CS – указывает на сегмент, содержащий начальный адрес текущей программы.
DS – обычно указывает на начальный адрес сегмента данных (переменных).
ES – дополнительный сегментный регистр.
SS – содержит начальный адрес сегмента стека.
Хотя в сегментных регистрах можно хранить любые данные, делать это неразумно. Сегментные регистры имеют строго определенное назначение – обеспечение доступа к блокам памяти.
Сегментные регистры работают совместно с регистрами общего назначения для доступа к памяти. Например, чтобы получить доступ к памяти с физическим адресом 12345h (в шестнадцатеричной системе счисления), необходимо установить DS = 1230h и SI = 0045h. И это правильно, потому что таким образом мы можем получить доступ к памяти, фи-
8
зический адрес которой больше, чем значение, которое может поместиться в одиночном регистре.
Процессор вычисляет физический адрес, умножая значение сегментного регистра на 10h и прибавляя к полученному результату значение регистра общего назначения:
1230h 10h + 45h = 12345h.
Адрес, сформированный с помощью двух регистров, на-
зывается реальным адресом.
По умолчанию регистры BX, SI и DI работают с сегментным регистром DS; регистры BP и SP работают с SS.
1.4. Регистры специального назначения
IP – командный указатель.
Флаговый регистр – определяет текущее состояние процессора.
Регистр IP всегда работает совместно с сегментным регистром CS и указывает на выполняемую в данный момент команду.
Флаговый регистр автоматически изменяется процессором после математических операций. Он позволяет определять тип результата и передавать управление другим участкам программы.
Невозможно напрямую обращаться к этим регистрам.
9
2. ДОСТУП К ПАМЯТИ
Для доступа к памяти можно использовать следующие четыре регистра: BX, SI, DI, BP.
Комбинируя эти регистры внутри квадратных скобок [], можно получить доступ к различным местоположениям в памяти. Возможны следующие комбинации (режимы адресации) (табл. 1):
|
|
Таблица 1 |
[BX + SI] |
[SI] |
[BX + SI] + d8 |
[BX + DI] |
[DI] |
[BX + DI] + d8 |
[BP + SI] |
d16 (только переменная-смещение) |
[BP + SI] + d8 |
[BP + DI] |
[BX] |
[BP + DI] + d8 |
[SI] + d8 |
[BX + SI] + d16 |
[SI] + d16 |
[DI] + d8 |
[BX + DI] + d16 |
[DI] + d16 |
[BP] + d8 |
[BP + SI] + d16 |
[BP] + d16 |
[BX] + d8 |
[BP + DI] + d16 |
[BX] + d16 |
d8 – обозначение для 8 битовой подстановки.
d16 – обозначение для 16 битовой подстановки. Подстановка может быть непосредственным значением
или смещением переменной, или даже и тем и другим. Она преобразуется компилятором в одиночное непосредственное значение. Подстановка может быть как внутри, так и вне квадратных скобок, компилятор генерирует одинаковый машинный код в обоих случаях.
Подстановка – это величина со знаком, поэтому она может быть как положительной, так и отрицательной. Обычно компилятор различает d8 и d16 и генерирует требуемый машинный код.
Например, представим, что DS = 100, BX = 30, SI = 70. Следующий способ адресации: [BX + SI] + 25 вычисляется
10
