Welcome to Schneider / Amstrad CPC Forum. Please login or sign up.

29. March 2024, 07:34:16

Login with username, password and session length

Shoutbox

TFM

2024-01-15, 17:06:57
Momentan billige Farbbänder auf Ebay für PCW

Devilmarkus

2023-07-09, 10:37:40
Zweiter 👋😂🤣

TFM

2023-06-13, 14:21:49
Sommerloch!

TFM

2023-05-30, 17:00:20
Erster ;-)

Recent

Members
Stats
  • Total Posts: 11,655
  • Total Topics: 1,329
  • Online today: 109
  • Online ever: 1,724
  • (16. January 2020, 00:18:45)
Users Online
Users: 1
Guests: 170
Total: 171

170 Guests, 1 User
xesrjb

DATA Block disassemblieren

Started by Thor, 01. May 2018, 11:27:38

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Thor

Hallo,
um Maschinencode in einem Basic Programm zu verwenden, kann der Inhalt als Hexacode direkt in den RAM gepoket werden. Das Verfahren wird im Buch "Das Maschinensprachebuch zum CPC" von Dullin/Strassenburg erläutert.

Anscheinend kann man das auch anders machen. In einer englischen Zeitschrift wird ein Programm zum Anzeigen von Fraktalen vorgestellt. Dort ist der DATA Block nicht als kommagetrennter Hexacode, sondern als reiner Buchstaben-Spaghetticode angegeben.

Wie kann ich den assemblierten Code wieder aus dem RAM auslesen? JavaCPC hat unter 'Hilfe' den 'Debugger'. Aber ich bin mir nicht sicher, wie ich den gepoketen Code dort herauslesen kann.

Sorry für die blöde Frage, bin noch recht neu in der Materie


HAL6128

Jedes Zeichen entspricht einen einfachen ASCII-Code, der als Nummer / Zahl in den RAM gepokt wird. Einfach mal eintippen, in den RAM laden und mit Maxam, WinApe oder natürlich den Debugger im JavaCPC (die entsprechende Speicherstelle) zu disassemblieren. Bei der Größe sollte es kein allzu großes Problem sein, das Programm zu lesen.

HAL6128

...irgendwie scheint das Programm nicht vollständig zu sein, es bricht mit DATA exhausted in 1390 ab.

Thor

Hallo, habe das komplette Programm angehängt. Die erste Version war schon auf das Entscheidende reduziert. Aber das volle Programm sollte auf jeden Fall laufen.

Im RAM sind die Assemblerbefehle in Hexazahlen codiert. So wird zum Beispiel aus:
LD A,10
LD (&B289),A
RET
==> DATA &3E,10,&32,&89,&C9

Im Gegensatz dazu hat eine DATA Zeile in dem anderen Programm den Aufbau:
==> DATA BvX>C;CI]JvH>u=>CSCI[C[\=EKBq

Wie wird dieser ASCII Code nun in Hexacode umgewandelt? Ein ASCII Zeichen hat 8 Bit. Die ersten 32 Zeichen sind Steuerzeichen und lassen sich nicht als Buchstabe wiedergeben. Der Bereich 127 bis 255 sind Symbole, die in dem Data Block nicht auftauchen. Sind also 96 oder 16x3 Kombinationsmöglichkeiten. Man kann also 3 mal jeweils eine Hexazahl (1,2,3,4,5,6,7,8,9,10,A,B,C,D,E,F) in einem Buchstaben verschlüsseln. Dabei ist mir noch nicht klar, wie die 0 (Null) verschlüsselt wird und warum in dem ganzen Block keine einzige Zahl vorkommt (Zufall?).

HAL6128

Da hat sich der Autor ein Verschlüsselungsverfahren ausgedacht. Er liest die komplette Zeile als String ein, unterteilt diese in jeweils Dreier-Blöcke und rechnet die einzelnen Buchstaben nach einem festen Algorithmus für LSB und MSB um. Zumindest scheint das so auf den ersten Blick so.

almasys

Wenn Du das Programm startest wird der Maschinencode ab &8000 im Speicher abgelegt und da kannst Du es einsehen.

Viel Erfolg,
Mr. AMS

TFM

Am besten mit MAXAM mal reinschauen :-)

Maxam gibt's auch auf Diskette, falls keine ROM Box zur Hand ist.
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

Thor

Quote from: HAL6128 on 02. May 2018, 09:38:09
Da hat sich der Autor ein Verschlüsselungsverfahren ausgedacht. Er liest die komplette Zeile als String ein, unterteilt diese in jeweils Dreier-Blöcke

Die Mnemonics werden üblicherweise in 2 Nibble bzw. 2 Hexazahlen p0 und p1 umgewandelt und dann gepoket. Deren Binärdarstellung wird hier in 3 Teile c(1), c(2) und c(3) aufgeteilt und als entsprechendes ASCII-Zeichen interpretiert.

            p0                          p1
  _ _ _ _/ \_ _ _ _     _ _ _ _ /\ _ _ _
/                         \  /                        \
1 1 1 1       1 1 1 1   1 1    1 1 1 1  1 1
  c(1)        \_____  ____/         c(3)
                          \/
                         c(2)

Wobei c(1) ASCII 59-74 (16 Zeichen) und c(2) und c(3) ASCII 59-122 (63 Zeichen) entsprechen.

Dadurch werden p0 und p1 mit insgesamt 4 Stellen (+ einem Komma zur Trennung) in nur 3 Buchstaben (ohne ein notwendiges Trennungszeichen)  umgewandelt. Das ist dann wohl eine Art primitiver Komprimierung von Maschinencode!