Gnu Assembler: Wie Konstante ausgeben?

Gast #5510750
Lesenswert?

In deinem Link habe ich leider nichts dazu gefunden. Es geht wie gesagt 
darum, dass man eine berechnete Konstante einfach mal ausgibt. Manchmal 
will man ja wissen, was drin steht, wenn man die Konstante aus anderen 
Konstanten berechnet. Sowas banales müsste doch möglich sein?
Gast #5510956
Lesenswert?

Man kann Strings während der Assemblierung ausgeben mit
1
.print "My little string"

Zahlen gehen damit allerdings nicht, das ist kein printf. Aber man kann 
sich natürlich was basteln, wenn man nur sehen will, ob die Konstante an 
der Stelle den erwarteten Wert hat, indem man .if (bzw. .ifeq) .print 
.endif nimmt.

Hier noch ein cheat sheet: 
http://www.coranac.com/files/gba/re-ejected-gasref.pdf
Gast #5510963
Lesenswert?

Schau mal in die Symboltabelle:
1
$ echo ".equ MYVAR, 1+1024" | as -va | grep MYVAR
2

3
GNU assembler version 2.28 (arm-linux-gnueabihf) using BFD version (GNU Binutils for Raspbian) 2.28
4
   1                .equ MYVAR,1+1024
5
    {standard input}:1      *ABS*:00000401 MYVAR
Gast #5511143
Lesenswert?

Also das resultierende Binary parsen finde ich jetzt nicht wirklich 
praktisch. Ich kann mir beim besten Willen nicht vorstellen, dass kein 
Programmierer jemals Variablen, oder nennen wir sie von mir aus Symbole, 
als Fehlermeldung ausgeben wollte.
#5511179
Lesenswert?

Salat schrieb:
> Ich kann mir beim besten Willen nicht vorstellen, dass kein
> Programmierer jemals Variablen, oder nennen wir sie von mir aus Symbole,
> als Fehlermeldung ausgeben wollte.

Zur Assemblerzeit existieren keine Variablen, sondern nur konstante 
Werte. Und deren Wert ist - überraschenderweise - zur Assemblerzeit 
konstant.

Bei solchen Direktiven geht es darum, unerwartete Abweichungen zu 
erkennen, der eigentliche Wert ist selten wichtig.
Gast #5511229
Lesenswert?

Beim Debuggen würde so eine Ausgabe aber ungemein helfen. Vor allem, 
wenn die Konstanten aus anderen Konstanten berechnet wurden, man den 
Wert also nicht mal eben so auslesen kann..

Also... gibts eine Art printf? Kann auch gerne ein banales sein. Ich 
will nur eine Konstante ausgeben.
Beitrag #5511256 wurde von einem Moderator gelöscht.
#5511318
Lesenswert?

Salat schrieb:

> wenn die Konstanten aus anderen Konstanten berechnet wurden

Warum hießen Konstanten noch mal so?

Wenn ich aus Debuggründen in Assembler den Inhalt eines Registers wissen 
will, ist es ein Zweizeiler, ungefähr so:
1
...
2
mov    TEMP_0,wichtiger_Registerinhalt
3
    rcall  uart_send_byte
4
...

irgendwo habe ich so oder so eine Ausgabeschleife:
1
**********************************
2
; Sub: Sendet ein Byte aus TEMP_0 über UART (USB)
3
; Parameter:  TEMP_0 Datenbyte
4
; Return:    -
5
; Scratch-Reg:  -
6
;**************************************************************************
7

8
uart_send_byte:
9
  push  TEMP_1    
10
uart_send_byte_1:
11
  lds  TEMP_1, UCSR0A
12
  sbrs    TEMP_1,UDRE0                ;SendRegister leer ?
13
        rjmp    uart_send_byte_1          ; nein
14
        sts     UDR0,TEMP_0
15
  pop  TEMP_1
16
        ret

Ist zwar kein GNU-Assembler, aber da wird es vermutlich auch nicht 
anders sein.

MfG
Elux
#5511445
Lesenswert?

.error
.message
.warning

erwarten unmittelbar einen String und weder ein Symbol stattdessen, noch 
weitere Parameter. Damit geht es also nicht. Und das sind die Direktiven 
die Meldungen ausgeben.

Ich würde es daher als Konstante im Flash hinterlegen und mit dem Editor 
im Endergebnis (.hex)kontrollieren. Damit man es findet, kann man einen 
entsprechendeen String definieren und unmittelbar voranstellen, z.B. 
"Kontrolliere mich!".

Das ist zwar etwas unschön, aber die Präprozessordirektiven sind in der 
Doku aufgelistet. Und da gibt es nicht so viele Benachrichtigungsmittel.

Alternativ kann man den Wert mit Formeln prüfen lassen und dann abhängig 
vom Ergebnis bedingt unterschiedliche Strings ausgeben, so wie es im 
ASM-Tutorial bei der Baudratenberechnung vorgeführt wurde.

https://www.mikrocontroller.net/articles/AVR-Tutorial:_UART

Das ist abr keine direkte Ausgabe des Ergebnisses.
Gast #5511988
Lesenswert?

@ Salat : Hast Du Dir so etwas wie hier unten vorgestellt?
1
/*  file: printvar.S
2

3
  Macros zum Drucken auf STDOUT während der Assemblierung.
4
  Da .print einen String als Parameter erwartet, muss
5
  dieser mittels eines Helfermacros konstruiert werden.
6
*/
7

8
.macro printhelper t, w
9
/*  Aneinanderfügen der Teilstrings t und w */
10
        .print "\t \w"
11
.endm
12

13
.macro printvar text, value
14
/*  Mit dem %-Zeichen value evaluieren.
15
  Zur Aktivierung dieser Funktion wird .altmacro benötigt! */
16
.altmacro
17
        printhelper \text, %\value
18
.endm
19

20
.equ MYVAR, 1024+1
21

22
printvar "MYVAR=", MYVAR
23
.end


1
$ as -v printvar.S 
2
GNU assembler version 2.28 (arm-linux-gnueabihf) using BFD version (GNU Binutils for Raspbian) 2.28
3
MYVAR= 1025

Das Beispiel bei stackoveflow war für die Programmierung sehr hilfreich:
https://stackoverflow.com/questions/26813510/expression-in-gcc-arm-assembly-macro


73
#5512038
Lesenswert?

Salat schrieb:
> Beim Debuggen würde so eine Ausgabe aber ungemein helfen.

Wenn du an der Stelle ein Problem hast, dann ist vermutlich woanders 
bereits was schiefgelaufen. Wie gesagt, der Wert deiner Konstanten steht 
in der Symboltabelle drin.

Salat schrieb:
> Also... gibts eine Art printf?

Ein printf kann es prinzipbedingt nicht geben, weil der Assembler (bzw. 
dessen Präprozessor) keine Datentypen kennt. Alles andere sind ziemliche 
Hacks, aber die wurden bereits genannt.
Gast #5512358
Lesenswert?

@symboltable

Funktioniert! Zumindest nach einer kleinen Änderung. Vielen Dank für die 
Hilfe!


.macro printhelper t1, t2
        .print "\t1\t2"
.endm
.macro printvar text, value
.altmacro
        printhelper \text, %\value
.noaltmacro
.endm

printvar "myvar lautet ", MYVAR


Man kann das Macro nicht in einer externen Datei speichern und via 
include einbauen. ka wieso. Aber ganz ehrlich... der gas wäre eh ein 
Kandidat zum komplett neuschreiben.
Beitrag #5512474 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren