In de x86-64 Tour of Intel Handleidingen , heb ik lezen
Wellicht het meest verrassende feit is dat een instructie zoals MOV EAX, EBX
automatisch de bovenste 32 bits van RAX
registreert.
De Intel-documentatie (3.4.1.1 Registers voor algemene doeleinden in 64-bits modus in handmatige basisarchitectuur) die bij dezelfde bron wordt geciteerd, vertelt ons:
- 64-bits operanden genereren een 64-bits resultaat in het doelalgemene register.
- 32-bits operanden genereren een 32-bits resultaat, nul uitgebreid tot een 64-bits resultaat in het doelalgemene register.
- 8-bit en 16-bit operands genereren een 8-bit of 16-bit resultaat. De bovenste 56 bits of 48 bits (respectievelijk) van het bestemmingsalgemene register kunnen niet door de bewerking worden gewijzigd. Als het resultaat van een 8-bits of 16-bits bewerking is bedoeld voor 64-bits adresberekening, moet u het register expliciet ondertekenen tot de volledige 64-bits.
In x86-32 en x86-64 assembly, 16 bit instructies zoals
mov ax, bx
laat dit soort 'vreemd' gedrag niet zien dat het bovenste woord van eax op nul wordt gezet.
Dus: wat is de reden waarom dit gedrag werd geïntroduceerd? Op het eerste gezicht lijkt het onlogisch (maar de reden kan zijn dat ik gewend ben aan de eigenaardigheden van de assemblage van x86-32).