Dlaczego instrukcje x86-64 na 32-bitowym rejestrze zerują górną część pełnego rejestru 64-bitowego?
wx86-64 Tour of Intel Manuals, Czytam
Być może najbardziej zaskakujący jest fakt, że taka instrukcja jakMOV EAX, EBX
automatycznie zeruje górne 32 bityRAX
zarejestrować.
Dokumentacja Intela (3.4.1.1 Rejestry ogólnego przeznaczenia w trybie 64-bitowym w ręcznej architekturze podstawowej) cytowana w tym samym źródle mówi nam:
64-bitowe operandy generują 64-bitowy wynik w docelowym rejestrze ogólnego przeznaczenia.32-bitowe operandy generują wynik 32-bitowy, zerowy rozszerzony do 64-bitowego wyniku w docelowym rejestrze ogólnego przeznaczenia.Operandy 8-bitowe i 16-bitowe generują wynik 8-bitowy lub 16-bitowy. Górne 56 bitów lub 48 bitów (odpowiednio) docelowego rejestru ogólnego przeznaczenia nie są modyfikowane przez operację. Jeśli wynik operacji 8-bitowej lub 16-bitowej jest przeznaczony do obliczania adresu 64-bitowego, należy jawnie podpisać i rozszerzyć rejestr na pełne 64-bitowe.W zestawie x86-32 i x86-64 instrukcje 16-bitowe, takie jak
mov ax, bx
nie pokazuj tego rodzaju „dziwnego” zachowania, ponieważ górne słowo eax jest zerowane.
Zatem: jaki jest powód wprowadzenia tego zachowania? Na pierwszy rzut oka wydaje się to nielogiczne (ale powodem może być to, że jestem przyzwyczajony do dziwactw dotyczących montażu x86-32).