technik informatyk

Schemat blokowy procesora firmy Intel

 

 

Schemat blokowy procesora Intel 8086

REJESTRY OGÓLNEGO PRZEZNACZENIA
AX - Accumulator
BX - [Basic Register]
CX - [Count Register]
DX - [Data register]

REJESTRY WSKAŹNIKOWE
SP - [Stack Pointer]
BP - [Base Pointer]
SI - [Source Index]
DI - [Destination Index]

REJESTRY SEGMENTOWE
CS - [Code Segment]
DS - [Data Segment]
SS - [Stack Segment]
ES - [Extra Segment]

Wskaźnik rozkazów
IP - [Instruction Pointer]

F  - [FLAGS] rejestr znaczników

1. Blok rejestrów podstawowych
2. Blok rejestrów segmentowych,
3. Dwudziestobitowy sumator,
4. Magistrala wewnętrzna C,
5. Kolejka rozkazów,
6. Układ sterowania,
7. Układ sterowania magistral,
8. Magistrala wewnętrzna A,
9. (ALU),
10. Szyna adresowa,
11. Szyna danych,
12. Szyna sterowania,



 
Wielkość magistrali adresowej – 20 b
Max wielkość pamięci operacyjnej – 1 MB = 220

Wielkość offsetu – 16 b [wartości 0-65535 b]
64kb – maksymalna wielkość segmentu

physical address = (segment << 4) + offset
physical address = segment * 16 + offset)
     




SPOSOBY ADRESOWANIA


 
Opis [8088/8086]    Liczba cykli zegara      
Przesunięcie    6      
Rejestr bazowy (Base) lub indeksowy (Index) (BX,BP,SI,DI)    5      
Przesunięcie+(Baza lub Indeks)     9      
Baza+Indeks (BP+DI,BX+SI)    7      
Baza+Indeks(BP+SI, BX+DI)     8      
Baza+Indeks+Przesunięcie(BP+DI, BX+SI)     11      
Baza+Indks+Przesunięcie (BP+SI+disp, BX+DI+disp)     12     
 - dodaj 4 cykle dla słów w nieparzystych adresach
 - dodaj 2 cykle do nadpisania segmentu
 - 80188/80186 taktowanie różni się od tego z 8088/8086/80286



https://www.et.byu.edu/groups/ece425web/stable/labs/8086Assembly.html
The Effective Address
There are several ways to reference memory locations and specific registers that must be used. A memory reference is placed in brackets to distinguish it from a register or immediate value. In general, memory accesses take the form of the following example:
    mov    ax, [baseReg + indexReg + constant]
This example copies a word sized value into the register AX. Combined, the three parameters in brackets determine what is called the effective address, which is simply the offset referenced by the instruction. The following rules apply:
   baseReg can be:  bp or bx
  indexReg can be:  si or di
  constant can be:  16-bit signed number if combined with registers, as in "mov ax,[bp+2]"
                    16-bit unsigned number if by itself, as in "mov ax,[2]"
Any one or two of the memory access parameters (i.e., constant, baseReg, or indexReg) can be omitted, allowing for several memory access modes.
It is important to realize that the effective address, or offset, does NOT give the complete address for the memory reference. A segment register is either implied or given in the instruction. This topic is discussed in the section Segment Registers below.
Segment Registers
One of the segment registers is always used as the segment when evaluating an address. The available segment registers are the Data Segment (DS), Extra Segment (ES), Stack Segment (SS), or Code Segment (CS). Therefore, you must be aware of which segment register is used when an address is evaluated as part of an instruction. When a memory reference is given in an instruction, the processor sums any baseReg, indexReg, and constant that are given and uses this sum as the offset into the segment.
Which segment register that is used in the address calculation depends on the register that is used for baseReg. The DS register is assumed for the segment unless baseReg is the register BP, in which case SS is assumed. However, any segment register can be explicitly specified using what is called a segment override prefix (discussed below). Also, some special instructions may assume other segment registers.
Segment Overrides
A segment override prefix allows any segment register (DS, ES, SS, or CS) to be used as the segment when evaluating addresses in an instruction. An override is made by adding the segment register plus a colon to the beginning of the memory reference of the instruction as in the following examples:
    mov    ax, [es:60126]          ; Use es as the segment
    mov    ax, [cs:bx]             ; Use cs as the segment
    mov    ax, [ss:bp+si+3]        ; Use ss as the segment
