7040


Schemat blokowy procesora Intel 8086

0x08 graphic


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

http://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: 

- ALU

- rejestr znaczników (FLAGS)

- blok rejestrów ogólnego przeznaczenia

- bloki sterowania

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:

Flagi kontrolne / sterujące

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.

fizyczny adres początku segmentu i rozmiar segmentu.

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



Wyszukiwarka