PB rechnet falsch!

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

PB rechnet falsch!

Beitrag von MVXA »

Morgen :)
anscheinend habe ich ein interessanten Bug in PB gefunden oder mein Prozessor weiß langsam nicht mehr wie es Bytecode ausführen soll wobei ich das 2. eher ausschließen kann /:->. Aufjeden fall bin ich grad was an Proggen und wollt dazu was ausrechnen. Nur doof halt das PB irgendwie nicht richtig 23-7 errechnen kann. Ich habe eine Zeile die eigentlich nur mit Rückgaben von Funktionen arbeitet. Wenn ich sie einzeln in eine Zeile schreibe um deren Werte auszugeben funktioniert das herlichst. Da stehen dann 23 und 7. Nur wenn es dann ans ausrechnen kommt, bekomm ich den Wert: 10420290. Ich versuch zum testen irgendwo die Bsp. Libs raufzuladen. Hier ist schonmal der Code. Zu Not kann die Lib selbst mit FASM nach compiliert werden /:->.

Code: Alles auswählen

;/
;/ Offset für Alle Librarys muss so berechnet werden. Urprogramm+Library(+Library) 
;/ wobei sämtliche Funktion aus den Librarys in ihren Offsets mit berückscihtigt werden.
;/ Ein Beispiel:
;/      Library XYZ: Startet am offset 54. 
;/      Dann muss die erste Funktion den Offset 54 haben. 
;/      Die 2. Library hat dann den Offset LibraryXYZ+Funktion1
;/      und so weiter.

Structure sLibrary              ;/ Library Pool aller verfügbaren Librarys
    libAutor.s                  ; Autor der Library
    libName.s                   ; Name der Library
    libStart.l                  ; Startoffset der Library
    libStopp.l                  ; Stoppoffset der Library
    libSize.l                   ; Die größe der Library. NUR DIREKTER BYTECODE
    libLibrary.l                ; Pointer zum LibraryCode
EndStructure

Structure sLibFunktion          ;/ Funktionpool aller Funktionen in den Librarys
    fnkName.s                   ; Name der Funktion
    fnkCall.l                   ; Offset der Funktion
    fnkSize.l                   ; Funktiongröße. Wichtig für das Offset berechnen.
    fnkOwn.l                    ; Zu welcher Lib diese Funktion gehört
EndStructure

Global WorkFile.l
Global DisAsmPtr.l
Global DisAsmPos.l

NewList LibraryPool.sLibrary()
NewList FunctionPool.sLibFunktion()

