Assembler x86(-64) Tutorial cz. 2 - Rejestry Procesora


Spis treści



Wstęp

Jeśli nie czytałeś poprzedniego postu Assembler x86 Tutorial cz.1 to polecam się z nim zapoznać.

W tym poście skupimy się na procesorach x86-64, czyli 64-bitowej wersji procesorów z rodziny x86.

Rejestry Ogólnego Przeznaczenia

Rzecz która jest bardzo istotna dla początkujących, którzy pisali wcześniej w językach wysokiego poziomu to fakt iż rejestry procesora nie mają typów. One po prostu przyjmują nadaną im wartość.

Opis każdego z rejestrów zaczniemy od rejestru 64-bitowego, kończąc na 16/8-bitowym.

RAX - rejestr akumulator

Rejestr RAX najczęściej jest wykorzystywany do działań artymetycznych na liczbach całkowitych.

Często jest domyślnym rejestrem w rozkazach np. div (dzielenie).

Służy również do umieszczania numerów funkcji systemu operacyjnego, tak zwanego ABI (Applicationn Binary Interface).

mov rbx, 123
mov rax, 60
syscall

W poprzednim artykule kod był pod 32-bity, w tym wypadku korzystamy z architektury x86-64. Zmienił się numer funkcji systemowej, oraz instrukcja wywołania systemowego z int 0x80 na syscall, co jest charakterystyczne dla architektury 64-bitowej. W dokładne różnice między tymi dwoma instrukcjami póki co wchodzić nie będę.

rax

Rejestr RAX dzieli się na:

  • EAX - dolne 32 bity
  • AX - dolne 16 bitów
  • AH - górne 8 bitów (niedostępne w trybie 64-bitowym)
  • AL - dolne 8 bitów

RBX/EBX - rejestr bazowy

Rejestr RBX jest najczęściej wykorzystywany do przechowywaniu adresu pamięci (adresowanie pośrednie) - to co z C/C++ znamy jako wsakźnik (pointer).

Wykorzystywany również jako indeks przy dostępie do tablic.

mov rbx, 3
mov rax, [rbx] ; pobierz wartość spod adresu, który wskazuje rejestr rbx

rbx

Rejestr RBX dzieli się na:

  • EBX - dolne 32 bity
  • BX - dolne 16 bitów
  • BH - górne 8 bitów (niedostępne w trybie 64-bitowym)
  • BL - dolne 8 bitów

RCX/ECX - rejestr licznik

Rejestr RCX jest wykorzystywany jako licznik iteracji w pętlach.

mov rcx, 0
loop:
    ; do something 10 times
    inc rcx ; rcx++
cmp rcx, 9
jle loop

rcx

Rejestr RCX dzieli się na:

  • ECX - dolne 32 bity
  • CX - dolne 16 bitów
  • CH - górne 8 bitów (niedostępne w trybie 64-bitowym)
  • CL - dolne 8 bitów

RDX/EDX - rejestr danych

Rejestr RDX jest wykorzystywany do przechowaywania np. adresów, danych do przerwań.

push 0x41
mov rax, 1
mov rdi, 1
mov rsi, [rsp]
mov rdx, 1 ; number of bytes to print
syscall

rdx

Rejestr RDX dzieli się na:

  • EDX - dolne 32 bity
  • DX - dolne 16 bitów
  • DH - górne 8 bitów
  • DL - dolne 8 bitów

R8-R15 - dodatkowe rejestry ogólnego przeznaczenia (64-bit)

Rejestry R8-R15 są rejestrami ogólnego przeznaczenie, dostępnymi tylko w trybie 64-bitowym.

r8-r15

Rejestry R8-R15 dziela się na:

  • R8D-R15D - dolne 32 bity
  • R8W-R15W - dolne 16 bitów
  • R8L-R15L - dolne 8 bitów

RSI/ESI - rejestr indeks źródłowy

Rejestr RSI jest wykorzystywany jako wskaźnik do prztewarzania ciągów znaków.

push 'test'
mov rax, 1
mov rdi, 1
mov rsi, rsp ; <--
mov rdx, 4
syscall

rsi

Rejestr RSI dzieli się na:

  • ESI - dolne 32 bity
  • SI - dolne 16 bitów
  • SIL - dolne 8 bitów (dostępny tylko w trybie 64-bitowym)

Przy trybie 32-bitowym ESI nie dzieli się na 8-bitowe rejestry, jedynie w trybie 64-bitowy jest dostęp do rejestru SIL.

RDI/EDI - rejestr indeks docelowy

Rejestr RDI jest wykorzystywany jako wskaźnik docelowy do przetwarzania ciągów znaków.

mov rdi, dest
cld
mov rcx, 5
rep movsb

rdi

Rejestr RDI dzieli się na:

  • EDI - dolne 32 bity
  • DI - dolne 16 bitów
  • DIL - dolne 8 bitów (dostępny tylko w trybie 64-bitowym)

Przy trybie 32-bitowym EDI nie dzieli się na 8-bitowe, jedynie w trybie 64-bitowy jest dostęp do rejestru DIL.

RBP/EBP - rejestr wskaźnik bazowy

Rejestr RBP jest wykorzystywany do przechowywania spodu stosu. Dzięki temu można kontrolować położenie zmiennych lokalnych w pamięci.

rbp

Rejestr RBP dzieli się na:

  • EBP - dolne 32 bity
  • BP - dolne 16 bitów
  • BPL - dolne 8 bitów (dostępny tylko w trybie 64-bitowym)

RSP/ESP - rejestr wskaźnik stosu

Rejestr RSP jest wykorzystywany do przechowywania adresu wierzchołka stosu.

rsp

Rejestr RSP dzieli się na:

  • ESP - dolne 32 bity
  • SP - dolne 16 bitów
  • SPL - dolne 8 bitów (dostępny tylko w trybie 64-bitowym)

RIP/EIP - rejestr wskaźnik instrukcji

Rejestr RIP przechowuje adres następnej instrukcji, która zostanie wykonana.

rip

Rejestr RIP dzieli się na:

  • EIP - dolne 32 bity
  • IP - dolne 16 bitów

Rejestry Specjalnego Przeznaczenia

Książka - Assembler x86 - Programowanie i Podstawy Systemów Operacyjnych

Darmowy fragment książki - rejestry segmentowe i rejestr flag.


Podobne artykuły