Forum: Mikrocontroller und Digitale Elektronik Was bedeutet diese Assembler Anweisung beim R32C?


von Olli Z. (z80freak)


Lesenswert?

Ich habe eine Verständnisfrage zu einem Assembler-Befehl aus dem R32C 
Befehlssatz. Der Code lautet:
1
MOV.L   #-1, dword_47228

Die Bytefolge davon ist:
1
FE EB 28 72 04

MOV.L bedeutet ja eine Schreiboperation mit einem Long-Word. Die Syntax 
ist immer Quelle, Ziel. In diesem Fall ist die Quelle ein 
Immediate-Value, erkennbar am "#" mit dem Wert "-1", das Ziel die durch 
"dword_47228" adressierte Speicherstelle 0x47228.

Es wird also wohl der Wert -1 in Form eines 4-Byte Wertes and diese 
Speicherstelle geschrieben.

Es gibt eine große Anzahl von Adressierungsarten beim MOV-Befehl. Über 
den Hex-Code der Anweisung FE EB (0b11111110 11101011) meine ich die 
Variante "MOV.size:Q #IMM:4,dest" vorliegen zu haben (R32C Software 
Manual, Page 259).

Ein #IMM:4 ist dann demnach ein 4-Bit Wert welcher im obigen Fall 0b1111 
ist. "dest" hat in der Anweisung den Wert 0b01011 was damit dsp:24 
bedeutet. Die Adresse folgt dann mit 3 Bytes (=24 Bits) im Little-Endian 
Stil: 28 72 04 = 047228.

Was bedeutet aber #-1 als Wert im Endeffekt? Was würde an der 
angegebenen Speicheradresse stehen? Wäre das ein vorzeichenbehafteter 
Integer int32, wäre -1 doch 0b10000000 00000000 00000000 00000001?

von (prx) A. K. (prx)


Lesenswert?

Olli Z. schrieb:
> wäre -1 doch 0b10000000 00000000 00000000 00000001?

Du suchst das https://de.wikipedia.org/wiki/Zweierkomplement

: Bearbeitet durch User
von Olli Z. (z80freak)


Lesenswert?

(prx) A. K. schrieb:
>> wäre -1 doch 0b10000000 00000000 00000000 00000001?
> Du suchst das https://de.wikipedia.org/wiki/Zweierkomplement

Das hatte ich bereits vor dem Post gelesen, aber scheinbar nicht ganz 
verstanden. Ok, also wäre das dann: 
0b00000000_00000000_00000000_00001111
?

von Mario M. (thelonging)


Lesenswert?

Immer noch falsch. Minus 1 als 32-Bit-Zahl im Zweierkomplement ist 
2^32-1. Also alle Bits sind 1.

von Sebastian W. (wangnick)


Lesenswert?

Olli Z. schrieb:
> Ein #IMM:4 ist dann demnach ein 4-Bit Wert welcher im obigen Fall 0b1111
> ist

Genau. Und diese -1 als vorzeichenbehafteter 4-Bit-Wert 0b1111 wird bei 
der Ausführung der Anweisung vorzeichenbehaftet auf 32-Bit erweitert, 
und wird dabei zu 0b11111111111111111111111111111111, bleibt also eine 
-1.

LG, Sebastian

: Bearbeitet durch User
von Olli Z. (z80freak)


Lesenswert?

Mario M. schrieb:
> Immer noch falsch. Minus 1 als 32-Bit-Zahl im Zweierkomplement ist
> 2^32-1. Also alle Bits sind 1.

Wenn ich die Formel auf der Wikipedia-Seite richtig lese müsste es eher 
so heissen: -2^(n-1)

Aber im Kern hast Du recht und ich es jetzt verstanden. Diese Anweisung 
ist dann vermutlich einfach kürzer und damit schneller als ein Register 
mit dem 32-Bit Wert 0xFFFF_FFFF zu laden (z.B. R2R0) und diesen Wert 
dann an eine Speicherstelle zu schreiben. Eine direkte Operation "32-Bit 
Wert zu Speicherstelle" gibt es scheinbar nicht.

von (prx) A. K. (prx)


Lesenswert?

Olli Z. schrieb:
> Eine direkte Operation "32-Bit
> Wert zu Speicherstelle" gibt es scheinbar nicht.

Doch, gibt es. Nur wird ein guter Assembler von sich aus die kürzeste 
Form codieren, wenn man ihn lässt.

Dein MOV.L ist effektiv MOV.L:Q. Schau mal bei MOV.L:G vorbei. 
Allerdings gibt es dann wahrscheinlich von sich aus die 8-Bit IMMEX 
Codierung. Ob man das explizit als #-1:32 schreiben kann, weiss ich 
nicht.

: Bearbeitet durch User
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.