Procedure ReadLibrary(strLibName.s)
    DefType.l LibHandle, ptrLibrary, ptrOrginal
    DefType.l LibHeadStart, LibHeadStopp
    
    LibHandle = ReadFile(#PB_Any, strLibName)
    If LibHandle <> 0
        ptrLibrary = AllocateMemory(Lof())
        ReadData(ptrLibrary, Lof())
        CloseFile(LibHandle)
        
        If PeekS(ptrLibrary) = "FireBasicLib"
            ptrOrginal = ptrLibrary
            ptrLibrary+(Len(PeekS(ptrLibrary))+1)
            AddElement(LibraryPool())
            LibraryPool()\libName    = PeekS(ptrLibrary): ptrLibrary + (Len(PeekS(ptrLibrary))+1)
            LibraryPool()\libAutor   = PeekS(ptrLibrary): ptrLibrary + (Len(PeekS(ptrLibrary))+1)
            LibraryPool()\libStart   = PeekL(ptrLibrary): ptrLibrary + 4
            LibraryPool()\libStopp   = PeekL(ptrLibrary): ptrLibrary + 4
            LibraryPool()\libSize    = LibraryPool()\libStopp - LibraryPool()\libStart
            LibraryPool()\libLibrary = AllocateMemory(LibraryPool()\libSize)
            CopyMemory(ptrOrginal + LibraryPool()\libStart, LibraryPool()\libLibrary, LibraryPool()\libSize)  
            
            LibHeadStart  = PeekL(ptrLibrary)+ptrOrginal: ptrLibrary + 4
            LibHeadStopp  = PeekL(ptrLibrary)+ptrOrginal: ptrLibrary + 4
            
            Repeat
                AddElement(FunctionPool())
                FunctionPool()\fnkName = PeekS(LibHeadStart): LibHeadStart + (Len(PeekS(LibHeadStart))+1)
                FunctionPool()\fnkCall = PeekL(LibHeadStart): LibHeadStart + 4
                FunctionPool()\fnkOwn  = ListIndex(LibraryPool())                
            Until LibHeadStart => LibHeadStopp
        EndIf 
    EndIf
EndProcedure

WorkFile = ReadFile(#PB_Any, "WorkFile.txt")
While Eof(WorkFile) = #False
    UseFile(WorkFile)
    ReadLibrary(ReadString())
    Debug "Added " + LibraryPool()\libName
Wend
CloseFile(WorkFile)

Debug "--------------------------"

WorkFile = CreateFile(#PB_Any, "Out.asm")
ForEach LibraryPool()
    Debug "Processing " + LibraryPool()\libName
    WriteStringN(" ; Library: " + LibraryPool()\libName)
    
    DisAsmPtr = LibraryPool()\libLibrary
    Repeat
        DisAsmPos = DisAsmPtr
        DisAsmPtr = DisASMCommand(DisAsmPtr)
        
        If FindString(GetDisASMString(), "db 66h", 1)
            WriteStringN(Right(GetDisASMString(), Len(GetDisASMString())-FindString(GetDisASMString(), "db 66h", 1)))
            Debug Right(GetDisASMString(), Len(GetDisASMString())-FindString(GetDisASMString(), Chr(13), 1))
            ;Debug Asc(Mid(GetDisASMString(), Len("db 66h")+1, 1))
            Debug Len(GetDisASMString()) - FindString(GetDisASMString(), Chr(13), 1)
            Debug Len(GetDisASMString())
            Debug FindString(GetDisASMString(), Chr(13), 1)
        Else
            WriteStringN(GetDisASMString())
        EndIf
    Until DisAsmPtr >= (LibraryPool()\libSize+LibraryPool()\libLibrary)
Next
CloseFile(WorkFile)
extra für laurin:

Code: Alles auswählen

            Debug Len(GetDisASMString()) - FindString(GetDisASMString(), Chr(13), 1)
            Debug Len(GetDisASMString())
            Debug FindString(GetDisASMString(), Chr(13), 1)
Zuletzt geändert von MVXA am 31.01.2005 02:42, insgesamt 2-mal geändert.
Bild
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Ich sehe in dem Code irgendwie nicht durch. Wo wird denn da 23-7 gerechnet?
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Kleinere Edits, siehe oben :roll:
Bild
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Kannst Du den Fehler nicht weiter einkreisen ?
!UD2
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Ich kann den Fehler nicht genau einkreisen weil ich noch nicht richtig ASM kann und es zu spät war um mich mit der Zeile zu beschäftigen. Hier ist noch eine Library um das ganze zu testen.

Code: Alles auswählen

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                          ;;
;;  Name : Lib Example                      ;;
;;  Autor: Arthur S.                        ;;
;;  Desc : Lib exmaple for FireBasic        ;;
;;                                          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

use32
        org 0x0
        db      'FireBasicLib',0                ; Typ

        db      'WindowLIB',0                   ; Name
        db      'Arthur S.',0                   ; Autor
        dd      LibStart                        ; Lib Anfang
        dd      LibStop                         ; Lib Ende
        dd      Lib_Head_Start                  ; LibFunktion defination
        dd      Lib_Head_Stop                   ; Ende des obrigen

        ; Library Befehle
        Lib_Head_Start:
                db      'StartWindowDraw',0     ; FunktionName
                dd      FB_StartDraw_Start      ; FunktionPtr.

                db      'StoppWindowDraw',0     ; FunktionName
                dd      FB_StopDraw_Start       ; FunktionPtr.

                db      'DrawWindowB',0         ; FunktionName
                dd      FB_DrawWindow1_Start    ; FunktionPtr.
        Lib_Head_Stop:

LibStart:
        FB_StartDraw_Start:                     ; StartWindowDraw()
                push ebp
                mov     ebp     ,esp

                mov     ebx     ,1              ; Start drawing
                mov     eax     ,12             ; Funktion 12 from MenuetOS
                int     0x40                    ; Call Funktion

                pop ebp
                ret                             ; Return to maincode
        FB_StartDraw_Stopp:

        FB_StopDraw_Start:                      ; StopWindowDraw()
                push ebp
                mov     ebp     ,esp

                mov     ebx     ,0              ; Stop Drawfunktion
                mov     eax     ,12             ; Funktion 12 from MenuetOS
                int     0x40                    ; Call Funktion

                pop ebp
                ret                             ; Return to maincode
        FB_StopDraw_Stopp:

        FB_DrawWindow1_Start:                   ; DrawWindow(X(L),Y(L),Width(L),Height(L))
                push ebp                        ;            20   16     12        8
                mov     ebp     ,esp

                mov     ebx     ,[ebp+20]       ; [x start] *65536 + [x size]
                shl     ebx     ,16
                add     bx      ,[ebp+12]

                mov     ecx     ,[ebp+16]        ; [y start] *65536 + [y size]
                shl     ecx     ,16
                add     cx      ,[ebp+8]

                mov     edx     ,0x03ffffff     ; color of work area RRGGBB,8->color gl
                mov     esi     ,0x806688cc     ; color of grab bar  RRGGBB,8->color gl
                mov     edi     ,0x006688cc     ; color of frames

                mov     eax     ,0              ; MOS Funktion 0: Draw Window
                int     0x40

                pop ebp
                ret      
        FB_DrawWindow1_Stopp:
LibStop:
Bild
Antworten