Modulo mit Quads?

Anfängerfragen zum Programmieren mit PureBasic.
Little John

Modulo mit Quads?

Beitrag von Little John »

Hallo zusammen,

funktioniert der Modulo-Operator % eigentlich auch mit Quads zuverlässig, oder nur mit Long- bzw. Integer-Zahlen?

Die Frage klingt vielleicht komisch, aber nachdem ich im Laufe der Zeit feststellen musste dass PB lauter "Ecken und Kanten" bzw. Bugs hat, die erst auf den 2. oder 3. Blick sichtbar werden (siehe beispielsweise hier), möchte ich nicht einfach auf die Zuverlässigkeit vertrauen. Meine ersten Tests sind positiv verlaufen, aber es würde mich freuen zu lesen welche Erfahrungen ihr damit gemacht habt.

Gruß, Little John
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Ich hatte noch keine Probleme...
(\/) (°,,,°) (\/)
Little John

Beitrag von Little John »

KeyKon hat geschrieben:Ich hatte noch keine Probleme...
Das klingt ja schon mal ganz ermutigend. :-)
Danke!

Gruß, Little John
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Bevor keiner was schreibt^^
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

meines wissens ist die Modulo direkt dieselbe CPU funktion wie Division,
nur ein anderes Register wird zurück gegeben.
Nach dem ASM-Commando DIV wird der Quotient in einem Register
gespeichert und der Rest in einem Anderen.
je nachdem ob du / oder % verwendest, setzt PB einen der beiden
Registerwerte ein.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Nee, KG, so einfach geht das nicht. DIV sowieso nicht (ist unsigned), wenn dann schon IDIV (signed). Der Rest einer Integer-Division steht dann im EDX-Register, soweit schon richtig, aber was, wenn dies (eben Modulo) größer als 32-Bit ist? Es wird dann eine Exception ausgelöst (divide error, muss aber selbst ausgewertet werden), ist für Quad-Modulo somit nicht so richtig brauchbar. Die Quad-Modulo-Procedure von PB ist ein aufwändiges Gebilde; mit einem gewissen simplen Dis-Assembler ( :wink: ) sehr schön anschaubar. Und ob sie fehlerfrei ist: Im Zweifel für den Angeklagten. In den letzten Versionen hatte ich keine Probleme.

Gruß
Helle
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

aha... gut zu wissen. thnx.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Little John

Beitrag von Little John »

Hallo,

ich habe mir mal aus Spaß angekuckt, was
pbcompiler test.pb /COMMENTED
liefert.

Für Modulo mit Integern (32 Bit):

Code: Alles auswählen

; m.i = a.i % b.i
MOV    ebx,dword [v_a]
MOV    eax,ebx
CDQ
IDIV   dword [v_b]
MOV    ebx,edx
MOV    dword [v_m],ebx
Für Modulo mit Quads:

Code: Alles auswählen

extrn Mod64

; m.q = a.q % b.q
PUSH   dword [v_a+4]
PUSH   dword [v_a]
LEA    eax,[v_b]
PUSH   dword [eax+4]
PUSH   dword [eax]
PUSH   dword [esp+12]
PUSH   dword [esp+12]
CALL   Mod64
MOV    [esp],eax
MOV    [esp+4],edx
POP    dword [v_m]
POP    dword [v_m+4]
Danke für Eure Antworten!

Gruß, Little John
Antworten