FB18 - Das Forum für Informatik

fb18.de / Bachelorstudieng / PM Technische Informatik

Sparc: 64bit-Größe modulo m

Sparc: 64bit-Größe modulo m 2007-01-13 18:37
Hannes
Hallo,

anscheinend bin ich nicht der einzige der mit den aktuellen RS-Aufgaben seine Probleme hat ;)

Meins ist von folgender Natur:

ich multipliziere zwei 32-bit-Zahlen. Die 32 höherwertigen bit des Produkts werden im Register %y gespeichert, die restlichen in einem Zielregister %l1. Dieses Produkt, aufgeteilt auf zwei Register, möchte ich nun modulo 10^9 rechnen. Als Weg habe ich mir
[img]http://mokrates.de/cgi-bin/texstring?a%20mod%20m%20%3D%20a%20-%20(%5Clfloor%20%5Cfrac%7Ba%7D%7Bm%7D%20%5Crfloor%20%5Ccdot%20m)[/img]
vorgestellt. Also dividiere ich %l1 durch 10^9 (dabei wird das %y-Register miteinbezogen) und multipliziere dann wieder mit 10^9. Da es Ganzzahlen sind, werden die Zahlen rechts "hinausgeschoben", es wird also automatisch abgerundet. Habe ich soweit richtig gedacht?

Lange Rede kurzer Sinn: Ich habe das jetzt zweimal gemacht, habe also a (64 Bit groß, in zwei Register aufgeteilt) und einmal a/m * m (auch 64 bit und in 2 Registern). Wie kann ich jetzt die eine 64-bit-Zahl von der anderen abziehen?

Re: Sparc: 64bit-Größe modulo m 2007-01-13 18:49
Anonymer User
Du kannst froh sein, mehr verstanden als ich hast du schon mal.

Du hast nicht zufällig Zeit mir deine Lösungen zu erklären?

Re: Sparc: 64bit-Größe modulo m 2007-01-13 18:53
UncleOwen
ich multipliziere zwei 32-bit-Zahlen. Die 32 höherwertigen bit des Produkts werden im Register %y gespeichert, die restlichen in einem Zielregister %l1. Dieses Produkt, aufgeteilt auf zwei Register, möchte ich nun modulo 10^9 rechnen. Als Weg habe ich mir
[img]http://mokrates.de/cgi-bin/texstring?a%20mod%20m%20%3D%20a%20-%20(%5Clfloor%20%5Cfrac%7Ba%7D%7Bm%7D%20%5Crfloor%20%5Ccdot%20m)[/img]
vorgestellt. Also dividiere ich %l1 durch 10^9 (dabei wird das %y-Register miteinbezogen) und multipliziere dann wieder mit 10^9. Da es Ganzzahlen sind, werden die Zahlen rechts "hinausgeschoben", es wird also automatisch abgerundet. Habe ich soweit richtig gedacht?
Ohne jetzt Ahnung von Sparc-Assembler zu haben: Klingt sinnvoll.

Lange Rede kurzer Sinn: Ich habe das jetzt zweimal gemacht, habe also a (64 Bit groß, in zwei Register aufgeteilt) und einmal a/m * m (auch 64 bit und in 2 Registern). Wie kann ich jetzt die eine 64-bit-Zahl von der anderen abziehen?
Subtrahier jeweils die oberen und unteren 32bit getrennt voneinander. Dabei tritt entweder ein Uebertrag auf, oder nicht. Wenn nein, bist Du fertig, wenn ja, musst Du den noch korrigieren.

Re: Sparc: 64bit-Größe modulo m 2007-01-13 18:57
TriPhoenix
Eine 64-Bit-Subtraktion kannst du durch zwei 32-Bit-Subtraktionen vollziehen. Dabei subtrahierst du erst die beiden unteren 32 Bit, dann die oberen 32 Bit. Gab es bei der Subtraktion im unteren bereich einen Unterlauf, so musst du von den oberen 32 Bit noch einen zusätzlich abziehen. Der Unterlauf wird dir durch die Condition codes mit angezeigt

Re: Sparc: 64bit-Größe modulo m 2007-01-13 19:50
Hannes
danke euch, das leuchtet ein. die überprüfung auf unterlauf kann ich mir glaube ich sparen, denn zahlen mod 10^9 sind ja < 10^9 und passen somit in ein 32-bit-Register. Oder ist das falsch?

Re: Sparc: 64bit-Größe modulo m 2007-01-13 20:01
UncleOwen
Ne, da denkst Du falsch.

Re: Sparc: 64bit-Größe modulo m 2007-01-13 20:28
Fred
Die untere Subtraktion machst Du mit subcc (das setzt die Condition Codes, also u.a. das Carry Flag), die obere anschliessend mit subx (damit wird das Carry Flag bei der Subtraktion berücksichtigt).

Re: Sparc: 64bit-Größe modulo m 2007-01-13 20:28
Hannes
meinst du wirklich? ich schmeiße die höherwertigen bits ja eh weg. immerhin komme ich so auf die richtigen ergebnisse (ja, ich habs wirklich von hand nachgerechnet ;)).


Re: Sparc: 64bit-Größe modulo m 2007-01-13 20:30
Fred
Ach so, na wenn Dich nur die unteren 32 Bits interessieren ist es natürlich wurscht, was Du mit den oberen machst. Die beeinflussen das Ergebnis dann ja nicht mehr.