Wie kann ich in Assembler eine If-Abfrage realisieren?
loop:
inc R16 ;Register r16 inkrementieren
; if-Abfrage - IF R16 != 20 jmp loop, ELSE jmp end.
jmp loop
end:
wie kann ich die Abfrage realisieren?
Wenn ich deinen Code richtig verstehe dann muss es so ausschaun. Für
eine abfrage ob R16 größer oder kleiner ist
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Vergleiche
loop:
inc r16 ;Register 16 inkrementieren
cpi r16, 20 ;Vergleiche ob Register 16 20 ist
breq loop ;Wenn ja springe zu loop
rjmp end ;Wenn nein springe zu end
end:
start:
mov dx,g1
mov ah,93h ;If-Abfrage starten
int 021h
mov ah, 01h ;Hauptwertevergleich
int 021h ;Else-Kommando
cmp al, '5'
jmp start
Versuch mal Dein Glück.
Daniel Münzi schrieb:> loop:>> inc r16 ;Register 16 inkrementieren>> cpi r16, 20 ;Vergleiche ob Register 16 20 ist> breq loop ;Wenn ja springe zu loop> rjmp end ;Wenn nein springe zu end>> end:
klappt leider nicht, es ist irgendwie falsch herum, wenn Wert != 20,
dann springt er aus der Schleife raus :-(
Tamtamgeppi schrieb:> Daniel Münzi schrieb:>> loop:>>>> inc r16 ;Register 16 inkrementieren>>>> cpi r16, 20 ;Vergleiche ob Register 16 20 ist>> breq loop ;Wenn ja springe zu loop>> rjmp end ;Wenn nein springe zu end>>>> end:>> klappt leider nicht, es ist irgendwie falsch herum, wenn Wert != 20,> dann springt er aus der Schleife raus :-(
Logisch, du brauchst brne = break if not equal.
include "m88def.inc" ; bzw. 2333def.inc
ldi R16, 14
loop:
inc r16
cpi r16,20
brne loop
Das Programm macht folgendes beim Debuggen - wenn der Wert 16 erreicht
wurde, wird das Programm ncht beendet, sondern es fängt wieder oben an
und setzt R16 auf den Wert 14. Warum hört das Programm nicht auf, wenn
es fertig ist?
Weil ein Prozessor nicht einfach aufhört.
Wenn er den letzten Befehl im Speicher erreicht hat, fängt er einfach
wieder von oben an.
Wenn er also nicht weiterlaufen soll, dann muß du dir am ende eine
Endlosschleife schreiben.
der speicher nach loop ist voll mit 0xFF die als Opcodes interpretiert
werden. 0xFF ergibt als befehl NOP = no operation.
also:
0x0000 loop: ldi R16, 14
0x0001 inc r16
0x0002 cpi r16,20
0x0003 brne loop
0x0004 NOP
0x0005 NOP
0x0006 NOP
...
0x?FFF NOP
bis speicher ende dann gibs nen Überlauf im Program Counter (PC) und der
springt wieder auf adresse 0x0000, und dann gehts wieder los.
halte ihn danach in einer endlosschleife fest wenn du willst :
include "m88def.inc" ; bzw. 2333def.inc
ldi R16, 14
loop:
inc r16
cpi r16,20
brne loop
loop2:
jmp loop2
Ich schrieb:> Gehe lieber raus in die Sonne eventuell kannst du das.Ich schrieb:> Bist ein kleine deppchen oder????
Hast Du Lust, mit mir zusammen raus in die Sonne zu gehen? Dann können
wir uns zusammen vor den Laptop kuscheln und gemeinsam das Programm
schreiben.
Tamtamgeppi schrieb:> Ich schrieb:>> Gehe lieber raus in die Sonne eventuell kannst du das.>> Ich schrieb:>> Bist ein kleine deppchen oder????>> Hast Du Lust, mit mir zusammen raus in die Sonne zu gehen? Dann können> wir uns zusammen vor den Laptop kuscheln und gemeinsam das Programm> schreiben.
ja gerne, wann und wo?
Simon schrieb:> Warum ist dekrementieren sinnvoller als inkrementieren? (wurde oben mal> erwähnt)
(Ohne Garantie) Weil dec automatisch(!) == 0 prüft und die
entsprechenden Flags im SREG setzt, spart eine Anweisung.
Hi
>Warum ist dekrementieren sinnvoller als inkrementieren? (wurde oben mal>erwähnt)
Weil du dir den Vergleich ersparst. Das Z-Flag wird durch 'inc'
automatisch gesetzt wenn die Bedingung erfüllt ist.
MfG Spess
OWLMinden schrieb:> Was ist ein Flag?
Siehe Statusflag oder auch Statusregister.
Jeder Prozessor hat Statusflags die bestimmte Zustände anzeigen, und
durch vorangegangene Operationen (Assemblerbefehle) gesetzt werden.
Dazu gehört das Zero Flag, Carry, ... Die werden entsprechend gesetzt,
wenn z.B. bei einer Multiplikation, Addition, Vergleich etc. 0
herauskommt, oder ein Übertrag, etc. pp.
Das sind absolute Grundlagen, du solltest das Tutorial durcharbeiten.
Hi
>gibts den Kram auch auf Deutsch?
Nicht das ich wüsste. Da wirst du dein Englisch wohl etwas auffrischen
müssen. Chinesisch wäre unangenehmer.
MfG Spess
ohne englisch braucht man heute gar nicht mehr mit Mikrocontrollern bzw.
Elektronik anzufangen.
Tutorials gibs auch auf Deutsch, aber du mußt immer und von jedem
Bauteil die Datasheets Lesen und verstehen.
Und zwar lese ich z.B. Datasheets und Appnotes und Erratas BEVOR ich nen
Bauteil aussuche. Bei Mikroscontrollern,PLDs,FPGAs, und ASICS sollte man
den Datasheet sogar KOMPLETT lesen und verstehen so meißtens 50-800
Seiten ( man muß sich ja nicht alles merken), wie will man sonst das
Richtige Bauteil aussuchen (oder das am besten den Ansprüchen genügt).
Datasheets lesen ist technisches englisch das verstehen auch Engländer
oder Amerikaner nicht (außer Sie sind Techniker).
Oder was is ne "Gated Clock" ne "Getorte Uhr" oder was ?
Oder was ist "Hold Time" and "Setup Time" usw.
Datasheets lesen,lesen,lesen, im Forum Fragen, Wikipedia Belästigen,
Elektronik Bücher lesen ( die gibst auch auf Deutsch), und nebenher
Datasheets lesen und Verstehen. Dann kann man Projekte starten und hat
trotzdem noch ne menge zu lernen.