Ihre zweite Wahl wird nur einen Fehler erzeugen, x86 hat diesen Befehl nicht. X86 ist ein bisschen einzigartig in Bezug auf das Laden von Bytes in bestimmte Register. Ja, bei den meisten Befehlssatzarchitekturen ist der Operand null oder vorzeichenerweitert, aber x86 erlaubt es Ihnen, nur das untere Byte oder die unteren 16 Bits einiger von ihnen zu schreiben.
Es gibt sicherlich andere Möglichkeiten, wie das Register Clearing- und es dann erhöht wird, aber hier sind drei zunächst vernünftig aussehende Entscheidungen, die Sie haben:
0: b8 01 00 00 00 movl $0x1,%eax
5: 31 c0 xorl %eax,%eax
7: b0 01 movb $0x1,%al
9: b0 01 movb $0x1,%al
b: 0f b6 c0 movzbl %al,%eax
Die erste ist 5 Bytes, die zweite 4, die dritte 5. Also ist die Sekunde die beste Wahl, wenn man für den Raum optimiert, sonst nehme ich an, dass die erste, die am schnellsten läuft, die erste ist. X86 ist in diesen Tagen zutiefst in Pipelines verwickelt, so dass die beiden Anweisungen ineinandergreifen und die Maschine abhängig von den Details der Pipeline-Hardware einige Wartezustände benötigt.
Natürlich sind diese x86-ops werden in CPU micro-ops, in CPU-spezifischen Weise übersetzt und so wer weiß, was passieren wird.
Was hat eine Version eines Betriebssystems mit den Namenskonventionen von Typen zu tun? –
Es war eine Redewendung. Die Absicht war anzugeben, dass, wenn sie einmal veröffentlicht wurde, die Befehlssatzspezifikation nicht destruktiv geändert wurde. –
Deshalb bevorzuge ich die Syntax von Intel zur GAS-Syntax. Intel: mov dword eax, ecx GAS: movl eax, ecx Die "l" Größe Operand verwirrt Menschen. Mehr Leute bekommen dieses "dword" bedeutet 32-Bit. – Jason