Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке Ассемблер. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
603 Кб
Скачать

Министерствонауки ивысшегообразованияРоссийской Федерации Федеральное государственное бюджетное образовательное учреждение

высшего образования «Томский государственный архитектурно-строительный университет»

С.П. Батуев, Н.А. Вихорь

ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ АССЕМБЛЕР

Учебное пособие

Томск Издательство ТГАСУ

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]