GAS Inline Assembler mit Intel Syntax, Speicher mit Sprungadressen bestücken



  • Hallo,

    ich arbeite mit dem GAS Compiler, jedoch mit der Intel-Syntax und nicht der AT&T Variante. Ich möchte an einem Label die Adressen weiterer Labels speichern, um dann mit Hilfe eines Sprungs ähnlich wie diesem hier

    JMP [Label+eax*4]
    

    an die richtige Position im Programm springen zu können. Insgesamt möchte ich so einen switch mit Sprungadressen realisieren.

    Das Problem ist, dass ich nicht weiß, wie ich den Speicher mit den Labels deklarieren soll. Im GAS-Manual habe ich soetwas gefunden:

    Label:
    .int case0, case1, case2;
    

    http://sourceware.org/binutils/docs-2.19/as/Int.html

    Das Problem ist, dass bei mehr als einem case-Label das Programm abstürzt. Weiß jemand, wie man das richtig macht? Da ist wahrscheinlich an meinem Wissen irgendetwas verkehrt, aber ich komm einfach nicht klar.

    Eine ähnliche Lösung mit NASM ist hier aufgezeigt:

    http://www.ntecs.de/old-hp/uu9r/lang...embler.en.html (nach "A Fast and Good Hash Function" suchen).

    jump_table: dd case0, case1, case2, case3, case4, case5, case6, case7, case8, case9, case10, case11
    ...
    jmp [jump_table+len*4]
    

    Diese Syntax funktioniert in GAS aber leider nicht. Ich bräuchte sozusagen etwas analoges. Kennt sich da jemand aus? Ich bin bereits seit 2 Tagen am rumprobieren und nichts klappt... das ist echt deprimierend.

    Viele Grüße, David



  • In AT&T Syntax wäre Dein Vorhaben ungefähr so zu implementieren:

    .global _start
    
    .section .data
    
    jump_table: .int case0, case1, case2, case3
    
    .section .text
    
    _start:
        mov $0, %eax
        jmp *jump_table(, %eax, 4)
    
    case0:
        ...
    case1:
        ...
    case2:
        ...
    case3:
        ...
    

    Vielleicht hilft es ein wenig weiter...



  • JA, genau das isses! Es hat geklappt! VIELEN DANK - nach 3 Tagen jetzt die Erlösung 🙂

    Ich wusste nicht, dass ich das .section data davorklemmen muss. Wieder was dazugelernt.


Anmelden zum Antworten