Operand Size
A memory reference can be used as a source or destination operand for most 8086 instructions. Any time a memory reference is given as part of an instruction, the size of the memory operand is either implied or must be specified. For example consider the following instruction:
    mov    ax, [bx]
This instruction will move the word stored at DS:BX and put it into AX. The size of word is implied since the AX register is one word in size. In some cases the size of the operand must be given in order for the assembler to generate an instruction. For example, to increment a variable pointed to by BX, the assembler will not accept the following:
    inc    [bx]        ; WRONG!!
This is because it does not know if [bx] addresses a byte or word sized value. So the size of [bx] must be specified, as in the following two examples:
    inc    word [bx]    ; Increment word at [bx]
    inc    byte [bx]    ; Increment byte at [bx]
It is not necessary to specify the size if one of the operands has a known size, such as a register operand, as in:
    add    al, [bx]    ; Assembler knows al is a byte so "byte [bx]" is assumed
Addressing Modes
Here are some examples of the allowed addressing modes:
    xor    cx, [59507]     ; Direct mode (XOR CX with word at DS:E873)
    push    word [bx]     ; Register-indirect mode (Push word at DS:BX onto stack)
    mov    ax, [bp-4]     ; Base mode (Move word at SS:(BP-4) into AX)
    sub    [si+2], bx     ; Indexed mode (Subtract BX from word at DS:(SI+2))
    not    byte [bp+di]     ; Base-indexed mode (Invert bits of byte at SS:(BP+DI))   
    add    [bx+si+2], dx     ; Base-indexed mode with dispacement (Add DX to word at DS:(BX+SI+2))
The five addressing modes available are outlined more precisely for your reference below:
  Direct Mode: [constant]
    constant: 16-bit unsigned value

  Register-Indirect Mode: [register]
    register: bx, si, or di
    Note: bp technically isn't allowed. If used, assembler will generate [bp+0] instead.
 
  Base Mode: [constant + baseReg]
    constant: 8-bit or 16-bit signed value
    baseReg: bp or bx
 
  Indexed Mode: [constant + indexReg]
    constant: 8-bit or 16-bit signed value
    indexReg: si or di

  Base-Indexed Mode: [baseReg + indexReg]
    baseReg: bp or bx
    indexReg: si or di

  Base-Indexed Mode with Displacement: [constant + baseReg + indexReg]
    constant: 8-bit or 16-bit signed value
    baseReg: bp or bx
    indexReg: si or di




The 8086 uses little endian format
This means that the least significant byte of a value is stored first (at the low address) in memory. This gives the appearance of numbers being stored in memory backwards.
Little endian (cienkokońcowość)  forma zapisu danych, w której mniej znaczący bajt (dolny bajt, low-order byte) umieszczony jest jako pierwszy. Procesory, które używają formy little endian, to między innymi Intel x86, AMD64, DEC VAX.
Np. 32-bitowe: 4A 3B 2C 1D pod adresem 100
  (low addr)              (high addr)
 
    100    101    102    103          
...    1D    2C    3B    4A    ...     



Procesor 8086 
Pierwszy procesor z rodziny 80x86.

Zbudowany z dwóch równocześnie pracujących jednostek: 
·    jednostka wykonawcza EU ( Execution Unit ) [odpowiedzialna za wykonywanie rozkazów]
- ALU
- rejestr znaczników (FLAGS)
- blok rejestrów ogólnego przeznaczenia
- bloki sterowania
·    jednostka sterowania magistrali BIU (Bus Interface Unit) [odpowiedzialna za współpracę z otoczeniem]
W czasie wykonywania rozkazów mikroprocesor musi czekać na odpowiedź pamięci,
(np. na kod operacyjny rozkazu w cyklu pobierania rozkazu).
W tym czasie mikroprocesor może być zajęty obliczaniem adresu efektywnego.
Obie czynności angażują różne bloki mikroprocesora i mogą być wykonywane równocześnie.
Rejestry ogólnego przeznaczenia:  
 
