микропроцесор i80386

Први представник Интелове серије 80×86 био је 8086, па је цела серија по њему и добила име. Поред тога, његова структура регистара је у основи задржана, а повећавао се број регистара као и величина регистара. Први представник 32-битних процесора је 80386, а пошто је структура савремених Интелових процесора веома слична овој архитектури, објаснићемо је мало детаљније.
Сам процесор се састоји од 4 јединице, приказане на слици:

80386

Унутрашња структура микропроцесора и80386

извршна јединица – чини је аритметичко-логичка јединица са скупом регистара
командна (управљачка) јединица – основна компонента ове јединице је декодер инструкција са контролером редоследа инструкција
јединица за управљање меморијом – Меморија је подељена на странице величине 4kB (за примену виртуелне меморије). Поред тога, процесор меморију види кроз неколико наменски подељених сегмената (кодни сегмент, стек сегмент и неколико сегмената података), па се за приступ подацима у тим сегментима користе сегментни регистри који дефинишу почетну адресу сегмента, а у показивачу инструкција налази се померај у односу на почетак сегмента. За одређивање адресе и приступ меморијским локацијама, задужене су две компоненте процесора, обе у склопу јединице за управљање меморијом: сегментна јединица и јединица страница.
магистрална јединица – обезбеђује прослеђивање одговарајућих података са унутрашњих магистрала процесора, као и из прихватних регистара (адресе и података) на системску магистралу рачунара.

Скуп регистара

Скуп регистара приказан је на слици:

%d1%80%d0%b5%d0%b3%d0%b8%d1%81%d1%82%d1%80%d0%b8386-3
Регистри означени са R0 до R7 су општи регистри, који (уз неке изузетке) чувају било податке, било адресе.
Постоји и осам регистара за рад са бројевима у покретном зарезу, који садрже било двоструке, било четвороструке речи. Ови регистри садрже и проширење, које омогућује да се ту сместе речи дужине 80 битова.

%d1%80%d0%b5%d0%b3%d0%b8%d1%81%d1%82%d1%80%d0%b8386-2
Архитектура процесора 80386 је заснована на меморијском моделу који различитим областима меморије (који се називају сегменти) придружује различите сврхе коришћења: кодни сегмент садржи инструкције програма, стек сегмент је у ствари стек меморија, и постоје четири сегмента података. Сегментни регистри (CS, DS, SS, ES, FS, GS) садрже вредности које представљају почетне адресе одговарајућих сегмената, другим речима садрже тзв. сегментни део неке адресе. 32-битна адреса код процесора 80386 обезбеђује приступ ма којој меморијској локацији, без обзира да ли се ради о програму, процесорском стеку или подацима програма.
Регистар CS увек садржи (и не може се користити за друге намене) сегментни део адресе текуће инструкције. Наиме, када се извршава неки програм, инструкције тог програма су смештене у RAM меморији, а CS регистар у сваком моменту садржи сегментни део адресе оне инструкције која се у датом тренутку извршава. Офсетни део адресе, односно померај у односу на почетак сегмента налази се у показивачу инструкција.
Регистар DS је предвиђен да садржи сегментни део адресе података у RAM меморији над којима програм оперише. На пример, ако се у инструкцији за сабирање као први аргумент зада регистар AX, а као други аргумент се наведе само офсетни део адресе неке “променљиве” у RAM меморији (иначе, може да се зада и сегментни и офсетни део адресе), процесор ће аутоматски подразумевати да је сегментни део адресе те “променљиве” смештен у DS регистру. Исто важи и за многе друге инструкције.
Регистар SS увек садржи (и не може се користити за друге намене) сегментни део адресе података у стеку (тј. стек сегменту). Сви подаци на стеку имају адресе чији је сегменти део исти – садржај регистра SS, а офсетни део адресе, односно померај у односу на почетак сегмента налази се у показивачу стека (SP).
Регистри ES, FS и GS су помоћни сегментни регистри. На пример, ако DS регистар садржи сегментни део адреса података у једном сегменту података, неки од регистара ES, FS или GS може да садржи сегментни део адресе података у другом сегменту података.

