Forum: Mikrocontroller und Digitale Elektronik Erklärbedarf Assembler


von Till X. (till_n)


Lesenswert?

Hallo,
ich verstehe den Assembler Code hier nicht. Komme leider von der C 
Richtung und wollte nun mal etwas tiefer in die Materie einsteigen.

Problem macht mir konkret der Befehl brne nach den zwei compares.
Für das Null flag im sreg ist doch der erste compare völlig unerheblich, 
oder? Warum ist der dann trozdem da. Fragen über Fragen...
1
reset:    clr  r0
2
    out  SREG, r0    ; Clear interrupts and flags
3
4
  ; Set up stack
5
    ldi2  ZL, ZH, RAMEND
6
    out  SPH, ZH
7
    out  SPL, ZL
8
  ; Clear RAM and all registers
9
clear_loop:  st  -Z, r0
10
    cpi  ZL, SRAM_START
11
    cpc  ZH, r0
12
    brne  clear_loop1
13
    ldi  ZL, 30      ; Start clearing registers
14
clear_loop1:  cp  ZL, r0
15
    cpc  ZH, r0
16
    brne  clear_loop    ; Leaves with all registers (r0 through ZH) at 0

: Bearbeitet durch User
von Hansi (Gast)


Lesenswert?

>Fragen über Fragen...
Ist das Assemblercode für den Cortex™-A9?

von Ulrich (Gast)


Lesenswert?

Der 1. Compare Befehl beeinflusst das Carry Flag. der CPC Befehl 
berücksichtigt das Carry-flag beim Vergleich. Damit hat man einen 
Vergleich von zwei  16 Bit Zahlen.

von spess53 (Gast)


Lesenswert?

HI

>Für das Null flag im sreg ist doch der erste compare völlig unerheblich,
>oder? Warum ist der dann trozdem da. Fragen über Fragen...

Dann sieh dir mal den Unterschied zwischen cpi und cpc an.

http://www.atmel.com/images/doc0856.pdf

MfG Spess

von Till X. (till_n)


Lesenswert?

Danke. Das hat mir geholfen.

von Till X. (till_n)


Lesenswert?

Moment mal:

Was passiert wenn ZL zb 0xFF und ZH 0x00  (angenommen SRAM_START is 
0x30)
Dann bricht er doch genau bei dem Sprung von Z = 0x0100 auf 0x00FF die 
Schleife ab?

von Ulrich (Gast)


Lesenswert?

Die Abfrage des Zero Flags gibt tatsächlich keinen echten Test auf 
Gleichheit. Es wird nur das high Byte Verglichen, und ggf. ein Überlauf 
von davor berücksichtigt. Nach CPI  + CPC sind eigentlich nur das Carry 
Flag und negative Falg wirklich aussagekräftig.

Es stimmt: bei 0x00FF ist Schluss.

von Tassilo H. (tassilo_h)


Lesenswert?

Stimmt nicht (jedenfalls für AVR-Assembler, wonach der Code aussieht). 
CPC löscht das Zero-Flag nur (wenn das Vergleichsergebis ungleich Null), 
aber setzt es nie. Wenn also CPI Ungleichheit ergibt, ändert CPC nix 
daran.

von Till X. (till_n)


Lesenswert?

"Z: Previous value remains unchanged when the result is zero; cleared 
otherwise."

bei der Erklärung von CPC.

Wie so ein kleiner Satz alles verändern kann...
Recht hast du Tassilo

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.