Czytam "Systemy komputerowe: Perspektywa programisty", rozdział 3 wyjaśnia instrukcję mov
, a wyjaśnienie w książce wprowadza mnie w zakłopotanie.instrukcje i rejestry mov - zamieszanie!
dać funkcję (strona 142 wydanie 1'S) Kod
int exchange(int *xp, int y)
{
int x = *xp;
*xp = y;
return x;
}
Zgromadzenie ciało funkcji za
movl 8(%ebp), %eax //Get xp
movl 12(%ebp), %edx //Get y
movl (%eax), %ecx //Get x at *xp
movl %edx, (%eax) //Store y at *xp
movl %ecx, %eax //Set x as return value
Co mnie myli, jest to, co ma być przechowywany, a gdzie
Oto jak to rozumiem:
movl 8(%ebp), %eax //Get xp
Przenoszenie procesora +8 bajtów górę stosu (od wskaźnika ramki %ebp
), przyjmuje wartość przechowywaną w tym miejscu i zapisuje tę wartość w rejestrze %eax
(do naciskiem - przechowuje wartość, a nie adres)
mam rację? Dzięki!
BARDZO prawdziwy ...... – ruslik
Innymi słowy, ponieważ '% ebp' przechowuje wskaźnik, używamy nawiasów wokół jego nazwy, aby określić, że otrzymujemy zapisaną wartość + 8 bajtów od'% ebp'. W tym przypadku '8 (% ebp)' zawiera wskaźnik '* xp'. Później, w linii 'movl (% eax),% ecx', wyłuskujemy' xp' w taki sam sposób jak w pierwszym wierszu kodu montażowego – newprint
Teraz wszystko jest wyprostowane. Nawias był źródłem nawiasów! Dzięki ! – newprint