INTEL 8086
СТРУКТУРА ПРОЦЕССОРА
СТРУКТУРА ПРОЦЕССОРА
БЛОК ИСПОЛНЕНИЯ (EU)
БЛОК ИНТЕРФЕЙСА ШИН (BIU)
2.92M
Category: programmingprogramming

LK1_Введение

1.

Intel 8086
Введение в язык ассемблера

2.

План:
01
02
03
Архитектура процессора 8086
Регистры микропроцессора
Флаги
Сегментная организация памяти
Способы адресации
04
Модели памяти в языке ассемблера
05
EXE- и COM-программы

3. INTEL 8086

Intel 8086 – первый 16-битный микропроцессор
98 команд (> 3800 вариаций)
Разрядность регистров – 16 бит(2 байта)
64 КБ – Размер адресного пространства I/O
(диапазон адресов)
1 MB – Размер всего адресного пространства

4. СТРУКТУРА ПРОЦЕССОРА

Структуру центрального процессора Intel 8086
можно разделить на 2 логических блока:
• Блок исполнения (EU:Execution Unit):
o Арифметическо-логическое устройство (ALU);
o Устройство управления CU (Control Unit);
o 9 регистров.
• Блок интерфейса шин (BIU:Bus Interface Unit):
o Устройство управления шинами;
o Блок очереди команд;
o 5 регистров.
Интерфейс – совокупность средств, обеспечивающих взаимодействие
устройств/программ в компьютере и с пользователем.

5. СТРУКТУРА ПРОЦЕССОРА

6. БЛОК ИСПОЛНЕНИЯ (EU)

Блок исполнения (EU) состоит из:
o
Арифметическо-логическое устройство (ALU) –
выполняет все основные арифметические и
логические операции над данными, такие как
сложение, вычитание, сравнение и другие
вычисления;
o
Устройство управления CU (Control Unit) – блок
управления, который координирует работу всех
компонентов центрального процессора и выполняет
инструкции;
o
9 регистров (AX, BX, CX, DX, SP, BP, SI, DI, а
также регистр Flags).
Устройства блока EU обеспечивают обработку команд,
выполнение арифметических и логических операций.

7. БЛОК ИНТЕРФЕЙСА ШИН (BIU)

Блок интерфейса шин (BIU) состоит из:
o
Устройство управления шинами – управляет
передачей данных между различными устройствами
по шине;
o
Блок очереди команд – извлекает команды из
памяти для их последующего выполнения;
o
Регистры сегментов (CS, DS, SS, ES);
o
Регистр IP (Instruction Pointer).
Устройства блока BIU обеспечивают доступ к внешней
шине, передачу данных/адресов по шине (размер шины
данных 16 бит, а размер шины адресов 20 бит);
обменивают данные с EU (в частности для ALU). Выборка
команд и помещение их в очередь команд. Размер очереди
команд 6 байт.

8.

РЕГИСТРЫ
В состав процессора 8086 входит 14
шестнадцатиразрядных регистров, которые
используются для управления выполнением команд,
адресации операндов и выполнения арифметических и
логических операций.
Все регистры можно разделить на 4 группы:
1) 8 регистров общего назначения (AX, BX, CX, DX,
SP, BP, SI, DI);
2) 4 сегментных регистра (CS, DS, ES, SS);
3) Flags или регистр признаков (аналогично CCR в
моторолле);
4) IP (Instruction Pointer) или счетчик команд
(аналогично PC в моторолле).
Регистр – сверхбыстрая ячейка памяти для временного хранения
данных. В Intel 8086 размер регистра – 16 бит (2 байта).

9.

РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ
Эти регистры ввиду своего названия могут хранить любые данные. Однако для
выполнения каких-либо более ресурсозатратных операций это было бы не логично.
Поэтому каждый регистр также имеет свое специальное назначение (в следующих лекциях
и примерах будет ясно, какой регистр где лучше использовать).
АХ - (accumulator) – обычно применяется в операциях умножения, деления, работой с
портами, с вводом и выводом, (для прерываний как указатель на подвид прерывания).
ВХ – (base) – обычно используется для хранения адреса, который обычно представлен в
виде смещения в сегменте данных. Благодаря этому регистру можно удобно обращаться к
элементам памяти.
СХ – (count) – обычно используется в качестве счетчика, аналог do{…} while(--count).
Удобен тем, что некоторые команды по умолчанию будут декрементировать его по мере
итераций. Используется в циклах, командах со строками и тп.
DX – (data) – обычно используется в качестве хранения адреса буфера для работы с
вводом строк, делением чисел, выводом символов.

10.

РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ
Ввиду того, что некоторые прерывания имеют параметры, и в
зависимости от этих параметров меняется смысл прерывания
(например, ввод символа, или вывода символа), только у этих 4-х
регистров существует обращение к старшим и младшим байтах (H к
старшему, L к младшему):
1.AX: AH/AL;
2.BX: BH/BL;
3.CX: CH/CL;
4.DX: DH/DL.
Для очистки регистра (или отдельного байта регистра) используют команду XOR.
Например, команда XOR CH, CH очищает старший байт регистра CX.

11.

РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ
Следующие 4 регистра все еще общего назначения, но
первые два из них (SP, BP) иногда называют регистрыуказатели, а последние – индексные-регистры (SI, DI).
Все 4 регистра также иногда называют адресными, т.к
чаще их используют для хранения адреса:
• SP – Stack Pointer
• BP – Base Pointer
SI – Source Index
DI – Destination Index

12.

РЕГИСТРЫ-УКАЗАТЕЛИ
SP – указатель на стек (stack pointer) – регистр,
содержащий в себе смещение в сегменте стека, указывающее на
верхушку стека(последний элемент).
Стек растет вверх, соответственно адреса уменьшаются.
Тогда если SP был равен 44, и мы положили в него регистр (2
байта), то SP=44-2=42. Данный регистр работает с сегментом
стека SS, позволяя удобнее адресоваться. При работе с
командами добавления/извлечения из стека, значение SP
соответственно изменяется.
BP – указатель базы (base pointer), обычно хранит адрес
переменных, которые хранятся в стеке, облегчая доступ к ним,
но также может хранить любой другой адрес.

13.

ИНДЕКСНЫЕ РЕГИСТРЫ
SI – индекс источника(source index) – обычно хранит адрес источника (переменной,
массива), работает с сегментом данных DS для адресации.
DI – индекс приемника(destination index) – обычно хранит адрес приемника
(переменной, массива), работает с сегментом данных ES для адресации.
Ключевая идея при работе с этими регистрами:
SI – откуда берем;
DI – куда кладем.
Эти регистры могут облегчить жизнь при работе со строками, используя команды
MOVS, STOS, LODS, CMPS. Они работают в связке с предопределенными циклами REP,
REPE, REPNE и регистром CX (в качестве длины). SI/DI автоматически
инкрементируются в случае, если сброшен флаг D (DF = 0), и декрементируются в
случае, если установлен флаг D (DF = 1).
В помощь к лабораторной:
Есть два массива. Нужно заполнить 2-й массив элементами 1-го.
В SI сохраняем адрес начала 1-го массива, в DI – адрес начала 2-го массива
Сбрасываем флаг D (CLD), заносим в СХ длину массива. Используем связку команд: REP
MOVSB(bytes).

14.

СЕГМЕНТНЫЕ РЕГИСТРЫ
Сегментные регистры указывают на начала 4-х сегментов:
CS - (code segment) – содержит адрес начала сегмента кода. Работает в
связке с IP (указатель команд), используя его как смещение, определяет адрес
выполняемой команды (адрес команды = CS:IP).
DS – (data segment) – содержит адрес начала сегмента данных. По умолчанию
смещение для данных задается в BX,SI,DI.
ES – (extra segment) – хранит адрес начала доп сегмента данных.
Используется обычно в связке с DI, для работы со строками.
SS – (stack segment) – хранит адрес начала сегмента стека. Работает с
SP/BP как со смещением.
В сегментные регистры нельзя задать значение непосредственно напрямую (а в CS
вообще никак нельзя)! Для этого обычно используют регистр общего назначения
(например, AX).

15.

РЕГИСТР УКАЗАТЕЛЯ КОМАНД
IP – (Instruction Pointer) - содержит смещение на
выполняемую команду. В связке с СS адресуется на
выполняемую команду.
В целом используется при отладке. Аналогично CS,
просто так его значение нельзя поменять.

16.

РЕГИСТР ФЛАГОВ
FLAGS – отражает состояние процессора. Из 16 бит, используется лишь 9.
Разные биты автоматически меняются по состоянию операций, также флаг
регистров можно положить и взять из стека (pushf, popf).

17.

ФЛАГИ
OF (Overflow Flag) – флаг переполнения. Устанавливается в
единицу в случае переполнения при выполнении операций сложения
и вычитания со знаковыми числами, тем самым указывает на потерю
старшего бита результата.
DF (Destination Flag) – флаг направления. Если D = 0 SI/DI
инкрементируются при работе с памятью. Если 1, декрементируются.
IF (Interrupt Flag) – флаг аппаратных прерываний. При установке
в 1 реагирует на внешние аппаратные прерывания, при 0 они
маскируются или маскируются по входу INTR. Не влияет на внешние
немаскируемые и программные прерывания.

18.

ФЛАГИ
TF (Trap Flag) – флаг пошагового режима. При установке этого
бита в единицу, можно отлаживать программу. По завершению
каждой команды возникает прерывание работ микропроцессора.
SF (Sign Flag) – флаг знака. Если результат операции
отрицательный, то SF = 1, иначе SF = 0. Совпадает со старшим
битом результата.
ZF (Zero Flag) – флаг нулевого результата. Если результат
операции 0, то ZF = 1, иначе 0.

19.

ФЛАГИ
AF (Auxillary Flag) – флаг дополнительного переноса.
Используется при операции в двоично-десятичном коде. При
переносе из младшей тетрады в старшую, при сложении или при
заеме AF = 1.
PF (Parity Flag) – флаг четности. Если в младшем байте
результата четное число единиц-битов, то PF = 1, иначе – 0.
CF (Carry Flag) – флаг переноса. При арифметических операциях
содержит перенос из старшего бита после арифметических
операций, а так же последний бит при сдвигах или циклических
сдвигах. Может быть установлен в ноль командой clc и в единицу
командой stc.

20.

СЕГМЕНТНАЯ ОРГАНИЗАЦИЯ ПАМЯТИ
Сегментом называется область, которая начинается на
границе параграфа, т.е. по любому адресу, который делится на
16 без остатка. Хотя сегмент может располагаться в любом
месте памяти и иметь размер до 64 Кбайт, он требует
столько памяти, сколько необходимо для выполнения программы.
Внутри программы все адреса памяти относительны к началу
сегмента. Такие адреса называются смещением от начала
сегмента.
Двухбайтовое смещение (16-бит) может быть в
пределах от 0000₁₆ до FFFF₁₆ или от 0 до 65535. Для обращения
к любому адресу в программе, компьютер складывает адрес в
регистре сегмента и смещение.

21.

СЕГМЕНТНАЯ ОРГАНИЗАЦИЯ ПАМЯТИ
Как же тогда получается реальный адрес? И почему объём адресуемой
памяти 1 мбайт, не смотря на ограничение в 64 кбайт для сегментов?
Т.к адрес сегмента находится на границе параграфа, то последние 4 бита
равны нулю, однако специалисты посчитали, что нет смысла хранить эти 4
нулевые бита.
Таким образом, полагают, что адрес хранится как 16-ричное число ХХХХ,
компьютер полагает, что в конце имеются еще 4 нулевых бита, т.е XХХХ0.
Таким образом можно адресоваться до 1мбайт.
По сути вычисление адреса происходит так:
Физический адрес = Адрес сегмента * 2^4 + смещение (2 байта).
Получается 2^16 * 2^4 + 2 байта = 2^20 байт = 1Мб.

22.

МОДЕЛИ ПАМЯТИ
Модели памяти – модели, представляющие
собой размерность и кол-во сегментов.
tiny
small
CS,DS в одном
сегменте
< 64Kb,
указатель near
CS,DS – 2
сегмента,
< 64Kb каждый,
near/near
medium
CS, DS –
CS > 64Kb,
DS < 64Kb
far/near
compact
CS,DS –
CS < 64Kb,
DS > 64Kb
near/far
large
huge
CS, DS
оба > 64Kb,
но каждый 2
сегмента max,
far/far
CS, DS
оба > 64Kb,
количество
сегментов не
ограничено,
размер данных
может быть
64Kb
far/far

23.

EXE- И COM- ПРОГРАММЫ
DOS может загружать и выполнять программные файлы двух типов – COM и EXE:
• Файл COM-формата – это двоичный образ кода и данных программы. Такой файл должен занимать
менее 64Kб и не содержать перемещаемых адресов сегментов.
Файл EXE-формата содержит специальный заголовок, при помощи которого загрузчик выполняет
настройку ссылок на сегменты в загруженном модуле. Размер exe-файла может быть значительно
больше com-файла, за счет использования нескольких сегментов памяти.
Пример .COM программы:
.model tiny ; модель памяти для СОМ
.code ; начало сегмента кода
org 100h ; начальное значение IP = 100h
start:
mov ah, 9 ; номер функции DOS - в АН
mov dx, offset message ; адрес строки в DX
int 21h ; вызов системной функции DOS
ret ; завершение СОМ-программы
message db "Hello World!",0Dh,0Ah,'$' ;
строка для вывода
end start ; конец программы
Пример .EXE программы:
.model small ; модель памяти для ЕХЕ
.stack 100h ; сегмент стека размером в 256 байт
.code ; сегмент кода
start:
mov ax, @data ; адрес сегмента данных
mov ds, ax ; помещается в DS
mov dx, offset message
mov ah, 9
int 21h ; функция DOS "вывод строки"
mov ax,4C00h
int 21h ; функция DOS "завершить программу"
.data ; сегмент данных
message db "Hello World!",0Dh,0Ah,'$’
end start
English     Русский Rules