OnError Lib liefert nicht Orginal ASM Code zurück !

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

OnError Lib liefert nicht Orginal ASM Code zurück !

Beitrag von MVXA »

Hallo !
Ich arbeite grade aus Fun an einem Programm, das einen Prozessor (irgendwann voll) emulieren soll. Bis jetzt hab ich auch so viel zustande gebracht, dass es eine Binärdatei läd und dessen Code (mit hilfe der OnError Lib) aus gibt. Der Emulator sieht so aus:

Code: Alles auswählen

Enumeration
    #filBinary
EndEnumeration

Global Datei.s 
Global *APPBuffer.l
Global *MEMBuffer.l

Global Signatur.s
Global NeedMemory.l

Global StartCode.l
Global EndCode.l

Global Pointer.l
Global Position.l

Datei = OpenFileRequester("Binary", "", "*.bin (Binary)|*.bin", 0)
If Datei <> "" And OpenConsole() <> 0
    OpenFile(#filBinary, Datei)
    *APPBuffer = AllocateMemory(Lof() + 1)
    ReadData(*APPBuffer, Lof()) 
    
    Signatur   = PeekS(*APPBuffer, 7)
    NeedMemory = PeekL(*APPBuffer + 7)
    StartCode  = PeekL(*APPBuffer + 11)
    EndCode    = PeekL(*APPBuffer + 15)
    
    *MEMBuffer = AllocateMemory(NeedMemory)
    
    Debug "Signatur "  + Signatur
    Debug "Memory "    + Str(NeedMemory)
    Debug "StartCode " + Hex(StartCode)
    Debug "EndCode "   + Hex(EndCode)
    
    Pointer = *APPBuffer + StartCode
    Repeat 
        Position = Pointer
        Pointer = DisASMCommand(Pointer)
        PrintN(Hex(Position)+" - " + GetDisASMString())
    Until Pointer => *APPBuffer+EndCode
    
    For I.l = 1 To Lof()
        Print("[" + Hex(Asc(PeekS(*APPBuffer+I,1))) + "]")
    Next
    PrintN("")
    
    CloseFile(#filBinary)
    Input()
EndIf
und das Beispiel programm wurde in ASM geschrieben:

Code: Alles auswählen

dd 50000        ; benötigter Speicher
dd START_CODE   ; Start des Codes
dd END_CODE     ; Ende des Codes

START_CODE:
        mov eax, 1
        mov ebx, START_CODE
        mov ebx, END_CODE
        mov ecx, 0
END_CODE:

Text:
DB "Hallo !",0 
Compilert wurde das Beispiel Programm mit FASM 1.56.
Nur hab ich jetzt das Problem, dass [c]GetDisASMString()[/c] überhaupt nicht das zurück gibt, was wirklich im ASM Code steht. Kann mir jemand sagen warum das so ist ?.

Hier ist nochmal der Output in der Konsole:

Code: Alles auswählen

891EA3 - db 66h♪◙MOV ax,0001
891EA7 - ADD [eax],al
891EA9 - db 66h♪◙MOV bx,0013
891EAD - ADD [eax],al
891EAF - db 66h♪◙MOV bx,002B
891EB3 - ADD [eax],al
891EB5 - db 66h♪◙MOV cx,0000
891EB9 - ADD [eax],al
[42][49][54][53][49][47][50][C3][0][0][13][0][0][0][2B][0][0][0][66][B8][1][0][0
][0][66][BB][13][0][0][0][66][BB][2B][0][0][0][66][B9][0][0][0][0][48][61][6C][6
C][6F][20][21][0][0]
das was unten steht ist das Programm in HexCode.
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Problem hat sich von selbst behoben :oops:
ich hab im ASM Code use32 vergessen, damit der FASM compieler auch 32bit struktur verwendet :oops:

edt:
Toll, das ist nur eine Halbllösung. Die Funktion [c]GetDisASMString()[/c] kann nur 32 Bit assembler disasemblieren :| [c]mov eax, 1[/c] macht se mit aber [c]mov ax, 1[/c] nicht mehr richtig. Sie gibt dann sowas zurück: [c]db 66h♪◙MOV ax,0001[/c] wobei mich das db 66h stört. Kann das jemand fixen :freak: ?
Bild
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

LittleFurz hat geschrieben:Problem hat sich von selbst behoben :oops:
aber immer erst mal nen Post absetzen das PB ein Fehler hat.
LittleFurz hat geschrieben:Die Funktion [c]GetDisASMString()[/c] kann nur 32 Bit assembler disasemblieren .
was erwartest du ?
wir leben in der 32Bit-Welt und die OnError sollte dort arbeiten, nicht in 16 Bit.
Warum allerdings ein MOV ax,5 nich richtig übersetzt wird ist mir auch schleierhaft. Muss ich mich mal mit beschäftigen wenn ich zeit habe.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Rings hat geschrieben:
LittleFurz hat geschrieben:Problem hat sich von selbst behoben :oops:
aber immer erst mal nen Post absetzen das PB ein Fehler hat.
Entschuldigung, aber bei so einem simplen Code liegt halt der Fehler nahe an PB.
Rings hat geschrieben:wir leben in der 32Bit-Welt und die OnError sollte dort arbeiten, nicht in 16 Bit.
aber 8-bit anweisung disaembliert er ohne große probleme :?
Rings hat geschrieben: Warum allerdings ein MOV ax,5 nich richtig übersetzt wird ist mir auch schleierhaft. Muss ich mich mal mit beschäftigen wenn ich zeit habe.
Danke :D
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

$66 (66h) ist das Präfix um zwischen 32- und 16-bit zu
wechseln.
Im 16-Bit Modus kann man so 32-Bit Befehle nutzen, und
im 32-Bit Modus die 16-Bit Befehle.

Weiteres dazu in Deiner Lieblings-ASM-Referenz.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

achso, kann man das aber dann nicht irgendwie anders makieren, damit ich den zeilenumbruch mitten im string nicht hab :freak: ?
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

LittleFurz hat geschrieben:achso, kann man das aber dann nicht irgendwie anders makieren, damit ich den zeilenumbruch mitten im string nicht hab :freak: ?
Ein einfaches ersetzen dieser Zeichen durch Spaces sollte
es doch tun. Entweder selbst per Pointer durchsuchen
oder per ReplaceString probieren.

Alternativ auf "db 66h" am Anfang des Strings überprüfen
und daraus 2 PrintN() machen, wenn Du willst.

Es ist ja nur so das PrintN() den Zeilenumbruch nicht kennt,
aber eig. kein Beinbruch, oder?


Was anderes, falls gestattet:
Hast Du so vor einen Emulator zu machen, oder ist das
nur ein Test? Willst Du eine komplette virtuelle Maschine
bauen, oder einfach nur bestimmte (Windows) EXE laden
und die übers disassemblieren quasi Schrittweise ausführen?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

ich wollt nur mit purebasic etwas rumspielen :|
ich hab gestern irgendwie aus lange weile es geschafft ne binär datei zu laden und die position eines labels zu berechnen, mutiviert von dem erfolg wollt ich einen mini emu schreiben.

edt.
bin grade dabei eine funktion zu schreiben die mir das richtig ausrechnen soll
[c]eax+10[/c]. Und um ehrlich zu sein: scheizze, muss ich wieder überlegen wie man so ein formelparser baut :|

edt2.
der Parser ist auf dem weg und er funzt guuut :D (portiere grade einen aus VB, sonst wird das echt zu kompliziert :freak: )
Bild
Antworten