AX (Accumulator)    Wykorzystywany głównie do operacji arytmetycznych i logicznych. Można go traktować jako rejestr 16-bitowy bądź jako dwa rejestry 8-bitowe: AH(znacząca) i AL.      
BX (Base Registers)    Rejestr bazowy, głównie wykorzystywany przy adresowaniu pamięci. Dzieli się na BH i BL.      
CX
(Counter Registers)    Często wykorzystywany jako licznik, np. przy instrukcji LOOP. Dzieli się na CH i CL.      
DX (Data Register)    Rejestr danych, wykorzystywany przy operacjach mnożenia i dzielenia, a także do wysyłania i odbierania danych z portów.
Dzieli się na DH i DL.     

Wykorzystywane do:
+ przechowywania dowolnych danych
+ wykonywania różnych operacji (arytmetycznych, logicznych),
+ funkcje specjalne (wg których są one nazwane)
AX (accumulator)
Wykorzystywany przez arytmometr ALU.
Używany w operacjach logicznych, arytmetycznych i do odkładania wyników wielu operacji.
8 dolnych bitów tego rejestru określa się jako rejestr AL.
8 górnych bitów określanych jest jako rejestr AH. 
BX (basis register) - rejestr bazowy; może być on uważany jako dwa 8 bitowe rejestry BL i BH.
16 bitów może być użytych jako część adresu dostępnego obszaru pamięci, tworząc z rejestrem segmentowym pełny adres. 
CX (count register) - rejestr zliczający, wykorzystywany również do blokowego przesyłania danych. Może być również używany jako dwa rejestry 8-bitoweCL i CH. 
DX (data register) - jedyny rejestr, w którym można podać adres portu w połączeniu z rozkazami IN i OUT, wykorzystuje się go również do operacji mnożenia i dzielenia. 
 
Rejestry wskaźnikowe i indeksowe  
SP (stack pointer) - wskaźnik stosu. Podobnie jak rejestr BX ten może być użyty jedynie jako wskaźnik pamięci. Stosowany jest on często podczas operacji zapisu i odczytu stosu, tworząc z rejestrem SS pełny adres danej, ostatnio danej na stos w postaci SS:SP. 
BP (base pointer) - wskaźnik bazy. Używany jest on podczas operacji niestandardowych np. przy pobieraniu parametrów przekazywanych przez stos. Podobnie jak rejestry BX, SI i DI, rejestr ten może być stosowany jako wskaźnik pamięci, ale z pewną różnicą. Kiedy BX, SI i DI są rejestrami spełniającymi swoje funkcje normalnie, jako wskaźniki pamięci względem rejestru segmentowego DS. (rejestr DI może być też użyty z rejestrem ES), to BP jest wskaźnikiem względem rejestru SS, tzn. że pełny adres logiczny z użyciem BP ma postać SS:BP. Rejestr BP jest stosowany do zapamiętywania położenia na stosie określonej informacji. 
SI (source index) - rejestr indeksowy źródła. Podobnie jak BX, może być on użyty jako wskaźnik pamięci i jest on niezwykle cenny w instrukcjach przetwarzających łańcuchy znaków, tworząc wówczas pełny adres DS:SI 
DI (destination index) - rejestr indeksowy przeznaczenia. Rejestr DI jest podobny do rejestru SI z tym, że może on być użyty jako wskaźnik pamięci i ma specjalne właściwości kiedy użyty jest w połączeniu z instrukcjami przetwarzającymi łańcuchy znaków, tworząc w połączeniu z rejestrem ES pełny adres ES:DI. Pomiędzy rejestrami SI i DI istnieje podstawowa różnica: SI jest wskaźnikiem adresu źródła łańcucha znaków, DI jest wskaźnikiem adresu przeznaczenia łańcucha znaków. Poza tym SI adresuje pamięć względem DS, a DI adresuje zawsze względem ES. 
 
