PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR8-Assembler lernen



Bernd_Stein
13.11.2021, 10:49
Das S-Flag ( Signed Test ) :



Auf das S-Flag ist hier leider niemand eingegangen und hoffe nun hier befriedigende Antworten zu bekommen :

https://www.mikrocontroller.net/topic/295439#6853179


Das V-Flag hat mich ja schon richtig Gehirnschmalz gekostet :

https://www.mikrocontroller.net/topic/295439#6782191


Bernd_Stein

White_Fox
13.11.2021, 12:16
Also, wenn das mein Problem wäre würde ich zuerst mal ins Datenblatt schauen.

Da es aber nicht mein Problem ist, bin ich einfach zu faul zum Suchen.

oberallgeier
13.11.2021, 12:49
.. Auf das S-Flag ist hier leider niemand eingegangen und hoffe nun hier befriedigende Antworten zu bekommen ..Notwendig für ne Antwort wär doch ne Frage - oder soll man sich durch all Deine deep-links und deren weitere Verlinkungen durchkämpfen um Deine Frage zu finden?


.. Das V-Flag hat mich ja schon richtig Gehirnschmalz gekostet ..Das ist nicht sonderlich erhellend wenn man ne Antwort erwartet. Oder muss man Dich bedauern?

Trotz meiner Abneigung gegen solche Nicht-Fragen und deren Autoren : Im AVRSTudio 4 (z.B. Version 4.19 Build 730) gibts das Register [Help], dort, im Flyout ein weiteres [Assembly Help]. Damit bekommt man für jeden einzelnen Controllerbefehl eine ausführlich Hilfe - auch zu den Statusregistern und dessen Flags. Darauf verweist ja auch das Datenblatt (z.B. .. See the “Instruction Set Description” for detailed information. ..).

Bernd_Stein
13.11.2021, 16:16
.. Auf das S-Flag ist hier leider niemand eingegangen und hoffe nun hier befriedigende Antworten zu bekommen

Notwendig für ne Antwort wär doch ne Frage - oder soll man sich durch all Deine deep-links und deren weitere Verlinkungen durchkämpfen um Deine Frage zu finden?


Na gut fange ich von vorn an.

Wer hat lust, Zeit und Wissen, um zu versuchen mir den Sinn des S-Flags begreiflich machen ?

Die vorherigen Links zeigen auf welchem "Wissensstand" ich zur Zeit bei diesem Thema bin.


Bernd_Stein

gunzelg
13.11.2021, 17:42
Hier stehen die Flags erklärt:

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

Gruß

shedepe
14.11.2021, 12:34
Erster Anlaufpunkt sollte doch das Reference Manual sein:
http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf

Bernd_Stein
14.11.2021, 13:00
Hier stehen die Flags erklärt:

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

Gruß

Tja, da schreibt man und tut man und verlinkt man, aber es interessiert sowie nicht wirklich, hauptsache man...


Erster Anlaufpunkt sollte doch das Reference Manual sein:
http://ww1.microchip.com/downloads/e...set-manual.pdf (http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf)


S = N ⊕ V, for signed tests

Ganz toll, ich seh schon hier wirds auch nicht besser.


Bernd_Stein

gunzelg
14.11.2021, 13:23
Die Rüge ist nicht gerechtfertigt. @shedepe hat doch das Assemblermanual verlinkt. da stehen alle Assemblerbefehle drin und welche Flags diese beeinflussen. Was gibt es jetzt da noch nicht zu verstehen, was viele Worte jetzt besser erklären könnten? Wenn du damit nicht zurechtkommst, installier die nen Assembler und probier einzelne Addition/Subtraktionen aus und dschau welche Flags da verändert werden. Ich habe mit AVR noch nix gemacht, meine Assembler-Anfänge hatten noch Z80 und 6502 zu tun und ich habe auch so gemacht.

Gruß
Gerhard

oberallgeier
14.11.2021, 16:05
.. Ganz toll, ich seh schon hier wirds auch nicht besser ..
Die Rüge ist nicht gerechtfertigt ..Genau, ich würde das schon fast frech nennen. Der Link von gunzelg führt zu

Ausschnitt aus gunzelgs Link nach dieser Zeile zu mikrocontroller.net ".. Hier stehen die Flags erklärt: .."
- - - - - - - Ausschnitt - - - - - -
Flags

Die Flags sind Bits im Statusregister SREG. Ihre Aufgabe ist es, das Auftreten bestimmter Ereignisse, die während Berechnungen eintreten können, festzuhalten. Speicherbefehle (LD, LDI, ST, MOV, ...) haben auf dem AVR grundsätzlich keinen Einfluss auf das Statusregister. Will man den Inhalt eines Registers explizit testen (z. B. nach dem Laden aus dem SRAM), so kann man hierfür den TST-Befehl verwenden.




I
T
H
S
V
N
Z
C


Overflow (V)

