Rozumiem ze zadeklarowane zmienne zostaja utworzone w pamieci ram, a sam program 'pamieta' ich ardesy.
Rejestry moga przechowywac pewna wartosc - ktora moze byc rownie dobrze adresem, jak i wartoscia przechowywanym adresem (co dla procesora nie ma znaczenia).
jedyna operacja, jaka moge wykonac na pamieci ram, to zapisanie tam okreslonych bajtow - tzn, nie moge w pamieci ram wykonac algorytmu sumy logicznej, czy czegokolwiek innego - jedyne co moge zrobic, to zapisac okreslone juz dane (np. 00010111). do wykonywania operacji logicznych/arytmetycznych musze skopiowac pewne dane do rejestru procesora, i operowac na rejestrach.
w ksiazce przeczytalem, ze odnoszac sie zmiennej w pamieci ram, napisanie jej nazwy w nawiasach kwadratowych powoduje odczytanie jej wartosci, a bez nawiasow - adresu. w innej ksiazce mam nastepujacy przyklad, programu dodajcego dwie liczby:
.data
VARA DW 17
VARB DW 35
.stack 100h
.code
mov ax, @data
mov ds, ax
mov ax, VARA
add ax, VARB
w .code pierwsze dwie linijki sa dla mnie malo zrozumiale(wiem jaki jest cel ich istnienia, ale na przykladach pod linuksa nie musze tego umieszczac, dlaczego?), a pozostale powinno kolejno umieszczac adres VARA w rejestrze ax, a nastepnie zwiekszyc wartosc ax o wartosc adresu VARB. dlaczego nie uzyto tutaj nawiasow klamrowych?
chcialem napisac program dodajacy dwie liczby i wyswietlajacy wynik pod linuksa (idac za przykladem powyzej, bez nawiasow klamrowych).
format ELF executable ; typ pliku
entry _start ; punkt startu programu
segment readable executable ; początek sekcji kodu
_start:
mov eax, number1
add eax, number2
mov ebx, 1
mov ecx, eax
mov edx, 1
mov eax, 4
int 80h
segment readable writeable ; początek sekcji danych.
number1 dw 10
number2 dw 15
exc ma zawaierac adres danych, ktore chce wyswietlic. a co jesli dane te sa w rejestrze? czy mozna w ogole mowic o adresie rejestru? jesli tak, to jak go przekazac do innego rejestru? czy musze najpierw zawartosc adresu przekazac do zmiennej?
i co z wyswietleniem wartosci? chcac wyswietlic wartosc 17, czy musze najpierw napisac program konwertujacy 17 do 17 w postaci ASCII?
oraz dodatkowe pytanie odnosnie zmiennych - czy tworzac zmienna moge dokladnie okreslic jej polozenie w pamieci ram?
jesli tak, to czy pozniej moge zapisywac wartosci do konkretnej komorki, nie odnoszac sie do nazw zmiennych?
jesli tak, to czy moge zmusic procesor do dzialania "nad" systemem operacyjnym? nie wiem do konca jak to dziala, ale zakladam ze program uruchamiany kontrolowany jest przez system operacyjny, ktory moze blokowac dostep do pewnych elementow pamieci. Czy moge sprawic, aby procesor zaczal wykonywac operacje bezposrednio na pamieci ram, bez zadnej komunikacji z systemem operacyjnym?