CODINGCLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★

9/2.1 - Le désassembleurCoding Classeurs Weka
9/2.1 - Le désassembleur

Qu'est-ce qu'un désassembleur ?

Comme son nom l'indique, c'est un programme qui transforme le code hexadécimal exécutable situé en mémoire en mnémoniques assembleurs. Par opposition, un programme d'assemblage ou assembleur transformera les codes mnémoniques en codes hexadécimaux exécutables.

Analyse du problème :

Comment procéder pour convertir les codes hexadécimaux en mnémo­niques ?
Le micro-processeur Z80 possède de nombreux modes d'adressage. Pour clarifier les choses, établissons un tableau qui donne les codes mnémo­niques correspondant à chaque code hexadécimal sur 8 bits.

* Une instruction peut être codée sur 1, 2, 3 ou 4 octets. Codage sur un octet :
Nous avons, par exemple :

51 LD D,C
96 ; SUB (HL)

Codage sur deux octets :
Nous avons, par exemple :

20 dd JR NZ,dd
ED 68 LD L,(C)

Codage sur trois octets :
Nous avons, par exemple :

DD 86 dd ADD A,(IX + dd)
E2 aa aa JP PO,aaaa

Codage sur quatre octets :
Nous avons, par exemple :

DD CB dd 7E BIT 7,(IX + dd)
FD 36 dd nn LD (IY+dd),nn

* Les mnémoniques « simples » peuvent être codés de trois manières différentes :

1) Codage sur un octet :
Par exemple :

00 NOP

Il suffit dans ce cas d'afficher le mnémonique.

2) Codage sur deux octets :

Par exemple :

06 nn LD B,nn

Dans ce cas, il faut afficher la « racine » du mnémonique (le début du code) suivie de l'octet lu en mémoire.

3) Codage sur trois octets :
Par exemple :

CD nnnn CALL nnnn

Dans ce cas, il faut afficher la « racine * du mnémonique (le début du code) suivie des 2 octets lus en mémoire.

En ce qui concerne les mnémoniques qualifiés de « simples » dans ce qui précède, les références aux contenus sont toujours implicites (sur un registre), comme par exemple LD H,(HL), et ne font jamais appel à la mémoire, aux exceptions près suivantes :

LD (nnnn),HL Cas n° 5
LD HL,(nnnn} Cas n° 6
LD (nnnn),A ;Cas n° 7
LD A,(nnnn) ;Cas n° 8
OUT (nnnn),A ;Cas n° 9
IN A,(nnnn) ;Cas n° 10

Chacune de ces instructions fera l'objet d'un traitement particulier comme indiqué ci-dessus (cas n° 5 à cas n° 10).

Cette distinction est faite, car, dans le programme désassembleur, l'affi­chage du mnémonique se fera en trois temps pour ces cas particuliers :

  • début du mnémonique (appelé « racine » dans ce qui précède),
  • octet ou octets lu(s) en mémoire,
  • fin du mnémonique.

Dans un mnémonique « simple », l'affichage se fait de la manière suivante :

  • mnémonique,
  • éventuellement adresse ou déplacement lu en mémoire,

Les codes CB, DD, ED et FD sont particulièrement complexes. Ils repré­sentent chacun plusieurs dizaines de mnémoniques en fonction des codes hexadôcimaux qui les suivent. Nous leur consacrerons un traitement spécial :

1 pour DD, 2 pour FD, 3 pour CB et 4 pour ED.
La liste des mnémoniques possibles pour ces 4 codes spéciaux est la suivante :











Remarques :
Dans un op-code,
-> n représente un nombre sur 8 bits (2 digit)
-> dd représente un déplacement sur 8 bits (2 digit)
-> nn représente un nombre sur 16 bits (4 digit)
-> quand des codes n, dd ou nn apparaissent dans le code opératoire et pas dans le code hexadécimal correspondant, ils suivent le dernier code hexadécimal donné.

Par exemple :
LD BC, (nn) est codé : ED 4B nn nn

Les données de type 1 et 2 peuvent être divisées en trois sous-types en fonction du nombre d'octets supplémentaires nécessaires pour le codage complet.

1°) Un octet supplémentaire.
Par exemple, DD 09 pour ADD IX,BC.

2°) Deux octets supplémentaires.
Par exemple, DD 8E dd pour ADC A,(IX + dd).

3°) Quatre octets supplémentaires.
Par exemple, DD CB dd EE pour SET 5,(IX + dd).

Les données du type 3 sont toutes adressées sur deux octets. Par exemple, CB D6 pour SET 2,(HL)

Les données du type 4 peuvent être divisées en deux sous-types selon le nombre d'octets supplémentaires nécessaires pour le codage complet.

1°) Un octet supplémentaire.
Par exemple, ED 4A pour ADC HL,BC.

2°) Trois octets supplémentaires.
Par exemple, ED 43 nn nn pour LD (nnnn),BC.
Le programme que nous allons réaliser aura la structure suivante :

La phase d'initialisation mettra les codes opératoires du Z80 dans des tableaux pour faciliter leur manipulation et augmenter la vitesse d'affichage à l'écran. Nous distinguerons :

a) les mnémoniques accessibles directement,
b) les mnémoniques de type 1 (1er octet = DD),
c) les mnémoniques de type 2 (1er octet = FD),
d) les mnémoniques de type 3 (1er octet - CB),
e) les mnémoniques de type 4 (1er octet = ED).

Les mnémoniques seront codés dans des lignes de DATA comme suit.

a) Les mnémoniques accèdes directement seront codés sur deux octets :

b et c) Les mnémoniques de type 1 ou 2 seront définis de trois manières différentes selon le nombre d'octets nécessaires pour qu'ils soient entièrement codés :

d) Les mnémoniques du type 3 sont définis par deux données :

e) Les mnémoniques du type 4 sont définis de deux manières différentes selon que le code-op. est en une ou deux parties :
– en une partie :

– en deux parties :

La phase désassemblage consiste à :

– lire le code hexadécimal en mémoire,
– voir s'il s'agit d'un code spécial :

* dans ce cas, activer un sous-programme de traitement spécial,
* dans le cas contraire, afficher le mnémonique correspondant.

Les mnémoniques spéciaux sont repérés dans le programme dans la partie « codes opératoires et données d'adressage » par un mnémonique numérique. Ce nombre définit le numéro du traitement spécial à effectuer.

Le programme BASIC du désassembleur est le suivant :







Lignes 10 à 30 : Programme principal.
Lignes 1000 à 2020 : Données.
Lignes 3000 à 3440 : Initialisation.
Lignes 4000 à 4140 : Désassemblage.
Lignes 5000 à 5830 : Traitements spéciaux.

Page précédente : 9/2 - Moniteur : Assembleur Désassembleur Debugger (!)
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 233 millisecondes et consultée 2876 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.