Hinweis: Um die Sign Extension besser zu verstehen, empfehlen wir Ihnen, sich mit dem Zweierkomplement auseinanderzusetzen, falls dies Ihnen noch nicht bereits bekannt ist.
Bei der sog. Sign Extension wird eine Binärzahl auf mehr Stellen erweitert, indem das oberste Bit an alle neuen Bitstellen kopiert wird. So wird bei einer Sign Extension einer 32 Bit Zahl auf 64 Bit das “linkeste” Bit (Bit 31) an die Bits 32-63 kopiert. Dieser Schritt ist für vorzeichenbehaftete Zahlen (siehe Zweierkomplement) wichtig, da diese sonst ihren Wert verändern. Einige Beispiele:
0xFFFFFFFF
(0b11111111111111111111111111111111
) wird zu 0xFFFFFFFFFFFFFFFF
, da das oberste Bit eine 1 ist0x80000000
(0b10000000000000000000000000000000
) wird zu 0xFFFFFFFF80000000
, da das oberste Bit ebenfalls eine 1 ist0x0000000A
(0b00000000000000000000000000001010
) jedoch wird zu 0x000000000000000A
, das das oberste Bit eine 0 istBei allen Befehlen außer mov
müssen Immediates auf 32 Bit verkleinerbar und danach wieder auf 64 Bit sign extended werden können, ohne, dass sie dabei ihren Wert verändern.
So ist z.B. add rax, 0xFFFFFFFF80000000
erlaubt, da x80000000
bei einer Sign Extension auf 64 Bit wieder zu 0xFFFFFFFF80000000
wird.
Bei add rax, 0xFFFFFFFF
ist das jedoch nicht der Fall. Bei einer Sign Extension wird diese Immediate zu 0xFFFFFFFFFFFFFFFF
und verändert dadurch ihren Wert.