jest zabroniona. W ogóle najlepiej unikać jakichkolwiek operacji na rejestrach segmentowych.
3. Nie można do rejestru segmentowego bezpośrednio wpisać jakieś wartości. Czyli nie można
mov ds, 0
Ale można:
• mov ebx, l/mov rdi, 1
Do rejestru EBX (32-bitowy) lub RDI (64-bitowy) wstaw 1. Dlaczego akurat 1 ? Zaraz się przekonamy.
• mov ecx,tekst/mov rsi, tekst
Do rejestru ECX (32-bitowy) lub RSI (64-bitowy) wstaw offset (adres) etykiety tekst. Można obliczać adresy nie tylko danych, ale etykiet znajdujących się w kodzie programu.
•mov edx, dlugosc / mov edx, [dlugosc]/mov rdx, dlugosc / mov rdx, [dlugosc]
Do rejestru EDX (32-bitowy) lub RDX (64-bitowy) wstaw długość naszego tekstu. W pierwszym przypadku jest to stała, w drugim wartość pobieramy ze zmiennej.
•int 80h/syscall
Int = interrupt = przerwanie. Nie jest to jednak znane np. z kart dźwiękowych przerwanie typu IRQ. Wywołując przerwanie 80h (128 dziesiętnie) lub instrukcję syscall (w trybie 64-bitowym) uruchamiamy jedną z funkcji Linuksa. Którą? O tym zazwyczaj mówi rejestr akumulatora.
W tym przypadku EAX = 4 (lub RAX = 1 w trybie 64-bitowym) i jest to funkcja zapisu do pliku -sys_write. Funkcja ta przyjmuje 3 argumenty:
♦ W rejestrze EBX (lub RDI, w trybie 64-bitowym) podajemy numer (deskryptor) pliku, do którego chcemy pisać. U nas EBX (lub RDI) = 1 i jest to standardowe wyjście (zazwyczaj ekran).
♦ W rejestrze ECX (lub RSI, w trybie 64-bitowym) podajemy adres danych, które chcemy zapisać do pliku.
♦ W rejestrze EDX (lub RDX, w trybie 64-bitowym) podajemy, ile bajtów chcemy zapisać.
Funkcje systemowe 32-bitowego Linuksa przyjmują co najwyżej 6 argumentów, kolejno w rejestrach: EBX, ECX, EDX, ESI, EDI, EBP. W EAX oczy wiście jest numer funkcji, tak jak tutaj 4.
Funkcje systemowe 64-bitowego Linuksa przyjmują także co najwyżej 6 argumentów, kolejno w rejestrach: RDI, RSI, RDX, RIO, R8, R9. W RAX oczywiście jest numer funkcji, tak jak tutaj 1. Rejestry RCX i R11 są zamazywane.
• raov eax, 1 / mov rax, 60
18