Rejestry segmentowe:   
Służą one do adresowania pamięci operacyjnej. Pamięć o maksymalnej wielkości 1 MB jest dzielona na logiczne segmenty nie większe niż 64kB. 
CS (code segment) - rejestr wskazuje początek 64 kilobajtowego bloku pamięci, segmentu kodu, w którym znajdują się kolejne instrukcje do wykonania. Tworzy pełny adres logiczny wespół z rejestrem IP o postaci CS:IP. Rozkaz w obecnie wykonywanej sekwencji musi mieć swój adres początkowy zawarty w rejestrze CS. Rejestr CS może być zmieniony numerem instrukcji zawierającej jakieś skoki, wywołania, powroty. Wszystkie rozkazy programu pobierane są w stosunku do zawartości tego rejestru i musza być umieszczone w pamięci w co najmniej jednym segmencie kodu. 
DS (data segment) - rejestr segmentowy danych, wskazuje na początek tego segmentu. 
SS (stack segment) - rejestr stosu, wskazuje początek segmentu stosu, którym jest 64 kB blok pamięci. 
ES (extra segment) - rejestr dodatkowy, wskazuje dodatkowy segment danych. 
 
Licznik rozkazów  
IP (instruction pointer) - rejestr ten jest wskaźnikiem rozkazów i wraz z rejestrem CS adresuje kolejne rozkazy do wykonania. Rejestr IP wskazuje adres względem początku segmentu programu (offset). 

Rejestr znaczników / REJESTR FLAG
 
                    O    D    I    T    S    Z         A         P         C     

O (Overlow Flag)    Znacznik nadmiaru, zostaje ustawiony przy wystąpieniu nadmiaru w operacjach arytmetycznych, czyli np. przy przekroczeniu dopuszczalnego zakresu wyniku operacji.      
D (Direction Flag)    Znacznik kierunku, określa czy dane będą przesyłane w kolejności adresów rosnących, czy malejących. Jeśli jest równy 0, to SI i DI będą zwiększane, w przeciwnym wypadku będą zmniejszane.      
I (Interrupt Flag)    Znacznik zezwolenia na przerwanie, określa czy przerwanie sprzętowe ma być wykonane natychmiast po zgłoszeniu, czy dopiero po zakończeniu wykonywania programu.      
T (Trap Flag)    Znacznik pracy krokowej. Określa, czy po każdej wykonanej instrukcji procesora wykonywane jest przerwanie pracy krokowej.      
S (Sign Flag)    Znacznik znaku. Zawiera znak wyniku ostatnio wykonanej operacji arytmetycznej.      
Z (ang. Zero Flag)    Znacznik zera.Zostaje ustawiony, jeśli wynikiem ostatniej operacji arytmetycznej był wynik zero.      
A (ang. Auxiliary Carry Flag)    Znacznik przeniesienia połówkowego. Zostaje ustawiony, gdy mamy do czynienia z przeniesieniem z bitu 3 na bit 4 lub pożyczką z bitu 4 na 3      
P (ang. Parity Flag)    Znacznik parzystości.      
C (ang. Carry Flag)    Znacznik przeniesienia.     

