Hi! Superprofi ist heute kein Superprofi, hat nämlich ein unprofihaftes Problem und sucht Hilfe. Folgender Beispielcode: cpi r24,123 brne cont4 weiterer code cont4: Das Problem ist, dass ich solche IFs andauernd brauche und keine Lust habe, mir für ein paar Zeilensprünge jedes Mal eine Sprungmarke auszudenken. Benutze ich Makros, geht das ganze sehr elegant mit \@, jedoch nur in Makros. Gibt es in gas eine Möglichkeit, daraus ungefähr sowas zu machen: cpi r24,123 brne cont weiterer code cont: cpi r16,1 brne cont weiterer code cont: In Worten: Er soll immer zum nächsten cont springen, was er im Code findet. Das mit den Sprungmarken läuft bei mir noch nicht so superprofihaft, wie ich es gerne hätte.
Schreib Dir doch in Python o.ä. einen 'Präprozessor' der deine Source nach 'cont' scant und paarweise durch fortlaufend nummerierte Labels ersetzt.
Beitrag #4967265 wurde von einem Moderator gelöscht.
Beitrag #4967313 wurde von einem Moderator gelöscht.
Laut Doku kennt gas "local labels", die schlicht positive Zahlen sind. Du kannst also das Label "1" definieren, und der Code darüber verweist dann auf "1f" (forward), der Code dahinter entsprechend auf "1b" (backward). https://sourceware.org/binutils/docs/as/Symbol-Names.html Kenne deine Werkzeuge, und so. ;-)
ASM Superprofi schrieb: > In Worten: Er soll immer zum nächsten cont springen, was er im Code > findet. Mit Labels, die Bustaben (incl. _ und .) enthalten, geht das nicht. Was du verwenden kannst sind Labels, die nur Ziffern enthalten und eine Suffix 'b' für Rückwärtssprung (back) oder 'f' for Vorwärtssprung (forward). In deinem Beispiel:
1 | cpi r24,123 |
2 | brne 0f |
3 | weiterer code |
4 | 0: |
5 | |
6 | cpi r16,1 |
7 | brne 0f |
8 | weiterer code |
9 | 0: |
Ihr Pappnasen, das ist so offensichtlich ein Troll der auf den Assembler-Präprozessor-Thread anspielt...
Johann L. schrieb: > Mit Labels, die Bustaben (incl. _ und .) enthalten, geht das nicht. Was > du verwenden kannst sind Labels, die nur Ziffern enthalten und eine > Suffix 'b' für Rückwärtssprung (back) oder 'f' for Vorwärtssprung > (forward). wow super krass, genau was ich gesucht habe. Danke für den Tipp! Damit ist mein Leben ein wenig einfacher geworden =)
ASM Superprofi schrieb: > Gibt es in gas eine Möglichkeit, daraus ungefähr sowas zu machen: > > cpi r24,123 > brne cont > weiterer code > cont: > > cpi r16,1 > brne cont > weiterer code > cont: Ich baue es so auf: Alle Labels eines (Unter-)Programms haben den gleichen Namen und werden in Schritten durchgezählt. Der Prg.-Ausgang endet immer auf 99: und ist der einzige Punkt an dem das Programm verlassen werden darf. Teste: cpi r24,123 brne Teste_10 weiterer code Teste_10: cpi r16,1 brne Teste_20 weiterer code Teste_20: weiterer code Teste_99: ret
> Alle Labels eines (Unter-)Programms haben den gleichen Namen und werden > in Schritten durchgezählt. Ich hoffe mal dein Editor hat das seit BASIC-Zeiten beliebte RENUMBER Kommando. LOL...
Also für nur ein Register kann man Tabellen benutzen: R16 = Auf Länge der Tabelle begrenzte Zahl. (Evtl. kann man zwei Zahlen geschickt in einer unter bringen)
1 | LDI R17, 2 |
2 | MUL R16, R17 |
3 | LDI ZL, low(Sprungtabelle*2) |
4 | LDI ZH, high(Sprungtabelle*2) |
5 | ADD ZL, R0 |
6 | ADC ZH, R1 |
7 | LPM XL, Z+ |
8 | LPM XH, Z+ |
9 | MOV ZL, XL |
10 | MOV ZH, XH |
11 | IJMP (oder ICALL, wenn man wieder hierhin zurück möchte) |
12 | |
13 | : |
14 | : |
15 | Bei ICALL weiterer Code |
16 | : |
17 | |
18 | Sprungtabelle: |
19 | .dw (fct1*2) ; Funktion für R16 = 0 |
20 | .dw (fct2*2) ; Funktion für R16 = 1 |
21 | .dw (fct3*2) ; Funktion für R16 = 2 |
22 | |
23 | fct1: Bla |
24 | RET/JMP |
25 | |
26 | fct2: Blubb |
27 | RET/JMP |
28 | |
29 | fct3: Gnap |
30 | RET/JMP |
Gruß Jobst
:
Bearbeitet durch User
Beitrag #4967717 wurde von einem Moderator gelöscht.
Ach, verdammt. Nun sehe ich gerade erst, dass bei meinem Vorschlag ein Fehler eingebaut ist: Die Sprungmarken in der Sprungtabelle sind ja Adressen, keine Daten (wo das so sein muss). Die Adressen müssen nicht mit 2 multipliziert werden. Also:
1 | Sprungtabelle: |
2 | .dw (fct1) ; Funktion für R16 = 0 |
3 | .dw (fct2) ; Funktion für R16 = 1 |
4 | .dw (fct3) ; Funktion für R16 = 2 |
Gruß Jobst
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.