Forum: Mikrocontroller und Digitale Elektronik Superprofi hat ein ASM Problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von ASM Superprofi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von ASM Superprofi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Und komm mir jetzt keiner mit rjmp .+40 an.

von Heinz V. (heinz_v)


Bewertung
0 lesenswert
nicht lesenswert
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.
von Joe F. (easylife)


Bewertung
1 lesenswert
nicht lesenswert
Bin ich froh, dass ich in Superprofi-C programmiere...

Beitrag #4967313 wurde von einem Moderator gelöscht.
von S. R. (svenska)


Bewertung
2 lesenswert
nicht lesenswert
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. ;-)

von Johann L. (gjlayde) Benutzerseite


Bewertung
5 lesenswert
nicht lesenswert
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:

von Dr. Sommer (Gast)


Bewertung
-4 lesenswert
nicht lesenswert
Ihr Pappnasen, das ist so offensichtlich ein Troll der auf den 
Assembler-Präprozessor-Thread anspielt...

von ASM Superprofi (Gast)


Bewertung
1 lesenswert
nicht lesenswert
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 =)

von allu (Gast)


Bewertung
1 lesenswert
nicht lesenswert
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

von (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)


Bewertung
-4 lesenswert
nicht lesenswert
> 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...

von Jobst M. (jobstens-de)


Bewertung
1 lesenswert
nicht lesenswert
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.
von Jobst M. (jobstens-de)


Bewertung
1 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.