Seite 2 von 2

Re: Parserschwäche

Verfasst: 16.05.2011 18:10
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

Re: Parserschwäche

Verfasst: 16.05.2011 19:02
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.

Re: Parserschwäche

Verfasst: 16.05.2011 21:08
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.

Re: Parserschwäche

Verfasst: 17.05.2011 00:32
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.