Was bedeutet diese Assembler Anweisung beim R32C?

#7594931
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?

#7595409
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.

#7595421
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren