Seite 1 von 1

OnError Lib liefert nicht Orginal ASM Code zurück !

Verfasst: 31.10.2004 18:17
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.

Verfasst: 31.10.2004 19:46
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: ?

Verfasst: 31.10.2004 21:10
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.

Verfasst: 31.10.2004 21:48
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

Verfasst: 31.10.2004 23:20
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.

Verfasst: 01.11.2004 09:15
von MVXA
achso, kann man das aber dann nicht irgendwie anders makieren, damit ich den zeilenumbruch mitten im string nicht hab :freak: ?

Verfasst: 01.11.2004 09:24
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?

Verfasst: 01.11.2004 09:29
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: )