[wikipedia]
Na magistralę wysyłana może być też zawartość rejestru znaczników. Rejestr ten jest 16-bitowy, przy czym wykorzystywanych jest 9 bitów.  Siadem bitów tego rejestru jest niewykorzystanych i ich wartość jest nieokreślona.
Flagi stanu:
·    SF (sign flag) - znacznik znaku - równy najbardziej znaczącemu (najstarszemu) bitowi wyniku ostatniej operacji
o    0 - wynik operacji dodatni
o    1 - wynik operacji ujemny (najbardziej znaczący bit w otrzymanym wyniku == 1)
·    ZF (zero flag) - znacznik zera
o    0 - wynik operacji różny od zera
o    1 - wynik operacji == 0
·    PF (parity flag) - znacznik parzystości - ustawiany w zależności od liczby jedynek w najniższych 8 bitach wyniku (w mniej znaczącym bicie)
o    0 liczba jedynek w wyniku operacji nieparzysta
o    1 liczba jedynek w wyniku operacji parzysta
·    AF (auxiliary carry flag) - znacznik przeniesienia połówkowego (pomocniczego)
o    Wykorzystywany przy obliczeniach prowadzonych na liczbach BCD (dziesiętnych kodowanych dwójkowo)
o    0 - brak przeniesienia pomiędzy trzecim i czwartym bitem bajtu (BCD)
o    1 - występuje przeniesienie
·    CF (carry flag) - znacznik przeniesienia
o    0 - wynik operacji arytmetycznej nie powoduje powstania przeniesienia z najbardziej znaczącego bitu
o    1 - wynik takie przeniesienie powoduje [podczas działania nastąpiło przeniesienie z bitu najbardziej znaczącego na zewnątrz, lub nastąpiła pożyczka z zewnątrz do bitu najbardziej znaczącego]
o      11101110     
+ 10010001 
1 01111111      
Otrzymujemy przeniesienie. Gdybyśmy nie uwzględniali przeniesienia to otrzymany wynik dałby nam 127d, a więc błąd. Dzięki temu znacznikowi wiemy kiedy wynik na 8 bitach jest błędny.
·    OF (overflow flag) - znacznik nadmiaru [sygnalizacja wystąpienia błędu ostatniej operacji arytmetycznej]
o    0 - suma modulo 2 przeniesień z najbardziej znaczącej pozycji i pozycji przedostatniej jest równa 0
o    1 - suma modulo 2 przeniesień z najbardziej znaczącej pozycji i pozycji przedostatniej jest równa 1 (przekroczenie zakresu w kodzie U2) [działaniu wystąpiło przeniesienie poza flagę CF, lub pożyczka spoza tej flagi]
Flagi kontrolne / sterujące
·    IF (interrupt flag) - znacznik przerwań
o    0 - ignorowanie przerwań maskowych (z wejścia INT)
o    1 - zezwolenie na przyjmowanie przerwań w tym programie
·    DF (direction flag) - znacznik kierunku, wskazuje, czy zawartości rejestrów SI i DI mają być·     zwiększane lub zmniejszane o jeden w czasie wykonywania operacji na ciągach.        //Służy do określania kierunku automatycznych zmian wartości wskaźników w rozkazach operujących na zwartych blokach pamięci operacyjnej (LODS. MOVS).
o    0 - rejestry są zwiększane
o    1 - rejestry są zmniejszane (przetwarzanie łańcuchów znaków dokonuje się przy rosnących adresach)
·    TF (trap flag) - znacznik pułapki umożliwiającej pracę krokową.
o     Znacznik ten może byćo     ustawiony za pomocą jedynki na odpowiedniej pozycji słowa stanu programu PSW (program status word)
o    Umożliwia analizę programu poprzez realizację krok po kroku z możliwością kontroli wyników każdego kroku.
o    0 – bez
o    1 - praca krokowa włączona  (procesor po każdej wykonanej operacji przechodzi do specjalnych procedur obsługi

Segmentacja
Schemat zarządzania pamięcią
Program jest zbiorem segmentów.

Segment jest jednostką logiczną, taką jak: program główny, procedura, funkcja, stos, tablica symboli, tablice, zmienne lokalne i globalne.
·    Adres logiczny: (numer_segmentu: przesunięcie).
·    Tablica segmentów: każda pozycja zawiera:
 fizyczny adres początku segmentu i rozmiar segmentu.
·    Rejestr bazowy tablicy segmentów zawiera adres tablicy.
Ochrona: z każdą pozycją w tablicy segmentów są związane bity ochrony.
Dzielenie: na poziomie segentów jest bardziej naturalne niż na poziomie stron, ten sam adres w różnych pozycjach tablicy stron różnych procesów.
Przydział pamięci: pierwszy/najlepszy pasujący, fragmentacja zewnętrzna.

Tryb rzeczywisty adresowania to tryb pracy mikroprocesorów z rodziny procesorów x86, w którym procesor pracuje tak jak procesor Intel 8086.

Adres logiczny (programowy) składa się z dwóch liczb 16b:
segmentu (numeru segmentu) oraz przemieszczenia względem początku segmentu (offset).
Adres fizyczny = segment * 16 + przemieszczenie.

Adres fizyczny - adres słowa pamięci fizycznej, pojawiający się na magistrali adresowej procesora w momencie odwoływania się do pamięci operacyjnej lub przestrzeni wejścia-wyjścia.
Adresy są zapisywane szesnastkowo - wystarczy dopisać do wartości segmentu adresowego szesnastkową cyfrę "0" i zwiększyć ją o offset.


Ponieważ segmenty nie są rozłączne, wiele różnych adresów logicznych może odwoływać się do tej samej komórki pamięci (dokładnie - jeden adres fizyczny jest opisywany przez 4096 różnych adresów logicznych)
segment:offset = 0x1000:0xA000
adres fizyczny = 0x1000*16 + 0xA000 = 0x1A000
segment:offset = 0x1900:0x1000
adres fizyczny = 0x1900*16 + 0x1000 = 0x1A000

Ponieważ segment i przemieszczenie mają 16 bitów, dlatego w trybie rzeczywistym można maksymalnie zaadresować 1088 kB pamięci, ale procesory Intel 8086, 8088, 80188 oraz 80186 posiadają 20-bitową szynę adresową i z tego powodu mogą zaadresować tylko 2^20 = 1024 kB pamięci – przy próbie sięgnięcia do adresu powyżej 1024 kB w rzeczywistości odwołają się do adresu o 1 MB niższego.

// Procesory nowsze, tzn. i286, i386 itd., mają szersze szyny adresowe (24-, 32- lub 36-bitowe) toteż pracując w trybie rzeczywistym mogą adresować całe 1088 kB pamięci.
System DOS począwszy od wersji 4.0 potrafił wykorzystać te dodatkowe 65536-16 B pamięci, która została nazwana pamięcią wysoką (HMA — High Memory Area).
Jednak powoduje to niepełną zgodność z procesorami Intel 8086 i dlatego w komputerach zgodnych z IBM/PC została wprowadzona możliwość blokowania 21. linii adresowej nowszych procesorów, co sprawia, że programy pracujące w trybie rzeczywistym mają dostęp do 20 linii. Blokowanie i odblokowywanie linii 21 jest udostępniane przez ustawienie w biosie komputera bramkę A20 (ang. A20 gate; A20 to numer linii adresowej, liczony od 0).

//Nowym trybem pracy procesora Intel 80286 był tryb chroniony.
W trybie tym brak ochrony pamięci przed użyciem przez inny proces
I brak obsługi wielozadaniowości.

// W trybie rzeczywistym pracowały programy w systemie operacyjnym DOS, na przełomie lat 80 i 90 dwudziestego wieku prowadzono działania nad pracą programów w systemie DOS w trybie chronionym, pozostawiając sam system w trybie rzeczywistym, zbudowano kilka systemów umożliwiających taką pracę systemu.
W trybie rzeczywistym dostępna jest 1-megabajtowa przestrzeń adresowa. //

ASSUME nazwa_Rejestru_Segmentowego : nazwa_segmentu , ..
1 - CS, DS, SS, ES

Np.
Kod segment
assume Cs:kod, ds.:dane, ss:stosik, es:help_seg

Kod ends

Widzialne tylko podczas tłumaczenia programu – nie ma gwarancji, że podczas wykonywania – też.
Musimy użyć MOV, lub PUSH-POP

Np.:
Assume DS:kod
Mov ax, seg kod
Mov ds, ax
Push seg kod
Pop DS

Załóż własną stronę internetową za darmo Webnode