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.