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 Long

    ABer 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 Doubleword

    Laut 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 POPF

    Buch: 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 😉


Anmelden zum Antworten