Dieses Bit wird gesetzt, wenn bei einer Berechnung mit 2-Komplement Arithmetik ein Überlauf (Unterlauf) stattgefunden hat. Dies entspricht einem Überlauf von Bit 6 ins Bit 7.
Der Übertrag, der bei der Addition/Subtraktion von Bit 6 auf Bit 7 auftritt, zeigt daher – wenn er vorhanden ist – an, dass es sich hier um einen Überlauf (Overflow) des Zahlenbereichs handelt und das Ergebnis falsch ist. Das ist allerdings nicht der Fall, wenn auch der Übertrag von Bit 7 nach Bit 8 (Carry) aufgetreten ist. Daher ist das Overflow-Flag die XOR-Verknüpfung aus den Übertrag von bit 6 nach Bit 7 und dem Carry.
Beispiele für die Anwendung des V-Flags finden sich in saturierter Arithmetik (https://www.mikrocontroller.net/articles/AVR_Arithmetik/Saturierung).
Signed (S)

Das Signed-Bit ergibt sich aus der Antivalenz der Flags N und V, also S = N XOR V. Mit Hilfe des Signed-Flags können vorzeichenbehaftete Werte miteinander verglichen werden. Ist nach einem Vergleich zweier Register S=1, so ist der Wert des ersten Registers kleiner dem zweiten (in der Signed-Darstellung). Damit entspricht das Signed-Flag gewissermaßen dem Carry-Flag für Signed-Werte. Es wird hauptsächlich für 'Signed' Tests benötigt. Daher auch der Name.
- - - - - - - Ende Ausschnitt - - - - - -

Das sieht nach meinem Dafürhalten absolut anfängerfreundlich aus und sehr gut erklärt. Es trifft ja genau Deine eingangs genannte Frage:

.. Auf das S-Flag ist hier leider niemand eingegangen und hoffe nun hier befriedigende Antworten zu bekommen : ..Was genau ist jetzt noch unverständlich für Dich? Hattest Du denn die Dir genannten Links angesehen? Hattest Du denn insbesondere den Link zu zu mikrocontroller.net angesehen?

Hmmmm.
.. meine Assembler-Anfänge hatten noch Z80 und 6502 zu tun und ich habe auch so gemacht ..*grins* noch einer *ggg*

Bernd_Stein
21.11.2021, 14:14
Die Rüge ist schon gerechtfertigt, denn den uC-Artikel hatte ich ja selbst dort vorher verlinkt und daraufhin die Vermutung, dass das S-Flag nur die Befehle
BRGE & BRLT bedient und ansonsten uninteressant ist angestellt, aber den Verweis auf uC.net hat man ja nicht richtig durchgelesen - wenn überhaupt.

https://www.mikrocontroller.net/topic/295439#6853179

Hier gabs dann doch noch eine befriedigende Antwort :

https://www.mikrocontroller.net/topic/295439#6879714


Bernd_Stein

Bernd_Stein
13.12.2021, 19:24
Hallo zusammen,

vielleicht hat ja hier jemand eine Lösung um den Schönheitsfehler zu verbessern.

35667

Bleibt leider immer noch der Schönheitsfehler mit dem Minuszeichen,
welches nicht direkt vor dem Wert steht. Außer natürlich es ist ein
hunderter Wert.

Ach, übrigens - auch wenn am Ende, bzw. überhaupt kein RET-Befehl steht,
ist diese Routine mit einem RCALL,- oder CALL-Befehl aufzurufen.



;************************************************* ***********************/
;* */
;* Display values on LCD */
;* */
;* Author: Peter Dannegger */
;* danni@specs.de */
;* mit Aenderungen f. Temperatursensor ( DS18B20 ) von Unbekannt */
;************************************************* ***********************/
;************************************************* ***********************/
;-------------------------------------------------------------------------
; Anzeige ohne fuehrende Nullen
;-------------------------------------------------------------------------
;input: a = value 0..255
;used: a, b, c
;
_dec_out:
tst a ;Negativer Wert ?
brpl _positiv ;Nein -> springen
mov c,a ;Wert sichern
ldi a,$10 ;Cursor einen nach links um bei Minus Anzeige..
rcall _lcd_cmd ;..noch formatiert zu bleiben
ldi a,'-'
rcall _dou4 ;Zeichen ausgeben
mov a,c ;gesicherten Wert zurueck holen
neg a ;In positives Aquivalent umwandeln
_positiv:
mov c, a ;Wert f. weiterverarbeitung kopieren
subi c, 100 ;Hunderter ermitteln
brcc _hunderter ;if > = 100, die hunderter Stelle auswerten..
ldi a,' ' ;..ansonsten die hunderter Stelle durch Space ersetzen..
clt ;Keine Hunderter vorhanden
rjmp _dou2 ;..und dies ausgeben
_hunderter:
set ;Hunderter vorhanden
mov c, a ;Wert wieder neu laden und..
ldi a, '0' - 1 ;..Hunderter zaehlen..
_dou1:
inc a ;..wobei die Ziffer in ASCII umgewandelt wird
subi c, 100 ;100 subtrahieren
brcc _dou1 ;< 100 -> Nein -> weiter zaehlen
_dou2:
rcall _dou4 ;output hundrets
_zehner:
ldi a, '0' +10 ;Zehnerstelle in ASCII umwandeln..
_dou3:
dec a ;..und ASCII rueckwaerts von '9'
subi c, -10 ;Zehner x +10
brcs _dou3 ;Zehner gezaehlt ? NEIN -> weiter zaehlen
rcall _dou5 ;output tens
subi c,-'0' ;Einerstelle in ASCII uberfuehren
mov a, c ;output ones
_dou4:
rjmp _lcd_data ;ASCII-Zeichen ausgeben
_dou5:
cpi a, '0' ;Ist die Zehnerziffer eine Null ?..
brne _dou4 ;..Nein -> Zehnerziffer ausgeben..
brts _dou4 ;Waren vorher Hunderter vorhanden ? Ja -> Null ausgeben
ldi a,' ' ;..Nein -> Null durch Space ersetzen und..
rjmp _dou4 ;..jetzt ausgeben
;------------------------------------------------------------------------------



Seht evtl. auch hier nach :

https://www.mikrocontroller.net/topic/6516#6909211

(https://www.mikrocontroller.net/topic/6516#6909211)Beziehungsweise überhaupt beim Ursprung :

https://www.mikrocontroller.net/topic/6516#41903



Bernd_Stein