Forum: Compiler & IDEs Verständnis-Problem bei Recode von C zu ASM


von M. P. (phpmysqlfreak)


Lesenswert?

Hallo Forum-Gemeinde,

Ich Arbeite zur Zeit daran, verschieden C-Projekte für Atmel-Controller 
(vorzugsweise ATTiny2313 und ATMega8) in Assembler umzuschreiben.

Darin sehe ich eigentlich auch keine weiteren Probleme.

Doch nun ist mir eine Verknüpfung in einer If-Bedingung aufgefallen, die 
ich
nicht richtig deuten kann.

Es geht um folgende Elemente

& => Logische Und-Verknüpfung.
~ => Negation (wenn ich richtig informiert bin.)

in der folgenden Verknüpfung:
1
if (USIDR == 0 || (USIDR & ~1) == slaveAddress)

slaveAddress ist uint8_t

der Kommentar hinter der Verknüpfung ist:
1
// If adress is either 0 or own address

Wie kann ich diese Verknüpfung korrekt deuten, wenn "slaveAddress" z. B. 
den binären Wert "0b01101001" (Dez.: 105) enthält?

Gruß,

Marcel

von Karl H. (kbuchegg)


Lesenswert?

So wie es auch der Compiler macht.
Ich denke dir fehlt die Precedence Table, in der geregelt ist, wie die 
Priorität der Operatoren sein muss

http://www.difranco.net/cop2220/op-prec.htm


> & => Logische Und-Verknüpfung.

falsch.
Binäre Und-Verknüpfung

> ~ => Negation (wenn ich richtig informiert bin.)

ja. und zwar binäre Negation

von Floh (Gast)


Lesenswert?

Marcel Papst schrieb:
> Wie kann ich diese Verknüpfung korrekt deuten, wenn "slaveAddress" z. B.
> den binären Wert "0b01101001" (Dez.: 105) enthält?

Slaveadresse muss hier mit 0 enden, da beim Überprüfen das 0te Bit 
ausgeundet wird, ist bei i2c für Read/Write verantwortlich, hat also mit 
der Adresse an sich nix zu tun.

Marcel Papst schrieb:
> (USIDR & ~1) == slaveAddress

als Bsp: USIDR = 0b00110101
mit ~1 = 0b11111110 verundet wird das 0te Bit gelöscht. Daher darf die 
Vergleichsadresse nie das 0te Bit gesetzt haben, sonst wird die Abfrage 
nicht wahr.
:-)

von M. P. (phpmysqlfreak)


Lesenswert?

Karl heinz Buchegger schrieb:
>> & => Logische Und-Verknüpfung.
>
> falsch.
> Binäre Und-Verknüpfung


Sorry, das war mein Fehler - meinte eigentlich auch binäre Verknüpfung.

> Slaveadresse muss hier mit 0 enden, da beim Überprüfen das 0te Bit
> ausgeundet wird, ist bei i2c für Read/Write verantwortlich, hat also mit
> der Adresse an sich nix zu tun.
>


> als Bsp: USIDR = 0b00110101
> mit ~1 = 0b11111110 verundet wird das 0te Bit gelöscht. Daher darf die
> Vergleichsadresse nie das 0te Bit gesetzt haben, sonst wird die Abfrage
> nicht wahr.
> :-)



Alles Klar, vielen Dank für schnellen und ausführlichen Antworten.

Jetzt kann ich weiter machen ;)

Gruß,

Marcel

von Peter D. (peda)


Lesenswert?

Marcel Papst schrieb:
> Ich Arbeite zur Zeit daran, verschieden C-Projekte ...
> ... in Assembler umzuschreiben.

Das ist aber die falsche Richtung :-)


Peter

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.