GCC Inline
-
Hi
Also folgendes Problem beim Portieren von VC auf GCC:
asm( "movl $1, %eax\n" "CPUID\n" "shr $4, %edx\n" "and $1, %edx\n" "movl %edx, %0" : "=r"( canRDTSC ) );
Wenn ich das mov am Ende weglasse und das "=r"( ... ) habe ich keine Fehler.
Nur mit kriege ich für fast jede Zeile ein "invalid asm operand after %"
Wo liegt der Fehler? Habe schon die FAQ durch. Meiner bescheidenen Meinung sollte das so klappen.Zweite Frage:
Gibts kein pushfd und popfd im at&t Syntax?Danke schonmal
Sven
-
Versuch mal die %eax zu %%eax etc.
-
Danke
-
Was pushfd, popfd angeht, anscheinend heißen die in gas einfach pushf und popf
-
Pushf und Popf kanns normal nicht sein. Das währen die 16 Bit pushes.
Pushfl und Popfl scheinen richtig zu sein. Bei AT&T gibts ja kein DWord, sondern Long
-
SnorreDev schrieb:
Pushf und Popf kanns normal nicht sein. Das währen die 16 Bit pushes.
Pushfl und Popfl scheinen richtig zu sein. Bei AT&T gibts ja kein DWord, sondern LongABer wären pushf und popf in 16-Bit nicht pushfw und popfw?
-
Zumindest beim Intel Syntax ist es so definiert:
POPF = POPFW = POP FLAGS 16 Bit bzw. Word
POPFD = POP FLAGS DoublewordLaut meiner Referenz
-
Und laut meiner Referenz ist popf je nach Modus definiert, im 32-Bit-Mode als popfd und im 16-Bit-Mode als popfw
SPrich alles derselbe Opcode, n sind d bzw. w ein Hint für den Assembler, während ohne suffix einfach der Opcode hingepackt wird.
-
Dann ist in einer Referenz ein Käfer
Bei mir steht wordwörtlich bei popf:
POPF schreibt das word, daß auf der Stack-Spitze liegt, in die unteren 16-Bit des Flag-Registers.
Die Meisten Compiler unterstützen auch den Befehl POPFW ( = pop flag word ), der synonym für den Befehl popf benutzt werden kann
und bei popfw
POPFW pop flag word
Siehe POPFBuch: Assembler Gepackt MITP Verlag
Was für eine Referenz hast du denn?
-
Das Assembler-Buch von Trutz Eike Podschun. So ich starte jetzt nen Feldversuch
-
triphoenix:~/root$ cat > test.asm [BITS 16] popfw popf popfd triphoenix:~/root$ nasm test.asm triphoenix:~/root$ ndisasm test 00000000 9D popf 00000001 9D popf 00000002 669D popfd triphoenix:~/root$ cat > test.asm [BITS 32] popfw popf popfd triphoenix:~/root$ nasm test.asm triphoenix:~/root$ ndisasm test 00000000 669D popfd 00000002 9D popf 00000003 9D popf triphoenix:~/root$ cat > test.s popfw popf popfl triphoenix:~/root$ as test.s triphoenix:~/root$ objdump -d a.out a.out: file format elf32-i386 Disassembly of section .text: 00000000 <.text>: 0: 66 9d popfw 2: 9d popf 3: 9d popf
:p
-
Dann hat wohl mein Buch nen Bug