In x86, ich verstehe, dass Multi-Byte-Objekte im Speicher Little Endian Stil gespeichert sind.Linux x86 CPU Anweisung Layout Confusion
Wenn es um CPU-Befehle geht, bestimmt der OPCODE den Zweck der Anweisung und die Daten/Speicheradressen können dem Opcode in seinem codierten Format folgen. Nach meinem Verständnis sollte der Opcode-Teil des Befehls das höchstwertige Byte sein und somit an der höchsten Adresse irgendeiner gegebenen Befehlscodierungsdarstellung erscheinen.
Kann jemand das Speicherlayout auf diesem x86 linux gdb Beispiel erklären? Ich könnte mir vorstellen, dass der Opcode 0xb8 wegen des höchstwertigen Bytes an einer höheren Adresse erscheinen würde.
(gdb) disassemble _start
Dump of assembler code for function _start:
0x08048080 <+0>: mov eax,0x11223344
(gdb) x/1xb _start+0
0x8048080 <_start>: 0xb8
(gdb) x/1xb _start+1
0x8048081 <_start+1>: 0x44
(gdb) x/1xb _start+2
0x8048082 <_start+2>: 0x33
(gdb) x/1xb _start+3
0x8048083 <_start+3>: 0x22
(gdb) x/1xb _start+4
0x8048084 <_start+4>: 0x11
Es scheint, die Anweisung MOV EAX, 0x11223344 ist Kodierung als 0x11 0x22 0x33 0x44 0xB8.
Fragen.
1.) Wie weiß die CPU, wie viele Bytes der Befehl aufnehmen wird, wenn das erste Byte, das er sieht, kein Opcode ist?
2.) Ich frage mich, ob vielleicht x86-CPU-Anweisungen nicht einmal Endian-Ness haben und eine Art von String in Betracht ziehen? (wahrscheinlich weit weg)
# 2 ist korrekt.Anweisungen haben keine Endianität, obwohl in ihnen eingebettete Konstanten dies tun. Wie Sie in Ihrem gdb-Dump sehen können, ist der Opcode ** ** das erste Byte (aber ihm können Präfix-Bytes vorangestellt werden). Siehe auch _Intel® 64 und IA-32 Architectures Software Developer's Manual Band 2: Befehlsreferenz, AZ, KAPITEL 2 INSTRUCTION FORMAT_ – Jester
Ich kann Multibyte-Ganzzahlen mit einer CPU-Anweisung verwechseln, die mehr als ein Byte umfasst, wenn es um den Speicher geht Darstellung – htederson
Dank Jester für den Hinweis, dass der Opcode * ist * das erste Byte der codierten Anweisung, die man von mir rutschte. – htederson