2012-03-24 8 views
2

bei CentOS 5.5 in vmware-Player auf einem Host Windows 7 Ich schrieb eine Assembler-Code-Datei gpi.S:verwirrte durch x86-Assembler Syntax

.intel_syntax noprefix 
... /* cut off some code */ 
lea eax, string_label 
mov ebx, [DWORD PTR ds:eax] 
push ebx 
mov ebx, [DWORD PTR cs:eax] 
push ebx 
... /* cut off some code */ 

Kompilierung:

gcc -o gpi gsi.S 

Es ist OK.

Ich installierte später eine neuen CentOS-Version 6.2 im VMware, dann den gleichen Assembler-Code mit dem gleichen Befehl kompilieren, aber ich fand einige Fehler:

Nachrichten Assembly:

Error: invalid use of register 

Diese Fehler zeigen zu den Zeilen:

mov ebx, [DWORD PTR ds:eax] 
mov ebx, [DWORD PTR cs:eax] 

In der CentOS 6.2 ist die GNU gcc Version 4.6.6. Das GNU als Version ist 2.20.51.0.2 (i686-redhat-lnux).

Ich denke, die 2 Zeilen verwenden die Standard-Assembly-Syntax von Intel, so dass sie in CentOS 5.5 OK sind. Ich weiß nicht warum.

+0

Die Assembly-Syntax ist nur für den Compiler relevant, nicht für das Betriebssystem oder die Hardware, also ist das nicht der Täter ... Haben Sie versucht, die AT & T-Syntax zu verwenden? Versuchen Sie die Tabelle am Ende dieses Abschnitts: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3 – Irfy

+5

Die Klammern sind seltsam, dword ptr gehört außerhalb von ihnen. –

+1

Ich bin eher überrascht, dass der Code verwendet wurde, um an erster Stelle zu arbeiten .. – harold

Antwort

1

wie ich kürzlich erfuhr, lea ebx, DWORD PTR [ds:eax] sollte funktionieren.
Wenn Ihr Ziel ist, nur diese Zeiger über ebx zu schieben, denke ich, dass Sie push DWORD PTR [ds:eax] schreiben können. Ich weiß nicht, ob das mit dem GCC-Assembler funktionieren wird.