Philip schrieb:> Wie würde es aussehen, wenn man einen Wert von 10 auf dem LCD ausgeben> will....> wenn ich 10 abziehe, dann erhalte ich eine Null.
Ja.
Aber
1
subi temp2, 10 ; 10 abziehen
2
brcc lcd_number_2 ; ist dadurch kein Unterlauf
bei 0 entsteht noch kein Unterlauf (das Ergebnis ist noch nicht
negativ).
D.h. du zählst 1 Zehner.
Was ja auch richtig ist.
Philip schrieb:> fällt dann der Teil am Anfang dann weg?>> ldi temp1, '0'-1 ; temp1 mit ASCII '0'-1 vorladen
Die Frage würde sich erübrigen, wenn du das Prinzip kapiert hättest.
inc temp1 ; ASCII erhöhen (somit ist nach dem ersten
5
...
den Kommentar
1
;** Zehner **
genau dort platziert habe, wo er steht?
Es hilft nix. Wenn man in Assembler programmiert, d.h. gerade wenn man
in Assembler programmiert, muss man mitdenken. Unter anderem auch
deshalb, weil man sich da um jeden noch so kleinen Pfurz selber kümmern
muss.
Philip schrieb:> fällt dann der Teil am Anfang dann weg?>> ldi temp1, '0'-1 ; temp1 mit ASCII '0'-1 vorladen
Nein, denn um die "0" auf einem Display darzustellen sendest Du diesem
0X30 bzw 48dez, denn so ist der Binaerwert des Zeischens "0" im
*A*merican *S*tandart *C*ode for *I*nformation *I*nterchange
(amerikanischer Standart Code zum Informationsaustausch) definiert.
Also musst Du jeder Ziffer die 0x30 hinzuadieren, hier sind es 0x2F, da
eine 1 schon vorhanden ist.
Karl H. schrieb:> warum ich im Tutorial
Ich hoffe der Code im Tutorial ist so programmiert, wie er programmiert
ist, nur um vereinfacht das Prinzip zu verdeutlichen, denn ein "echter"
Assemblerprogrammierer hätte das etwas optimierter gemacht..
>> ... denn ein "echter" Assemblerprogrammierer hätte das etwas>> optimierter gemacht..> Dann zeig mal, wie du das angehen würdest ...BUMM Treffer, versenkt! :)
Das Prinzip ist in dem Assembler Snippet doch schon sehr
selbsterklärend. Wenn es um jedes Byte geht, könnte man nun noch die
100,10 und 1 aus einer Tebelle holen und noch jedem 'Unterlauf' den
Pointer auf diese Tabelle auffrischen, aber das ist bei den heutigen
Flashgrössen eigentlich nicht mehr nötig.
Auch eine Erweiterung auf 5-stellig oder so ist da einfach, wenn man
sich ans Schema hält - lediglich Bytes sind dann zu klein, Words sind
dann angesagt.
Hier mal mein altes Snippet für den MCS51 nach diesem Schema, auch nur
für Bytes, aber mit Unterdrückung von führenden Nullen:
1
lzero BIT STA2 ; suppress leading zeros flag in PRDEC output
2
; Prints a decimal number out of a byte in ACC
3
; method: Subtracting until carry, then next digit
4
; we have suppression of leading zeros here
5
; uses R3,R4,R5 and our scratch at R7
6
;
7
PRDEC: CLR lzero ; Flag in bit adressable area
8
MOV R5,#0h ; counter
9
MOV R3,A ; save the value
10
SETB double
11
PRDEC1: MOV R4,#0h
12
MOV A,R5 ; counter
13
PRDEC2: MOV DPTR,#DECTBL
14
MOVC A,@A+DPTR ; get value to sutract
15
MOV R7,A ; subtractor
16
PRDEC4: MOV A,R3 ; get value
17
CLR C ; math ahead
18
SUBB A,R7 ; try it
19
JC PRDEC3 ; it was too much
20
MOV R3,A ;
21
INC R4 ; value adder
22
SJMP PRDEC4
23
PRDEC3: JB lzero,PRDEC8 ; leading zero suppression
24
CJNE R4,#0h,PRDEC5 ; its not zero
25
CJNE R5,#02h,PRDEC7 ; its the not last digit, print nothing
Wolfgang A. schrieb:> Dann zeig mal, wie du das angehen würdest ...
Ich denke die Frage ist mittlerweile schon beantwortet. Sich
wiederholende Aufgaben kommen in eine Schleife. Das ist besonders
sinnvoll wen man einmal mehr als 3 Ziffern ausgegeben möchte. Über die
Sinhaftigkeit Programme zu verkürzen weil ja heute der Speicher so groß
und billig ist habe ich weder an dieser, noch an anderer Stelle Lust zu
diskutieren. Das schon mal vorweg. Das können gerne andere machen. Wenn
man zu Assembler greift hat man sicher seine Gründe. Einer davon ist es
eine Codeoptimierung zu betrieben. Deshalb gehören zum erlernen von
Assembler eben auch diese Aspekte.
Thomas H. schrieb:> Karl H. schrieb:>> warum ich im Tutorial>> Ich hoffe der Code im Tutorial ist so programmiert, wie er programmiert> ist, nur um vereinfacht das Prinzip zu verdeutlichen, denn ein "echter"> Assemblerprogrammierer hätte das etwas optimierter gemacht..
Schon klar, dass man das auch noch kürzer schreiben kann.
In einem Tutorial hast du immer das Problem, dass du es mit Neulingen zu
tun hast. D.h. ein Tutorial muss darauf Rücksicht nehmen, zuallererst
einmal für Neulinge verstehbare Lösungsmöglichkeiten zu zeigen.
Und wie sich hier ja zeigt, ist selbst mit dieser simplen Lösung noch
lange nicht garantiert, dass dieses einfache Verfahren verstanden wird.
Philip schrieb:> Also ich habe den Code aus dem Tutorial übernommen und bekomme am LCD> anstatt 10 1B angezeigt.
Dann hast du eben nicht den Code aus dem Tutorial übernommen. Denn der
funktioniert nachweislich. Also vergleiche, wo dein Code von dem
veröffentlichten abweicht.
Hinweis: Es ist immer eine gute Idee, wenn man Code erst mal so
übernimmt, wie er veröffentlicht wird. Das mag vielleicht nicht genau
das sein, was dir vorschwebt, aber man kann erst mal testen, ob das
Prinzip überhaupt funktioniert. Abspecken und die Teile, die man nicht
braucht rauswerfen kann man immer noch.
Aber man erspart sich die Peinlichkeit, Code als nicht funktionsfähig zu
bezeichnen, während das eigentliche Problem in den modifizierten Teilen
steckt, die man selbst verbockt hat.