%d1%80%d0%b5%d0%b3%d0%b8%d1%81%d1%82%d1%80%d0%b8386-1
Специјализовани регистри процесора 80386 су бројач инструкција и статусни регистар. Bројач инструкција назива се показивач инструкција, а статустни регистар садржи битове стања који указују на стање аритметичко-логичке јединице након извршавања инструкција.
Процесор 80386 је дизајниран са намером обезбеђења компатибилности са ранијим Интел процесорима (8086 и 80286), па и њихови општи регистри допуштају начин рада који карактерише њихове претходнике, код којих се могло радити само са речи или са бајтом и код којих су била постављена већа ограничења на начин коришћења појединих регистара.
Код Интел-ових 8-битних процесора, регистри су се звали A, B, C, D. Код 16-битних процесора, регистри су били AX, BX, CX, DX, при чему су виши и нижи бајтови тих регистара били идентификовани са суфиксима H и L респективно (уместо X). Тако је AH означавало горњи бајт регистра AX, а BL доњи бајт регистра BX. Иако ови регистри спадају у регистре опште намене, ипак сваки од њих има своју специфичну улогу:
– AX – акумулатор
– BX – базни регистар, користи се код базног адресирања
– CX – бројач у инструкцијама циклуса
– DX – помоћни акумулатор за операције множења и дељења

%d1%80%d0%b5%d0%b3%d0%b8%d1%81%d1%82%d1%80%d0%b8386-4
Показивачки (SP, BP) регистри и индексни (DI, SI) регистри користе се за формирање адресе. У сегментним регистрима се чува почетна адреса сегмента, а у показивачким и индексним регистрима се чува померај у односу на ту почетну адресу, односно офсетни део адресе.
Регистар SP увек садржи (и не може се користити за друге намене) офсетни део адресе податка на врху стека. Инструкције за стављање података на стек и скидање података са стека аутоматски мења садржај SP регистра тако да он увек садржи офсетни део адресе податка на врху стека. Према томе, вредност SS:SP=SS*16+SP увек представља физичку (20-битну код 8086, а код 80386 адреса је 24-битна) адресу податка на врху стека. Овако записана адреса означава да се стварна (ефективна) адреса добија на основу података из пара регистара SS и SP, при чему се садржај регистра SS множи са 16, односно врши се померање садржаја тог регистра за 4 позиције лево.
Регистар BP може да се користи на разне начине, али по правилу такође служи за адресирање података на стеку, тј. садржи офсетни део адресе неког податка унутар стека. На пример, ако је SP=8 и BP=6, тада SS:SP даје физичку адресу податка на врху стека, а SS:BP даје физичку адресу податка који је претходно стављен на стек.
Регистар IP увек садржи (и не може се користити за друге намене) офсетни део адресе текуће инструкције (тј. првог бајта текуће инструкције). Када се нека инструкција изврши, аутоматски мења садржај IP регистра тако да он у следећем тренутку садржи офсетни део адресе инструкције која тада креће да се извршава. Према томе, вредност CS:IP=CS*16+IP увек представља физичку (20-битну код 8086, а код 80386 адреса је 24-битна) адресу меморијске локације на коју је уписана инструкција која се у том тренутку извршава.
Регистри SI и DI се могу користити на разне начине. Често се користе при формирању резултата или операнада аритметичко-логичких инструкција. Ипак, посебно су корисни при раду са низовима. На пример, упоређивању чланова два низа, у програмској петљи при сваком проласку кроз петљу упоређује i-ти члан првог са i-тим чланом другог низа. То се може реализовати тако да се садржаји ових регистара поставе тако да у сваком тренутку садрже офсетни део адресе првог тј. другог низа.
Код 80386 називима регистара се додаје префикс E, који означава проширивање, па се стога у Интел-овој техничкој документацији ови регистри називају EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI.
Дизајн процесора 80386 омогућава да програм написан на машинском језику неког старијег 16-битног процесора коректно ради на овом процесору, ако се стање процесора постави у тај режим рада. Процесор 80386 може динамички да се пребацује између 16-битних и 32-битних операција на основу бајтова који представљају префикс инструкције.

Начини адресирања

Процесор 80386 садрже велики и флексибилан скуп начина адресирања, дизајнираних тако да омогуће приступ било појединим члановима, било елементима низова и листи.
Инструкције процесора 80386 са два операнда имају општи облик OPkod dst, src
где је:
OPkod – код операције
dst – одредиште (то је адреса првог операнда, а на исту ту локацију смешта се и резултат)
src – извор (адреса другог операнда)
У основи, код процесора 80386 користе се три основна начина адресирања за задавање меморијских аргумената:
MOV AX, [1000] – користи директно адресирање, вредност са меморијске локације на адреси 1000 (hex) уписује у регистар AX.
MOV AX, [BX] – узима податак са локације чија је адреса претходно уписана у регистар BX и уписује га у регистар AX. Овде се користи индиректно адресирање. Приметимо да смо уместо две инструкције: MOV BX,1000 MOV AX,[BX] могли краће написати MOV AX, [1000]. Међутим, овај краћи начин није и бољи јер омогућава упис само једне вредности, а претходни само променом садржаја регистра BX даје могућност да истом инструкцијом MOV AX, [BX] приступамо различитим меморијским локацијама.
MOV AX, [1000+BX] – користи индексни (релативни) начин адресирања. Овај начин адресирања згодан је за приступање различитим елементима низа, пољима слогова и компонентама других структурираних података. Конкретно, наредба MOV AX, [1000+BX] уписује у AX податак са локације која је за 1000 (hex) бајтова удаљена од локације чија се адреса налази у BX.
Микропроцесор 80386, ипак, има много већи број адресирања од ова три, тако да ћемо их све објаснити:

Непосредно адресирање
Непосредна додела константе, на пример:
mov ah, 34h
mov ax, 4563h
вредност константе се наводи у хексадекадном систему, зато има као додатак h
За 16-битне константе, у меморију се прво смешта њен нижи, а затим виши бајт

Регистарско адресирање
Своди се на преузимање садржаја регистра и његово смештање у одредиште, на пример:
mov ax, bx
mov si, dx
mov al, dl
mov ds, ax
mov ax, cs

Регистарско индиректно адресирање
Садржај регистра, наведеног између угластих заграда, тумачи се као адреса на којој се налазе подаци, приликом употребе BX, SI, DI подразумева се DS, за BP користи се SS на пример:
mov al, [bx]
mov al, [bp]
mov al, cs:[bx] – уколико се не наведе сегментни регистар за приступ подацима подразумева се DS. У овом случају као сегментни регистар користи се CS, а то мора да се наведе!

Директно адресирање
Адреса на којој се налазе подаци задаје се директно у угластим заградама, адреса је 16-битна, подразумева се DS регистар, на пример:
mov [0045h], ax
mov al, cs:[3452h]

Индексирано адресирање
Ефективна адреса добија се сабирањем регистра и наведене константе, константа је у принципу почетна адреса блока коме се приступа, користи се DS, на пример:
mov al, 20h[si] (или: mov al, [si+20h]) – оба записа се користе, равноправни су. Други запис указује на то како се, у ствари, израчунава адреса!
mov dl, 78[di]
mov bh, ss:[di+120]

Базно адресирање
Базни регистар је почетак блока, а константа релативни положај елемента коме приступамо, на пример:
mov al, 20h[bx] (или: mov al, [bx+20h])
mov dl, 120[bp]
mov bh, cs:[bp+120]

Базно индексирано адресирање
Подваријанта индексираног адресирања, улогу константе преузима базни регистар, на пример:
mov al, ds:[bp][si] (или mov al, ds:[bp+si])
mov dl, es:[bx][di]

Базно индексирано релативно адресирање
Поред базног и индексног регистра, користи се константа помераја, на пример:
mov al, ds:25h[bp][si] (ili mov al, ds:[bp+si+25h])
mov dl, es:120[bx][di]

У следећој табели приказани су сви начини адресирања микропроцесора 80386, са објашњењем како се израчунава ефективна адреса (физичка адреса меморијске локације на којој се налази тражени податак)

назив запис у асемблеру израчунавање адресе
Непосредно адресирање вредност операнд=вредност
Директно адресирање локација EA=локација
Регистарско адресирање reg EA=reg, односно операнд=[reg]
Регистарско индиректно адресирање [reg] EA=[reg]
Базно адресирање [reg+pom] EA=[reg]+pom
Индексирано адресирање [reg*s+pom] EA=[reg]*s+pom
Базно индексирано адресирање [reg1+reg2*s] EA=[reg1]+[reg2]*s
Базно индексирано релативно адресирање (базно индексирано са померајем) [reg1+reg2*s+pom] EA=[reg1]+[reg2]*s+pom

објашњење:
вредност – 8-битни или 32-битни означени број (означени број може бити позитиван и негативан)
локација – 32-битна адреса
reg, reg1, reg2 – један од регистара опште намене: EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI, уз изузетак да се ESP не може користити као индексни регистар
pom – 8-битни или 32-битни означени број, уз изузетак да у индексираном и начину адресирања са померајем може бити једино 32-битни
S- фактор множења, може бити 1, 2, 4 или 8

Advertisements

One thought on “микропроцесор i80386

  1. Повратни пинг: Управљање меморијом – Рачунари и програмирање

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s