Zgromadzenie - rejestry
Operacje procesora obejmują głównie przetwarzanie danych. Te dane mogą być przechowywane w pamięci i stamtąd dostępne. Jednak odczytywanie i przechowywanie danych w pamięci spowalnia procesor, ponieważ wiąże się ze skomplikowanymi procesami wysyłania żądania danych przez magistralę sterującą do jednostki pamięci i pobierania danych tym samym kanałem.
Aby przyspieszyć działanie procesora, procesor zawiera kilka lokalizacji pamięci wewnętrznej, tzw registers.
Rejestry przechowują elementy danych do przetwarzania bez konieczności dostępu do pamięci. Ograniczona liczba rejestrów jest wbudowana w chip procesora.
Rejestry procesorów
W architekturze IA-32 jest dziesięć 32-bitowych i sześć 16-bitowych rejestrów procesora. Rejestry są podzielone na trzy kategorie -
- Rejestry ogólne,
- Rejestry kontrolne i
- Rejestry segmentowe.
Rejestry ogólne są dalej podzielone na następujące grupy -
- Rejestry danych,
- Rejestry wskaźnikowe i
- Rejestry indeksowe.
Rejestry danych
Cztery 32-bitowe rejestry danych są używane do operacji arytmetycznych, logicznych i innych. Te 32-bitowe rejestry mogą być używane na trzy sposoby -
Jako kompletne 32-bitowe rejestry danych: EAX, EBX, ECX, EDX.
Dolne połówki rejestrów 32-bitowych można wykorzystać jako cztery rejestry danych 16-bitowych: AX, BX, CX i DX.
Niższe i wyższe połówki wyżej wymienionych czterech 16-bitowych rejestrów mogą być użyte jako osiem 8-bitowych rejestrów danych: AH, AL, BH, BL, CH, CL, DH i DL.
Niektóre z tych rejestrów danych mają szczególne zastosowanie w operacjach arytmetycznych.
AX is the primary accumulator; jest używany we wprowadzaniu / wyprowadzaniu i większości instrukcji arytmetycznych. Na przykład, w operacji mnożenia, jeden operand jest przechowywany w rejestrze EAX lub AX lub AL zgodnie z rozmiarem argumentu.
BX is known as the base register, ponieważ może być używany w adresowaniu indeksowanym.
CX is known as the count register, podobnie jak w ECX, rejestry CX przechowują liczbę pętli w operacjach iteracyjnych.
DX is known as the data register. Jest również używany w operacjach wejścia / wyjścia. Jest również używany z rejestrem AX wraz z DX do operacji mnożenia i dzielenia obejmujących duże wartości.
Rejestry wskaźników
Rejestry wskaźnikowe to 32-bitowe rejestry EIP, ESP i EBP oraz odpowiadające im 16-bitowe prawe części IP, SP i BP. Istnieją trzy kategorie rejestrów wskaźników -
Instruction Pointer (IP)- 16-bitowy rejestr IP przechowuje przesunięty adres następnej instrukcji do wykonania. IP w połączeniu z rejestrem CS (jako CS: IP) podaje pełny adres aktualnej instrukcji w segmencie kodu.
Stack Pointer (SP)- 16-bitowy rejestr SP dostarcza wartość przesunięcia w stosie programu. SP w połączeniu z rejestrem SS (SS: SP) odnosi się do aktualnej pozycji danych lub adresu w stosie programu.
Base Pointer (BP)- 16-bitowy rejestr BP pomaga głównie w odwoływaniu się do zmiennych parametrów przekazywanych do podprogramu. Adres w rejestrze SS jest łączony z przesunięciem w BP, aby uzyskać lokalizację parametru. BP można również łączyć z DI i SI jako rejestrem bazowym do specjalnego adresowania.
Rejestry indeksowe
32-bitowe rejestry indeksowe, ESI i EDI oraz ich 16-bitowe prawostronne części. SI i DI są używane do adresowania indeksowanego, a czasami używane jako dodawanie i odejmowanie. Istnieją dwa zestawy wskaźników indeksu -
Source Index (SI) - Jest używany jako indeks źródłowy dla operacji na łańcuchach.
Destination Index (DI) - Jest używany jako indeks docelowy dla operacji na łańcuchach.
Rejestry kontrolne
32-bitowy rejestr wskaźnika instrukcji i 32-bitowy rejestr znaczników są traktowane jako rejestry sterujące.
Wiele instrukcji obejmuje porównania i obliczenia matematyczne oraz zmianę stanu flag, a niektóre inne instrukcje warunkowe testują wartość tych flag stanu, aby przenieść przepływ sterowania w inne miejsce.
Typowe bity flag to:
Overflow Flag (OF) - Wskazuje przepełnienie wyższego rzędu bitu (skrajny lewy bit) danych po operacji arytmetycznej ze znakiem.
Direction Flag (DF)- Określa lewy lub prawy kierunek przesuwania lub porównywania danych ciągów. Gdy wartość DF wynosi 0, operacja na łańcuchu przyjmuje kierunek od lewej do prawej, a gdy wartość jest ustawiona na 1, operacja na łańcuchu przebiega w kierunku od prawej do lewej.
Interrupt Flag (IF)- Określa, czy zewnętrzne przerwania, takie jak wprowadzanie z klawiatury, itp. Mają być ignorowane lub przetwarzane. Wyłącza przerwanie zewnętrzne, gdy wartość wynosi 0 i włącza przerwania, gdy jest ustawiona na 1.
Trap Flag (TF)- Umożliwia ustawienie pracy procesora w trybie jednostopniowym. Program DEBUG, którego użyliśmy, ustawia flagę pułapki, abyśmy mogli przejść przez wykonywanie jednej instrukcji na raz.
Sign Flag (SF)- Pokazuje znak wyniku operacji arytmetycznej. Ta flaga jest ustawiana zgodnie ze znakiem elementu danych następującego po operacji arytmetycznej. Znak jest wskazywany przez najwyższy rząd lewego bitu. Wynik dodatni powoduje skasowanie wartości SF na 0, a wynik ujemny na 1.
Zero Flag (ZF)- Wskazuje wynik operacji arytmetycznej lub porównania. Wynik niezerowy czyści flagę zero na 0, a wynik zerowy ustawia ją na 1.
Auxiliary Carry Flag (AF)- Zawiera przeniesienie z bitu 3 do bitu 4 po operacji arytmetycznej; używany do specjalistycznej arytmetyki. AF jest ustawiane, gdy 1-bajtowa operacja arytmetyczna powoduje przeniesienie z bitu 3 do bitu 4.
Parity Flag (PF)- Wskazuje całkowitą liczbę 1-bitów w wyniku otrzymanym z operacji arytmetycznej. Parzysta liczba 1-bitów zeruje flagę parzystości do 0, a nieparzysta liczba 1-bitów ustawia flagę parzystości na 1.
Carry Flag (CF)- Zawiera przeniesienie 0 lub 1 z bitu najwyższego rzędu (skrajnie lewy) po operacji arytmetycznej. Przechowuje również zawartość ostatniego bitu operacji przesunięcia lub obrotu .
Poniższa tabela przedstawia położenie bitów flag w 16-bitowym rejestrze flag:
Flaga: | O | re | ja | T | S | Z | ZA | P. | do | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Bit nie: | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Rejestry segmentowe
Segmenty to określone obszary zdefiniowane w programie, które zawierają dane, kod i stos. Istnieją trzy główne segmenty -
Code Segment- Zawiera wszystkie instrukcje do wykonania. 16-bitowy rejestr segmentu kodu lub rejestr CS przechowuje początkowy adres segmentu kodu.
Data Segment- Zawiera dane, stałe i obszary robocze. 16-bitowy rejestr segmentu danych lub rejestr DS przechowuje początkowy adres segmentu danych.
Stack Segment- Zawiera dane i adresy zwrotne procedur lub podprogramów. Jest implementowany jako struktura danych „stosu”. Rejestr segmentu stosu lub rejestr SS przechowuje adres początkowy stosu.
Oprócz rejestrów DS, CS i SS istnieją inne dodatkowe rejestry segmentowe - ES (dodatkowy segment), FS i GS, które zapewniają dodatkowe segmenty do przechowywania danych.
W programowaniu w asemblerze program potrzebuje dostępu do lokalizacji pamięci. Wszystkie lokalizacje pamięci w segmencie odnoszą się do adresu początkowego segmentu. Segment zaczyna się w adresie, który jest równo podzielny przez 16 lub szesnastkowy 10. Tak więc najbardziej prawą cyfrą szesnastkową we wszystkich takich adresach pamięci jest 0, które zwykle nie jest przechowywane w rejestrach segmentów.
Rejestry segmentów przechowują początkowe adresy segmentu. Aby uzyskać dokładną lokalizację danych lub instrukcji w segmencie, wymagana jest wartość przesunięcia (lub przesunięcie). Aby odwołać się do dowolnej lokalizacji pamięci w segmencie, procesor łączy adres segmentu w rejestrze segmentu z wartością przesunięcia lokalizacji.
Przykład
Spójrz na następujący prosty program, aby zrozumieć użycie rejestrów w programowaniu w asemblerze. Ten program wyświetla 9 gwiazdek na ekranie wraz z prostą wiadomością -
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,9 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg ;length of message
s2 times 9 db '*'
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Displaying 9 stars
*********