C
dieses Beispiel da oben hab ich mal schnell getippt und übersetzt
dabei darf man die zahl natürlich nicht komplett nehmen:
1011100000000001000000000000000000000000
um es besser zu erkennen mache ich mal da leerzeichen rein:
10111000 00000001 00000000 00000000 00000000
(um die übersicht zu erhöhen werde ich mal in HEX posten)
lade eine 1 in EAX:
mov eax,1
b8 01000000
dabei ist B8 (also 10111000) die Anweisung für den Prozessor die nächstfolgende Zahl in EAX zu laden. wie schon in meinem vorherigen Posting kurz angeschnitten, erwartet die CPU Befehle, die nach einem bestimmten Muster aufgebaut sind.Operand sagt was geschehen soll und danach folgt entweder eine Zahl die geladen/verrechnet werden soll oder die Adresse woher oder wohin geschrieben werden soll.
Also: b8(10111000) ist die Anweisung die nächstfolgende Zahl in EAX Register zu laden.
Jetzt warum da noch 00000001 steht und dahinter noch 3 Bytes mit nullen:
Es könnte etwas verwirrend sein, aber das ist der Little-Endian prinzip:
Die CPU die nach diesem Prinzip arbeitet, speichert ihre Variablen(also Speicheradressen, Zahlen usw) "verkehrt". Das heißt dass die Bytes von hinten nach vorne(oder von rechts nach links, wie mans sieht) geschrieben wernden - beispiel: die Zahl (in hex): 20d2 wird in den Speicher d2 20 geschrieben. http://de.wikipedia.org/wiki/Endian
Deshalb stehen da auch
00000001 00000000 00000000 00000000
und nicht
00000000 00000000 00000000 00000001
Nicht alle CPUs machens so, z.B die von MAC (G) speichert nach Big Endian.
Warum das so ist, kann ich nicht sagen...
Das heißt aber für uns speziell wenn wir die Werte aus dem Speicher von unserem Pentium/Amd nehmen, müssen wir die noch umstellen, bevor wir sie nach dezimal umrechnen können.
Das selbe mit der zweiten Zeile:
(00000)101 11100110 00000011 00000000 00000000
die Zeile in Hex heißt:
05 e6 03 00 00
dabei ist die 05(00000101) die Anweisung ADD EAX,x
und weiterhin folg die Zahl:
11100110 00000011 00000000 00000000
wenn man diese umrechnen will ohne sie vorher umzustellen dann
gibt der taschenrechner natürlich 3858956288 aus.Deshalb umstellen:
00000000 00000000 00000011 11100110
jetzt umrechnen: 998
PS: woher ich weißt welcher opcode was ist:
ich hab "assembler ge-packt" von Joachim rohde (schon ca. seit 3-4 Jahren) und natürlich hab ich auch OllyDbg
wo man einfach die Anweisungen reinschreibt und dieser die direkt übersetzt
Zu den Processorbefehlen: nicht alle befehle sind nur 8-bit groß, es gibt relativ viele die mehr belegen.Aber das ist eine ganz andere Geschichte