Assembler AVR Studio 4, Syntax Frage

TommyB

Team Bitschubse
17. Mai 2010
2.151
80
48
40
127.0.0.1 ;)
Sprachen
  1. C#
  2. VB.Net
  3. LunaAVR
  4. Assembler
  5. Python
Heyho :)

Hab mal ne kurze Frage bezüglich Assembler und der Syntax.
Ich habe auch schon mal gegoogelt und das hier gefunden. Leider wird in dem Thread von jedem die Frage falsch verstanden.

Ich nehme jetzt mal ein Beispiel aus Visual Basic, aber das Prinzip sollte klar werden:
Code:
Public Function MacheEtwas(Arg1 As String, Arg2 As String, Arg3 As String, ... ArgN As String) As String
Sagen wir die Function hat jetzt 10 Argumente sieht man nix mehr ohne horizontales Scrolling und beim Drucken ist auch alles durcheinander. Daher kann man da auch sowas machen:
Code:
Public Function MacheEtwas( _
  Arg1 As String, _
  Arg2 As String, _
  Arg3 As String, _
  ... _
  ArgN As String _
) As String
Sprich anders als bei c, c++, php, ... wo man mit ; das Zeilenende definiert sagt man hier mit _ dass der Befehl in der nächsten Zeile noch weiter geht.

Genau sowas suche ich in ASM. Vor allem bei Initialisierungen wie
Code:
LDI TEMP1 , (1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0)
wäre das sinnvoll. Aber auch bei Daten. So würde ich z. B. gerne die benutzerdefinierten Zeichen für ein LCD binär darstellen sodass man gleich sehen kann wie das Zeichen aussieht. Also statt
Code:
chroUml: ; ö
.DB 0b00000000, 0b00001010, 0b00000000, 0b00001110
.DB 0b00010001, 0b00010001, 0b00010001, 0b00001110
so in der Art
Code:
chroUml: ; ö
.DB _
  0b00000000, _
  0b00001010, _
  0b00000000, _
  0b00001110, _
  0b00010001, _
  0b00010001, _
  0b00010001, _
  0b00001110
Würde ich das in diesem Beispiel mit einzelnden .DB's machen würde ja immer wieder ein 0 Byte angehängt werden. Blöd.

Gibt es da was?
 
Hallo Thomas,

ab Assembler Version 2 geht dies über Backslash "\" am Zeilenende

Dirk :ciao:

Line continuation

Like in C, source lines can be continued by means of having a backslash (\) as the last character of a line. This is particularly useful when defining long preprocessor macros, and for long .db directives.
Example

.db 0, 1, "This is a long string", '\n', 0, 2, \
"Here is another one", '\n', 0, 3, 0
 
Klasse, funktioniert wunderbar!

Vielen Dank!
 
Muss mich korrigieren.

Funktioniert wirklich gut. Aber nur im Programmcode.
Innerhalb von Macros geht es leider nicht. Beispiel:

Code:
.MACRO lcd_HWInit

	; Initialize port pins: DDR
(!)	LDI	TEMP1	, (1<<DDD7) | (1<<DDD6) | (1<<DDD5) | \
			  (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0)
	OUTX	DDRD	, TEMP1

	; Initialize port pins: PORT
	INX	TEMP1	, PORTD
	ANDI	TEMP1	, (1<<PIND4)	; Reset anything except PD4
	OUTX	PORTD	, TEMP1

.ENDMACRO
wirft ...\HW_Display.asm(21): error: syntax error, unexpected '(' in der mit (!) markierten Zeile.

Schade. Ich verbuche das mal als Bug im AVR Studio / Assembler ^^
 
Funktioniert wirklich gut. Aber nur im Programmcode.
Innerhalb von Macros geht es leider nicht.
Hi Tommy,

ja, es ist wahrscheinlich ein bug und hat bestimmt hiermit etwas zu tun ...

Code:
[B]Issue #4146: Line continuation doesn't work in macro calls[/B]

 The following program illustrates this issue.
 [COLOR=#ffffff].macro[/COLOR] m
     ldi @0, @1
.endm
     m    r16,\
           0
 This is not a problem with preprocessor macros (#define).

Dirk :ciao:
 
Ist zwar schon'ne Weile her/vielleicht nicht mehr aktuell:
...Würde ich das in diesem Beispiel mit einzelnden .DB's machen würde ja immer wieder ein 0 Byte angehängt werden. Blöd.

Gibt es da was?
Das gilt im Flash (da der Programmspeicher bei den AVR in words organisiert ist).
Das Eeprom hingegen ist ganz normal byte-organisiert.
 
Stimmt wohl :)
Wobei ich den internen EEPROM noch nie genutzt habe (aber mich drüber freue dass der existiert ^^)
Ich nutz meist ja noch nicht mal den SRAM (außer durch den Stack natürlich)

Aber das war ja eh nur ein Beispiel für die Verwendung ;)
 
Tadaaa, ich hätt noch eine :)

In VB.Net kann ich per (Compiler-) Konstanten einzelne Codeabschnitte ab- oder umschalten. Pseudocode:
Code:
#Const ReadOnly = True

    Sub LoadFile ...

#If ReadOnly Then

    ReadOnly Property Item(Name As String)
        Get ...
    End Property

#Else

    Sub SaveFile ...

    Property Item(Name As String)
        Get ...
        Set ...
    End Property

#End If

Sprich oben im Code (oder in den Projekteigenschaften) kann ich sagen dass der die Klasse nur als ReadOnly Version kompilieren soll, oder eben nicht. Der somit ausgeklammerte Teil wird komplett außer Acht gelassen.

Gibt doch bestimmt sowas auch in Assembler, oder?
 
Hallo Tommy,
Gibt doch bestimmt sowas auch in Assembler, oder?

ja, zum Beispiel:

Code:
#define true 1  // nur falls du "true" nutzen möchtest

#define ReadOnly true  // ReadOnly ist nun 1

  //...

#if ReadOnly  // condition ist wahr, da ReadOnly 1 ist

  // ...

#else

  // ...

#endif

Schau dir hierzu vielleicht auch mal die Assembler-Hilfe von AVR Studio an, Bereich Preprocessor.

Dirk :ciao:
 
Na toll... ^^

Das hatte ich sogar schon mal im Netz gesehen, aber Macht der Gewohnheit (ich schreib in Assembler immer alles bis auf Label groß) hab ichs da auch gemacht. Und ausgerechnet da ist der natürlich case sensitive *grummel*

Klein geschrieben gehts, noch mal Danke :)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)