Code unverständlich

#4845768
Lesenswert?

Sepp schrieb:
> MOV R1, #(2*3 + 4 - 0xFF<<3)

Sieht nach einem Move-Befehl aus. Damit schreibt man etwas von hier nach 
da. Genau genommen nach da von hier. So, wie man es von links nach 
rechts liest.

"Da", also Destination ist R1.
"Hier", Source, ist der Zahlenwert in der Klammer, der von dem werten 
Assembler ausgerechnet werden muß. Dieser wird dann Immidiate(#) nach R1 
geschrieben.

2*3+4-2040 = -2030 = FFFFF812

In R1 steht dann FFFFF812. Sofern es da reinpasst. Was nicht passt, wird 
vorne abgeschnitten.

Sepp schrieb:
> nur dass nicht was das bewirkt 0xFF<<3

Das bewirkt, daß 0xFF um 3 Byte nach rechts geschoben wird. Was 
gleichbedeutend mit einer Multiplikation mit 8 ist.
#4845772
Lesenswert?

Rolf M. schrieb:
> Für mich, der die Syntax des Assemblers deines geheimen Prozessors
> nur erraten kann, sieht die ganze Zeile irgendwie unsinnig aus.

Er selbst kann auch nur raten, wie man hier lesen kann:

Sepp schrieb:
> Kann da leider nicht mehr dazu sagen :/ Steht so im Skript... Versteh
> nur dass nicht was das bewirkt 0xFF<<3

Es ist wahrscheinlich scheißegal, was das für ein Prozessor ist, weil 
man von ihm nr wissen will, was letzten Endes in dem Register "M1" 
steht, nachdem diese blödsinnige, "C"-artige Schieberei und die weitere 
Rechnerei gelaufen ist.

Paul
(Firma: Nisch-Aufzüge) Persönliche Seite #4845818
Lesenswert?

der assemblerbefehl schreibt das Rrgebnis des eingeklammerten Terms in 
das register r1


und so geht es

1
2*3+4-0xff<<3 = 0d10 - 0b 00000000 00000111 11111111 11111000
2

3
 0b (1)00000000 00000000 00000000 00001010
4
-0b    00000000 00000111 11111111 11111000
5
-------------------------------------------
6
 0b    11111111 11111111 11111000 00011100 = 0xFF FF F8 1C

Namaste
#4846161
Lesenswert?

Als kleine Hilfe will ich doch mal darauf hinweisen, dass es beim 
Rechnen nicht selten Vorrangregeln gibt, sowas wie Punkt-vor-Strich. 
Nicht jedem sind alle diese Regeln geläufig, erst recht nicht die 
irgendwelcher Assembler. Und üblicherweise spielt eine optische 
Gruppierung über Leerzeichen für Menschen eine grössere Rolle als für 
Maschinen.
(Firma: Nisch-Aufzüge) Persönliche Seite #4846217
Lesenswert?

Stefan E. schrieb:

> Worauf Slippin damit hinweisen wollte ist, dass du 0xffff<<3 gemacht
> hast, nicht 0xff<<3.

ei was ein miFFFFt!

Man sollte nach einem stressigen Tag halt nicht mit gemischten 
Zahlensystemen rechnen wollen.

Das ist eh so eine Unsitte und wie AK schon schrieb eine Codezeile in 
der unklare Abarbeitungsregeln herrschen ist auch nicht das Wahre,
vor allem ist ja da noch die Frage ist schieben gleichrangig mit 
multiplizieren. Wenn schon alles in eine Zeile dann sollte man mit 
Klammern dort für Klarheit sorgen.
...
Zumal klassischer ASM gar keine C-Terme zulässt und dort schon über die 
Syntax mault.

Das scheint mir auch so eine Unsitte, Progammiersprache als lebende 
eierlegende Wollmilchsau ohne klare Regeln und mit einer Vielzahl an 
Lehen aus anderen Sprachdialekten, was bei Swift zu ständigen 
Syntaxänderungen aus Bequemlichkeit führt. Basic hatte für seine 
Möglichkeit  für unklare Programmstrukturen Spaghetticode und Nestys  zu 
recht einen Schlechten Ruf.

"moderne Sprachen" schaffen das schon in der Syntax durch beliebigkeit 
der selben.

Frei nach dem Motto:

Schreib doch was du willst in die Source, ich kompiliere es wie ich 
will.
wen du Glück hast korreliert das Compilat mit deiner Erwartung an das 
selbe.

Namaste
Persönliche Seite #4849899
Lesenswert?

Johann L. schrieb:
> Hängt davon ab, wer oder was diese Zeile verarbeitet.

(4*3) + 4 - (0xff<<3)

(((4*3) + 4) - 0xff) << 3

Und es fehlen die Varianten mit Überläufen und impliziten 
Typkonvertierungen. Es ist auch nicht gesagt, ob << ein arithmetisches 
oder binäres Shift ist, bzw. ob da unterschieden werden soll resp. 
unterschieden werden kann. 's braucht mehr inpuuht

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