
ТСвИС / (х) архитектура устройства компьютера.ассемблер
.pdf
Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Организация памяти
Оперативную память можно условно представить в виде простой последовательности пронумерованных байт. Порядковый номер байта называется его
физическим адресом.
Доступ к любому байту ОЗУ осуществляется по 20-разрядной (для i8086) шине адреса. 20 разрядов шины позволяют записать адреса от 0 до 220-1 (1 Мбайт) или от 00000h до FFFFFh.
Все регистры МП 16-разрядные. Для получения 20-разрядного адреса используется
следующий механизм:
•вся физическая память условно разбивается на параграфы (1 параграф = 16 байт);
•память выделяется программам небольшими блоками - сегментами памяти или сегментами;
•программа может состоять из любого
количества сегментов;
•каждый сегмент может начинаться только с начала параграфа, т.е. адресом сегмента будет номер его первого параграфа (такой адрес уже 16-разрядный).

Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Организация памяти
Для получения физического адреса начала сегмента необходимо умножить его номер на 16. Например, сегмент 0032h имеет физический адрес 0032h x 10h = 00320h.
Для определения адреса конкретной ячейки памяти необходимо знать позицию этой ячейки относительно начала сегмента. Этот относительный адрес называют эффективным адресом или смещением. Поскольку максимальный размер сегмента ограничен 64 килобайтами, то смещение будет записываться 16-разрядным значением.
Таким образом, выполняется переход от 20-разрядного физического адреса к адресу, состоящему из двух 16-разрядных частей: адрес сегмента и смещение. Такие составные адреса называются логическими и записываются так:
96AF : E305
Адрес сегмента Смещение
Механизм сегментации служит не только для перехода от 20-разрядных физических адресов к 16разрядным логическим, он необходим для защиты программ от взаимного влияния.
Пример: рассмотрим предложение: «Изучаем сегменты памяти» и разобьем предложение следующим образом (символом "_" обозначен пробел):
0000: Изучаем_ 0010: сегменты_ 0020: памяти
0030:
В слове "Изучаем" символ "И" стоит на нулевом месте; символ "з" на первом и т.д.
Используя адресацию через сегмент и смещение получим, что символ "ч" будет иметь следующий адрес: 0000:0003, т.е. сегмент – 0000, смещение – 0003.
Вслове "сегменты" будем считать буквы, начиная с десятого сегмента, но с нулевого смещения. Тогда символ "н" будет иметь следующий адрес: 0010:0005.
Вслове "память" считаем буквы, начиная с 0020 сегмента и также с нулевой позиции. Т.о. символ "а" будет иметь адрес 0020:0001.

Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Создание программы на языке ассемблера
1.Постановка задачи (точное и подробное описание функциональности будущей программы, а также описание всех входных и выходных данных и способа их передачи программе).
2.Разработка алгоритма программы (построение блок схемы, граф-схемы или текстовое или математическое описание решения).
3. Формализация алгоритма (запись алгоритма на языке программирования). Создание текстового файла программы с расширением .asm (например my.asm) в любом текстовом редакторе с нумерацией строк.
4. Компиляция программы - процесс перевода программы из текстового вида в машинный код. При использовании компилятора фирмы Borland необходимо выполнить: tasm my.asm т.е. запускаем компилятор tasm и передаем с командной строки имя файла, содержащего программу. Если программа имеет синтаксические ошибки, компилятор выдаст сообщение об ошибке с указанием номера строки и описанием для каждой ошибки (нужно вернуться на этап №3 и исправить синтаксические ошибки). В случае успешной компиляции будет создан файл, содержащий объектный код программы my.obj, который ещѐ не является исполняемым модулем.
5.Компоновка программы - создание из файла объектного кода исполняемого модуля: tlink my.obj . В случае успешной компоновки будет создан исполняемый модуль my.exe .
6.Запуск и тестирование исполняемого модуля программы. На данном этапе необходимо проверить, соответствует ли написанная программа постановке задачи, сделанной на этапе №1. Неправильная работа программы говорит об алгоритмической ошибке
(семантическая ошибка), поэтому для успешного еѐ устранения нужно вернуться на этап
разработки алгоритма (этап №2).

Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Команда mov
mov (от англ. move – в данном случае – загрузить) - присвоение регистру какого-либо значения Например, чтобы присвоить, необходимо записать так:
mov al,35h |
присвоение регистру AL числа 35h |
mov ax,346Ah |
присвоение регистру AX числа 346Ah |
Cледующие записи будут ошибочны:
mov ah,123h максимум FFh mov bx,12345h максимум FFFFh mov dl,100h максимум FFh
Если шестнадцатеричное число начинается не с цифры (напр.: 12h), а с буквы (A-F) (напр.: С5h), то перед таким числом ставится нуль: 0C5h. Это необходимо для того, чтобы программа-ассемблер могла отличить, где шестнадцатеричное число, а где метка.

Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Операции с сегментными регистрами
•Регистр CS служит для хранения сегмента кода программы (Code Segment – сегмент кода);
•Регистр DS – для хранения сегмента данных (Data Segment – сегмент данных);
•Регистр SS – для хранения сегмента стека (Stack Segment – сегмент стека);
•Регистр ES – дополнительный сегментный регистр, который может хранить любой другой сегмент (например, сегмент видеобуфера).
Пример загрузки в пару регистров ES:DI сегмент и смещение буквы "м" в слове "памяти" из предыдущего примера:
…
(1)mov ax,0020
(2)mov es,ax
(3)mov di,2
…
В регистре ES находится сегмент с номером 20, а в регистре DI – смещение к букве (символу) "м" в слове "памяти".
Загрузка числа (т.е. какого-нибудь сегмента) напрямую в сегментный регистр запрещена. Поэтому в строке (1) загрузили сегмент в AX, а в строке (2) загрузили в регистр ES число 20, которое находилось в
AX: |
mov ds,15 ошибка! |
|
mov ss,34h ошибка! |
Загруженная программа автоматически располагается в первом свободном сегменте памяти.
В файлах типа *.com все сегментные регистры автоматически инициализируются для этого сегмента (устанавливаются значения равные тому сегменту, в который загружена программа). Если, например, первый свободный сегмент с номером 5674h, то сегментные регистры будут иметь значения: CS = DS = SS = ES = 5674h
Код программы типа *.com должен начинаться со смещения 100h. Для этого используется оператор ORG 100h, указывая Ассемблеру при ассемблировании использовать смещение 100h от начала сегмента, в который загружена программа. Пара регистров CS:IP задает текущий адрес кода.

Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Прерывание
Прерывание (англ. interrupt) —это подпрограмма (часть MS-DOS), которая находится постоянно в памяти и может вызываться в любое время из любой программы. Сообщает процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается и управление передаѐтся обработчику прерывания, который реагирует на событие и обслуживает его, после
чего возвращает управление в прерванный код
Функции DOS (Int 21h)
Назначение |
№ |
Данные на входе |
Данные на |
|
Функции |
выход |
|||
|
|
|||
Ввод символа с ожиданием |
01 |
— |
al - ASCII код |
|
и эхо-сопровождением |
||||
|
|
|
||
Вывод символа |
02 |
dl - ASCII код |
— |
|
Ввод символа с ожиданием |
08 |
— |
al - ASCII код |
|
и без эхосопровождения |
||||
|
|
|
||
Вывод строки на экран |
09 |
ds:dx - адрес строки с символом '$' на конце |
— |
|
|
|
|
|
|
Ввод строки с клавиатуры |
0ah |
ds:dx - адрес буфера со следующим |
|
|
|
|
форматом: |
Введенная |
|
|
|
•1й байт - размер буфера; |
строка в |
|
|
|
•2й байт - число фактически введенных |
буфере с 0dh |
|
|
|
символов; |
на конце |
|
|
|
•3й байт и следующие за ним - буфер под |
|
|
|
|
строку |
|

Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Прерывание
Функции BIOS (Int 10h)
Назначение |
№ Функции |
Данные на входе |
Данные на выход |
|
|
|
|
Установить положение курсора |
02 |
dh - строка |
— |
|
dl - колонка |
||
|
|
|
|
|
|
|
|
Прочитать символ и атрибут с экрана |
08 |
bh - № экранной |
ah - атрибут |
|
страницы |
al - символ |
|
|
|
||
|
|
|
|
Вставить символ с атрибутом |
|
bh - № экранной |
|
|
|
страницы; |
|
|
09 |
bl - атрибут; |
— |
|
al - ASCII код; |
||
|
|
|
|
|
|
cx - число |
|
|
|
повторений |
|
Получить параметры видеорежима |
|
|
al - видеорежим |
|
0fh |
— |
bh - № экранной |
|
|
|
страницы |
Установить параметры видеорежима |
|
al - видеорежим |
— |
|
00h |
bh - № экранной |
|
|
|
страницы |
|
|
|
|
|

Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Первая программа
(01) CSEG segment |
начало сегмента CSEG |
|
(02) org 100h |
смещение на 100h (для всех программ типа *.com) |
|
(03) _Begin: |
начало кода |
|
(04) mov ah,9 |
присваиваем AH число 9 |
|
(05) mov dx,offset Message |
загружаем в DX адрес сообщения Message |
|
(06) int 21h |
вызываем функцию 9 прерывания 21h, выводящее строку на экран |
|
(07) int 20h |
вызываем 20h прерывание, закрывающее программу (выход в DOS) |
|
(08) Message db 'Hello, world!$‘ |
строка для вывода |
|
(09) CSEG ends |
конец сегмента CSEG |
|
(10) end _Begin |
конец кода |

Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Операторы сложения и вычитания
Команда |
Перевод |
Назначение |
Процессор |
|
|
|
|
ADD приемник, источник |
ADDition – сложение |
Сложение |
8086 |
|
|
|
|
SUB приемник, источник |
SUBtraction – вычитание |
Вычитание |
8086 |
|
|
|
|
mov al,10 add al,15 sub al,10
mov ax,25000 add ax,10000 sub ax,15000
mov cx,200 mov bx,760 add cx,bx sub cx,bx
загружаем в регистр AL число 10
AL = 25; AL – приемник, 15 – источник
AL = 15; AL – приемник, 10 – источник
загружаем в регистр AX число 25000
AX = 35000; AX – приемник, 10000 – источник
AX = 20000; AX – приемник, 15000 – источник
загружаем в регистр CX число 200
а в регистр BX – 760
CX = 960, BX = 760 (BX не меняется); CX – приемник, BX – источник
CX = 200, BX = 760 (BX не меняется!); CX – приемник, BX – источник

Архитектура ЭВМ и систем К.т.н., доц. каф. ИСТ Кислицын Д.И. – ННГАСУ, 2010г.
Основы Ассемблера
Операторы инкрементации и декрементации
Команда |
Перевод |
Назначение |
Процессор |
|
|
|
|
INC приемник |
Increment – инкремент |
Увеличение |
8086 |
|
|
на единицу |
|
DEC приѐмник |
Decrement - декремент |
Уменьшение |
8086 |
|
|
на единицу |
|
|
|
|
|
Команда inc / dec увеличивает / уменьшает на единицу регистр. Эквивалентны
командам: |
|
ADD источник, 1 |
SUB источник, 1 |
mov al,15 |
|
|
inc al |
теперь AL = 16 |
dec al |
mov dh,39h |
|
|
inc dh |
DH = 3Ah |
dec dh |
mov cl,4Fh |
|
|
inc cl |
CL = 50h |
dec cl |
теперь AL = 15
DH = 39h
CL = 4Fh