Wie funktionieren arithmetische Berechnungen in Instruktionen?
-
Wenn ich einen Befehl sehe wie:
LEA EAX, [EBX+4*ECX+100]
dann frage ich mich, wie dieser arithmetische Ausdruck in den Klammern eigentlich im Befehlswort kodiert wird. Wo findet man solche Informationen? Und welche Arten von Berechnungen sind an dieser Stelle möglich?
-
Die Kodierung findet im SIB-Byte(ScaleIndexBase) des opcodes satt. Dies dient zur Adressierung, kann aber bei LEA aber auch zum multiplizieren, addieren und subtrahieren verwendet werde.
Base address: ein Register (enthält z.B. eine Adresse) - [eax]
Index: ein weiteres Register das zu ersteren addiert wird - [eax+ecx]
Scale: Konstanter Faktor mit dem das Indexregister multipliziert wird: 1,2,4 oder 8 - [eax+ecx4]
Displacment: einfache ein Offset - [eax+ecx4+12345]Bsp.: mul. eax mit 10 lea [eax+eax*4] ; eax*5 lea eax,[eax*2] ;(oder shl eax,1)
Weitere Information findest du hier (Intel
64 and IA-32 Architectures Software Developer's Manual
Volume 2A und 2B)
-
Danke schonmal!
Wenn diese Informationen nur in einem Byte untergebracht sind, dann sind die Werte für die verschiedenen Bestandteile aber sehr begrenzt, oder nicht?
-
Jep, alle 256 Kombinationen sind im Handbuch zum x86-Prozessor (google: Intel Manuals -> Volume 2A, Kapitel 2.1.3) oder z.B. hier aufgelistet: http://www.sandpile.org/ia32/opc_sib.htm
Man braucht in der Regel nicht so viele Kombinationen, weil LEA-Instruktion (bzw. dieser Operandentyp) ja nicht für allgemeine Arithmetik da ist, sondern zur Adressberechnung.