Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Compiler bug in functions >6 parameters
#9
da fällt mir auf die schnelle keine Lösung ein. Problem ist, dass blitzbasic immer die register hochzählt. schriebt man einen Term werden je nach klammer mehrere Register benötigt. Da es nur 8 gibt, gehen bei komplexen termen mit klammern die Register aus. Dass war schon bei blitz der fall, aber fiel da nicht auf, weil man ja nur 6 Parameter hatte.

Der Term benutzt dann für flen(test) register d7. also das letzte. gibt es denn viele solche aufrufe ?.ansonsten müsste ich suchen, warum es genau mit dem 7. Parameter nicht geht, denn

test\test1+Flen(test)

wenn man den Term umstellt kann man die Meldung umgehen. also das würde gehen
Flen(test)+test\test1

ansonsten den kürzesten und schnellsten code bekommt man, wenn man
temp = Flen(test)+test\test1 vor dem funktioncall macht.

Denn es müssen wenn man den term in dem functioncall macht, 5 Register auf dem stack gespeichert und geladen werden.

Call7{1,2,3,4,5,FLen(a$)+x.l,7,False,8,True} ;
gibt den asm code

move.l #1,d1
MOVE.L #2,D1
MOVE.L #3,D2
MOVE.L #4,D3
MOVE.L #5,D4
; flen(a$) +x
MOVEM.L D0-D4,-(A7)
MOVEA.L -$7FF8(A5),A2
MOVE.L A2,D0
BEQ $43547F38 ;43547F38
MOVEA.L D0,A2
MOVE.L -4(A2),D0
MOVE.L D0,D5
MOVEM.L (A7)+,D0-D4
MOVE.L -$7FF4(A5),D6
ADD.L D6,D5
MOVE.L #7,D6
MOVE.L D6,$43553E68 ;43553E68
MOVEQ #0,D6
MOVE.L D6,$43553E6C ;43553E6C
MOVE.L #8,D6
MOVE.L D6,$43553E70 ;43553E70
MOVEQ #-1,D6
MOVE.L D6,$43553E74 ;43553E74

temp.l =FLen(a$)+x.l
Call7{1,2,3,4,5,temp,7,False,8,True} ; ok

gibt den asm code

temp.=flen(a$)+x
MOVEA.L -$7FF4(A5),A2
MOVE.L A2,D0
BEQ $435A602A ;435A602A
MOVEA.L D0,A2
MOVE.L -4(A2),D0
MOVE.L -$7FF0(A5),D1
ADD.L D1,D0
MOVE.L D0,-$7FF8(A5)
;functioncall
move.l #0,d0
MOVE.L #2,D1
MOVE.L #3,D2
MOVE.L #4,D3
MOVE.L #5,D4
MOVE.L -$7FF8(A5),D5
MOVE.L #7,D6
MOVE.L D6,$435B1F88 ;435B1F88
MOVEQ #0,D6
MOVE.L D6,$435B1F8C ;435B1F8C
MOVE.L #8,D6
MOVE.L D6,$435B1F90 ;435B1F90
MOVEQ #-1,D6
MOVE.L D6,$435B1F94 ;435B1F94

beim 7. Parameter macht der Compiler totalen Mist, der functioncall steht hinter dem register restore und hat ne illegale adresse. dass ist aber halt schon mehr arbeit rauszufinden, was da schief geht. vielleicht tuts die einfache Lösung. immerhin ist der Fehler 10 Jahre unentdeckt geblieben.

MOVEM.L D0-D5,-(A7)
MOVEA.L -$7FF4(A5),A2
MOVE.L A2,D0
BEQ $42DED08C ;42DE
MOVEA.L D0,A2
MOVE.L -4(A2),D0
MOVE.L D0,D6
MOVEM.L (A7)+,D0-D5
JSR $B565C80 ;0B56 <----- der ganze Befehl gehört da garnicht hin und ist überflüssig. wäre der befehl nicht da, würde es richtig laufen
Zitieren


Nachrichten in diesem Thema

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 3 Gast/Gäste