2016-07-12 5 views
2

Wenn ich versuche, das folgende Programm zu kompilieren:ungültige Anweisung Suffix für `mov‘ (MOVW% Axt,% ebx)

.globl _start 
.section .text 

_start:  movw  $-23, %ax 
      movl  $-1, %ebx # -1 = $0xffffffff 
      movw  %ax, %ebx 

      movl  $1, %eax 
      movl  $0, %ebx 
      int   $0x80 

ich diese Fehlermeldung:

demo.s: Assembler messages: 
demo.s:7: Error: invalid instruction suffix for `mov' 

Also, die Wurzel des proglem liegt hier:

movw  %ax, %ebx 

Aber die Sache ist, dass ich nicht glaube, was ich tue, ist völlig falsch und das ist das Beispiel in th verwendet Ich lese gerade: Professional Assembly Language by Richard Blum (2005)

+4

'movw% ax,% ebx' macht keinen Sinn. Es ist "verschiebe die ** 16 Bits ** Register AX in das ** 32 Bits ** Register EBX". Wie würdest du das machen? Nullerweiterung ('movzwl% ax,% ebx')? Zeichenerweiterung ('movswl% ax,% ebx')? Sind Sie sicher, dass der Autor nicht beabsichtigte 'movw% ax,% bx'? Ich kann nicht von der Verwendung in der Quelle erzählen. –

+0

'movw% ax,% ebx' - genau so wird es im Buch dargestellt. –

+1

Nach dem Errata-Abschnitt für dieses Buch zu urteilen, wäre ich ein bisschen vorsichtig mit den Quellen darin. Nur stellen Sie sicher, dass Sie für jede erklärte Sache Ihre eigene Quelle ohne Buch schreiben können, die im Debugger genau wie erwartet funktioniert (achten Sie auf alle Register, Speicher und Flag-Änderungen).Und im Grunde gibt es nur ein kanonisches Buch für ASM-Entwickler. Anweisungen Referenzhandbuch. Alles andere ist wie Fahrradhelfer, extrem hilfreich, bis man über ein gewisses Maß hinauskommt, dann ist es Last. Nächste nützliche ASM-Bücher sind entweder detaillierte Architektur der Zielplattform oder Mathe-Theorie Bücher. – Ped7g

Antwort

5

Sie haben nicht geschrieben, was Sie mit diesem Programm machen wollen.

Zuerst setzen Sie -23 in ax, dann -1 in ebx, dann versuchen Sie ax in ebx zu bewegen, die auf x86-Prozessor nicht gültig ist, als ax 16bit ist, und ebx ist 32-Bit-Register. mov kann die Breite der Daten während der Verarbeitung nicht konvertieren.

Damit es funktioniert, gibt es zwei grundlegende Optionen.

  • wenn Sie untere 16b von ebx geändert werden sollen (nach 16b von ax), können Sie mov %ax, %bx tun, oberen 16b der ebx intakt zu halten. (In Ihrem Fall wird das Ergebnis -23 in ebx/bx/bl sein).

  • , wenn Sie den Wert 16b in 32b Wert erweitern möchten, können Sie entweder:

    1. movswl %ax, %ebx # sign-extended conversion (movsx in Intel syntax)
    2. movzwl %ax, %ebx # zero-extended conversion (movzx in Intel syntax)

In 1. die ebx (und bx und bl als auch) enthält -23. In 2. ebx wird 0x0000FFE9 enthalten, so ebx wird 65513, bx und bl wird -23 wenn behandelt als vorzeichenbehaftete Ganzzahl. Oder 65513 für bx und 233 in bl wenn behandelt als vorzeichenlose Ganzzahlen.

Über das Buch ... bist du sicher? Lies das sorgfältig noch einmal, muss ein Tippfehler sein, oder du übersiehst ein winziges Detail.

Verwandte Themen