Wykad 3 Jak dziaa typowy mikroprocesor Budowa procesora
Wykład 3: • Jak działa typowy mikroprocesor? Budowa procesora rodziny Intel 80 x 86 Architektury CISC i RISC Instrukcje skoków warunkowych Stos Instrukcje operujące na ciągach danych Pętle
Fragment kodu programu: Język „wysokiego poziomu”: Assembler: „kod maszynowy”: Mov [edx], $3 f 800000 C 7 02 00 00 80 3 F x: =1; Mov [eax], $00000001 C 7 00 01 00 00 00 for i: =1 to 10 do . . . x: =x*2;
Kodowanie instrukcji za pomocą bajtów:
Rys. Umiejscowienie logiczne mikroprocesora w systemie mikroprocesorowym
Sygnały na „pinach” procesora.
Instrukcje wejścia/wyjścia (Input/Output):
Budowa mikroprocesora typu CISC Complete Instruction Set Computer
Budowa mikroprocesora typu RISC Reduced Instruction Set Computer
Podstawowe różnice pomiędzy CISC a RISC CISC rozbudowane instrukcje możliwość zawansowanego programowania w języku maszynowym różna długość instrukcji operacje arytmetyczne bezpośrednio na lokalizacjach w pamięci często występujące instrukcje - 8 bitów rzadsze, rozbudowane instrukcje o większej długości znaczne różnice czasu wykonania poszczególnych instrukcji (Load Execution Store): RISC znacznie ograniczony zestaw instrukcji operacje ALU tylko na rejestrach prosty tryb adresowania uproszczone odwołania do pamięci wszystkie instrukcje identycznej długości (32 bity) znacznie prostsza konstrukcja procesora
Adresowanie pamięci w trybie rzeczywistym: rejestry segmentowe Przestrzeń adresowa wynosi 1 MB ale w obrębie segmentu tylko 64 k. B
Adresowanie pamięci: tryby adresowania mov AX, 1234 h mov AX, [1234 h] - natychmiastowy - bezpośredni mov EAX, DS: {CS, ES}[ESI] - pośredni DS – Data Segment (ES) CS – Code Segment mov EAX, [ECX+EBX*2{4, 8}+stała] - pośredni skalowany z przemieszczeniem movs EAX, [ESI] - operacja łańcuchowa (ESI, EDI – wskaźnik źródła (Source) i przeznaczenia (Destination)
Przykłady: var tablica: array[0. . 100] of single; i: integer; y: single a) y: =tablica[10 h] mov EAX, [tablica+40 h] b) y: =tablica[i+10 h] mov ebx, i lea ecx, tablica mov eax, [ecx+$10+ebx*4]
Wskaźnik rozkazów: IP (Instruction Pointer) PC (Program Counter):
Rejestr statusowy SR ( Status Register ) i instrukcje skoków warunkowych Instrukcje zmianiające stan znaczników (flag) CLC, CLD , CLI – kasujące STC, STD, STI - ustawiające
Instrukcje skoków warunkowych Dotyczące operacji arytmetycznych na liczbach bez znaku JB/JNAE JNB/AE JBE/JNA JNBE/JA (Below) (Not Below) (Below Equal) (Not Below Not Equal) CF=1 CF=0 CF=1 lub ZF=1 CF=0 i ZF=0 Dotyczące operacji arytmetycznych na liczbach ze znakiem U 2 JL/NGE JGE/NL JLE/NG JG/NLE (Less) (Greater Equal) (Less Equal) (Greater) SF<>OF SF=OF ZF=1 lub SF<>OF ZF=0 i SF=OF (Equal) (Not Equal) (Sign) (Not Sign) ZF=1 ZF=0 SF=1 SF=0 Pozostałe JE/JZ JNE/JNZ JS JNS
Instrukcje skoków warunkowych - przykład Sekwencja instrukcji w Pascal-u: var a, i: integer; (32 bity) if i<10 then a: =i else a: =10; Przykład zapisu w assemblerze CMP JGE mov JMP dword ptr [i], $0 a +$0 c EAX, [i] [a], EAX +$0 a +$0 c: mov [a], $0000000 a +$0 a:
Instrukcje skoków warunkowych - przykład Sekwencja instrukcji w Pascal-u: var a: single; (32 bity) if a>10 then a: =10; Przykład zapisu w assemblerze: Sposób 1 Sposób 2 (nowy) fld a fcomp stała fstsw ax sahf jbe +$0 a mov [ar], $41200000 a +$0 a: . . . fld a fld stala fcomi ST, ST(1) jbe omin mov [ar], $41200000 +$0 a: . . .
Stos i podprogramy: (adres wierzchołka stosu = SS: SP) - Adres wierzchołka stosu = SS: ESP - Stos „rośnie w dół” - Przy operacjach odkładania na stos (PUSH) modyfikowany jest wskaźnik stosu a następnie zapisywana odpowiednia wartość - Zdejmowanie ze stosu (POP) w kolejności: -pobranie wartości z pamięci wskazywanej SS: ESP do odpowiedniego rejestru a następnie -zwiększenie wartości wskaźnika ESP
Stos i podprogramy: (adres wierzchołka stosu = SS: SP) 500: (Start). . . 510: call procedura 1 516: . . . koniec: . . (Procedura 1) 1000: call procedura 2 1006: ret (Procedura 2) 2000: nop ret
Ramki stosu -Wierzchołek stosu (SS: ESP) przesuwany jest w dół w celu zarezerwowania jego fragmentu do innych celów -Przed przesunięciem zawartość ESP zapamiętywana jest w specjalnym rejestrze EBP. Powstaje w ten sposób tzw. „ramka stosu” (ang. Stack Frame) czyli obszar pamięci od SS: EBP do SS: ESP -Powrót do sytuacji początkowej następuje poprzez przywrócenie początkowej wartości rejestru ESP (skopiowanie jej z rejestru EBP) Zastosowania: -zmienne lokalne procedur i funkcji -przekazywanie parametrów do procedur i funkcji
Ramki stosu: -przykład Function f 3(d 1, d 2: integer) : integer; stdcall; var d 3: integer; begin d 1: =1; result: =d 1+d 2+d 3; end; . . . var a, b, c: integer; . . b: =1; c: =2; a: =f 3(b, c); . . .
Ramki stosu: przykład cd. : Function f 3(d 1, d 2: integer) : integer; stdcall; var d 3: integer; begin d 1: =10; result: =d 1+d 2+d 3; end; . . . var a, b, c: integer; b: =1; c: =2; a: =f 3(b, c);
Instrukcje operacji na ciągach: (MOVS, LODS, STOS) LODSB/W/D = MOV AL, DS: (ESI) ADD/SUB ESI, 1/2/4 STOSB/W/D = MOV ES: (EDI), AL. ADD/SUB EDI, 1/2/4 MOVSB/W/D = MOV ES: (EDI), DS: (ESI) ADD/SUB ESI, 1/2/4 ADD/SUB EDI, 1/2/4 CLD, STD - zmiana kierunku w górę/ w dół
Instrukcje dotyczące pętli: (LOOP) Sekwencja instrukcji w Pascal-u: var i: integer; for i: =10 downto 0 do Begin End; var i: integer; for i: =0 to 10 do Begin End; Przykład zapisu w assemblerze: mov ecx, 10 petla: loop petla
Instrukcje dotyczące pętli: (REP) var tablica_źródłowa, tablica_przeznaczenia : array(1. . 1000) of integer; Przykład: MOV ECX, 1000 LEA ESI, tablica_źródłowa LEA EDI, tablica_przeznaczenia CLD REP MOVSW
Instrukcje dotyczące pętli: (REP) var tablica_przeznaczenia : array(1. . 1000) of integer; Przykład: MOV ECX, 1000 MOV EAX, 0 LEA EDI, tablica_przeznaczenia CLD REP STOSW
- Slides: 26