Forum: Mikrocontroller und Digitale Elektronik if-clause in Assembler


von Tamtamgeppi (Gast)


Lesenswert?

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?

: Gesperrt durch User
von Lukas K. (carrotindustries)


Lesenswert?

Ich rate mal AVR asm.

Du suchst sowas wie CPSE 'Compare, Skip if Equal'
Näheres dazu in der 'Instruction Set Summary' im Datenblatt des µCs.

von Max P. (eizo)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung

Steht alles ausführlich im AVR Tutorial auf dieser Seite.

von spess53 (Gast)


Lesenswert?

Hi

>inc R16 ;Register r16 inkrementieren

Wenn du den Wert in r16 nicht noch für etwas anderes brauchst, ist es 
sinnvoller rückwärts zu zählen:
1
     ldi r16,20
2
3
aaa: ...
4
     dec r16
5
     brne aaa

MfG Spess

von Uwe (Gast)


Lesenswert?


von Daniel (erfolgstyp)


Lesenswert?

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:

von Uwe (Gast)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

he , der letzte beitrag ist nicht von mir.

von Axel (Gast)


Lesenswert?

Das von daniel münzli ist fast richtig nur dir sprungbefehle für loop 
und end noch vertauschen!

von Tamtamgeppi (Gast)


Lesenswert?

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 :-(

von spess53 (Gast)


Lesenswert?

Hi

>breq loop     -> brne loop

MfG Spess

von name (Gast)


Lesenswert?

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.
1
loop:
2
inc r16
3
cpi r16,20
4
brne loop

Das hier
1
rjmp end
2
end:
ist erstmal überflüssig.

von Uwe (Gast)


Lesenswert?

brne = branch if not equal
verzweige wenn nicht gleich

von Tamtamgeppi (Gast)


Lesenswert?

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?

von Ich (Gast)


Lesenswert?

Bist ein kleine deppchen oder????

Wo sagst Du das es aufhören soll???


1
 ldi R16, 14
2
3
4
loop:
5
    inc r16
6
    cpi r16,20
7
    brne loop



Das ans ende und fertig ist der Käse.
1
Ende:
2
    rjmp Ende


Gehe lieber raus in die Sonne eventuell kannst du das.

von Mike R. (thesealion)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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

von Tamtamgeppi (Gast)


Lesenswert?

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.

von Ich (Gast)


Lesenswert?

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?

von Simon (Gast)


Lesenswert?

Warum ist dekrementieren sinnvoller als inkrementieren? (wurde oben mal 
erwähnt)

von name (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von name (Gast)


Lesenswert?

spess53 schrieb:
> durch 'inc'
Du meinst 'dec' oder?

von spess53 (Gast)


Lesenswert?

Hi

>Du meinst 'dec' oder?

In diesem Fall ja. Aber inc macht das auch. Denn nach $FF kommt $00.

MfG Spess

von name (Gast)


Lesenswert?

spess53 schrieb:
>>Du meinst 'dec' oder?
> In diesem Fall ja. Aber inc macht das auch. Denn nach $FF kommt $00.
Ach richtig, so kann man das auch sehen.

von Simon (Gast)


Lesenswert?

Ah, interessant :) Danke!

von OWLMinden (Gast)


Lesenswert?

spess53 schrieb:
> Z-Flag

Was ist ein Flag?

von U.R. Schmitt (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

Bei AVRs nennt sich das SREG.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

>Das sind absolute Grundlagen, du solltest das Tutorial durcharbeiten.

Besser das:

http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf

MfG Spess

von OWLMinden (Gast)


Lesenswert?

spess53 schrieb:
> Besser das:
>
> http://www.atmel.com/dyn/resources/prod_documents/...

gibts den Kram auch auf Deutsch?

von spess53 (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Geschlossen wegen Trollerei unter verschiedenen Nicks...

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.