Seite 1 von 1

PB rechnet falsch!

Verfasst: 31.01.2005 02:36
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)

Verfasst: 31.01.2005 02:40
von Laurin
Ich sehe in dem Code irgendwie nicht durch. Wo wird denn da 23-7 gerechnet?

Verfasst: 31.01.2005 02:42
von MVXA
Kleinere Edits, siehe oben :roll:

Verfasst: 31.01.2005 12:57
von Froggerprogger
Kannst Du den Fehler nicht weiter einkreisen ?

Verfasst: 31.01.2005 13:45
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: