Parserschwäche

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Parserschwäche

Beitrag von cxAlex »

Ich hab den Code noch etwas weiter vereinfacht, aber so das der Fehler noch auftritt:

Code: Alles auswählen

Global a = 0
Global b = 1
Global c = 10
Global x

x = 0 + b * ( c / 360000 + c % 100 )
Debug x

x = a + b * ( c / 360000 + c % 100)
Debug x
Danach habe ich mir den Assembler-Code etwas genauer angesehen:

Funktionierender Code:

Code: Alles auswählen

mov r15, [rip+0x528f8]
mov r14, [rip+0x528f9]
mov rax, r14
mov rcx, 0x57e40
cqo 
idiv rcx
mov r14, rax
mov r13, [rip+0x528e0]
mov rax, r13
mov r13, 0x64
cqo 
idiv r13
mov r13, rdx
add r14, r13
imul r15, r14
mov [rip+0x528c8], r15
Fehlerhafter Code:

Code: Alles auswählen

mov r15, [rip+0x528e0]
mov r14, [rip+0x528e1]
mov r13, [rip+0x528e2]
mov rax, r13
mov rcx, 0x57e40
cqo 
idiv rcx
mov r13, rax
mov rax, [rip+0x528c9]
mov rax, rax
mov rax, 0x64
cqo 
idiv rax
mov rax, rdx
add r13, rax
imul r14, r13
add r15, r14
mov [rip+0x528ae], r15
Wobei die interessante Stelle im fehlerhaften Code wohl diese ist:

Code: Alles auswählen

mov rax, [rip+0x528c9]
mov rax, rax
mov rax, 0x64
Hier wird einfach 3 mal hintereinander verschiedene Werte in das rax-Register geschrieben (unter x86 eax) ohne damit etwas zu berechnen, einmal wird in rax einfach nochmal rax geschrieben (mov rax, rax). Ich denke das ist die Stelle an der der Fehler geschieht.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Parserschwäche

Beitrag von ts-soft »

Der Fehler sind die Fließkomma-Zwischen-Ergebnisse der Division, weil "Integer Mod" % damit nicht umgehen kann.
Mod() für Float behebt den Fehler.

Der Debugger sollte also eine Fehlermeldung ausgeben, wenn PB das schon nicht autom. Casten kann.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Parserschwäche

Beitrag von Frabbing »

Mich wundert, dass das alles überhaupt läuft unter 64 Bit.

Code: Alles auswählen

mov r15, [rip+0x528e0]
mov r14, [rip+0x528e1]
mov r13, [rip+0x528e2]
Hier werden wohl Bytes (Adressen liegen jeweils 1 Byte auseinander) in Quad-Register kopiert. Das ist in der Form normalerweise nicht zulässig, zumindest aber fehleranfällig. Allerdings aus Sicht des JWasm / Masm64. Mit dem FASM kenne ich mich jetzt allerdings nicht so aus.
Gruß, Frank
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Parserschwäche

Beitrag von Regenduft »

ts-soft hat geschrieben:Hoffentlich merkt niemand, das falsch falsch geschrieben ist :lol:
Warum liegen denn hier überall die ganzen Schläuche rum? :?

BTW: Dafür, dass ich nur sehr wenig Plan vom Programmieren habe laufen mir relativ häufig Bugs über den Weg. :lol:
ts-soft hat geschrieben:Der Fehler sind die Fließkomma-Zwischen-Ergebnisse der Division, weil "Integer Mod" % damit nicht umgehen kann.
Mod() für Float behebt den Fehler.
Wo gibt es denn ein Fließkomma-Zwischenergebnis bei Integer-Mod und Integer-Division mit Integer-Variablen? (Überall! Wo man auch hintritt! Nur Schläuche hier!)
Soll das heißen, dass bei einer Integer-Division die Werte in Floats (od. Doubles) gewandelt werden und dann "%" fehlschlägt, da es eben nur für Integer geeingnet ist? Ich dachte immer die (Zwischen-)Ergebnisse von Integerdivisionen werden einfach abgerundet, bleiben aber Integer, was dann auch zu akkumulativen Rundungsfehlern führt. Wenn das nicht so wäre würde man ja bei Integerrechnungen mit sehr großen Werten bei Divisionen sehr böse Rundungsfehler erhalten... (Räum' doch einer mal die Schläuche weg!)

Ich habe bisher nur ganz primitive µC-Assembler-Sachen gemacht (nie Praxisnahe) und habe von FASM keinen Plan, darum sagt mir das Deassemblat (meine Wortschöpfung :wink:) kaum etwas.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten