2013-04-06 10 views
5

Witam Czytam przewodnik na temat x86 autorstwa University of Virginia, który stwierdza, że ​​przesuwanie i otwieranie stosu usuwa lub dodaje 4-bajtowy element danych do stosu.x86 Czy push/pop może mieć mniej niż 4 bajty?

Dlaczego ta wartość to 4 bajty? Czy można to zmienić, czy można zapisać pamięć na stosie, naciskając na mniejsze elementy danych?

Przewodnik można znaleźć tutaj, jeśli ktoś chce, żeby go zobaczyć: http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

+1

To stwierdzenie stosuje się tylko w trybie 32-bitowym, można również naciskać/popować 2-bajtowe elementy. – harold

Odpowiedz

7

Krótka odpowiedź: Tak, 16 lub 32 bitów. I, dla x86-64, 64 bity.

Podstawowymi przyczynami stosu są powroty z zagnieżdżonych wywołań funkcji i zapisywanie/przywracanie wartości rejestrów. Jest również zwykle używany do przekazywania parametrów i wyników funkcji powrotu. Z wyjątkiem najmniejszych parametrów, elementy te mają zazwyczaj taki sam rozmiar w zależności od projektu procesora, a mianowicie wielkość rejestru wskaźnika instrukcji. Dla 8088/8086 ma 16 bitów. Dla 80386 i następców jest to 32-bitowy. Dlatego nie ma sensu posiadanie instrukcji stosu, które działają w innych rozmiarach.

Uwzględniono także rozmiar danych na magistrali pamięci. Pobranie lub zapisanie słowa zajmuje tyle samo czasu, co bajt. (Z wyjątkiem 8088, który ma rejestry 16-bitowe, ale 8-bitową magistralę danych). RównieŜ w grę wchodzi wyrównanie. Stos powinien być wyrównany do granic słów, aby każda wartość mogła zostać pobrana jako jedna operacja pamięci. Kompromis jest zazwyczaj podejmowany w celu zaoszczędzenia czasu na oszczędzanie pamięci. Aby przekazać jeden bajt jako parametr, zwykle używane jest jedno słowo. (Lub, w zależności od optymalizacji dostępnej dla kompilatora, użyjemy jednego rejestru o wielkości słowa, unikając całego stosu.)

+9

W x86-64 nie można przesyłać 32-bitowych rejestrów lub wartości przechowywanych w pamięci, tylko 16- lub 64-bitowe rejestry i wartości przechowywane w pamięci. 'push ax',' push rax', 'push word [rax]' i 'push qword [rax]' są poprawnymi instrukcjami x86-64, ale 'push eax' i' push dword [rax] 'nie są poprawne w x86-64. – nrz

+0

Notatka historyczna, (bardzo rzadko używana) 80188 (16-bitowe słowo, 8-bitowa magistrala danych) i (nieco popularna przez jakiś czas) 386SX (32-bitowe słowo, 16-bitowa magistrala danych) były w tej samej łodzi co 8088 dotyczące niedopasowania wielkości magistrali danych. –

+0

Dla "Stos powinien być wyrównany na granicach wyrazów, aby każda wartość mogła zostać odczytana jako jedna operacja pamięci.", Czy dotyczy to zmiennych lokalnych w funkcji? – Thomson

Powiązane problemy