ICODE1.PAS 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. (* programme comment‚ et expliqu‚ dans le livre *)
  2. (* LE DESASSEMBLEUR 8086 COLIBRI, publi‚ par *)
  3. (* L'INSTITUT PASCAL: *)
  4. (* 26 Rue Lamartine, 75009 PARIS *)
  5. (* Tel: (1) 42.85.10.82 *)
  6. procedure desassemble_code(p_adresse_debut, p_adresse_fin: integer);
  7. var l_code_operation: byte;
  8. l_ligne: string80;
  9. l_al_precedent, l_ah_precedent, l_ax_precedent,
  10. l_bl_precedent, l_bh_precedent, l_bx_precedent,
  11. l_cl_precedent, l_ch_precedent, l_cx_precedent,
  12. l_dl_precedent, l_dh_precedent, l_dx_precedent: integer;
  13. procedure decode_instruction;
  14. var l_mode, l_registre, l_registre_memoire: byte;
  15. l_bit_mot,
  16. l_bit_direction,
  17. l_bits_registre, l_bit_registre_mot: byte;
  18. l_operande: byte;
  19. l_operande_precedent: integer;
  20. l_chaine, l_chaine2: string21;
  21. l_adresse: integer;
  22. procedure met(suite: string21);
  23. begin
  24. l_ligne:= concat(l_ligne, suite);
  25. end;
  26. procedure met2(suite1, suite2: string21);
  27. begin
  28. l_ligne:= concat(l_ligne, suite1, suite2);
  29. end;
  30. procedure met3(suite1, suite2, suite3: string21);
  31. begin
  32. l_ligne:= concat(l_ligne, suite1, suite2, suite3);
  33. end;
  34. function f_deplacement_octet(oct: byte): string21;
  35. var l_nom_constante: string15;
  36. begin
  37. ajoute_label_donnees(oct, racine_donnees, b_reference_donnees, l_nom_constante, octet);
  38. f_deplacement_octet:= concat('[', l_nom_constante, ']');
  39. end;
  40. function f_deplacement_mot(oct1, oct2: byte): string21;
  41. var l_nom_constante: string15;
  42. l_mot: integer;
  43. begin
  44. l_mot:= oct1*256+ oct2;
  45. ajoute_label_donnees(l_mot, racine_donnees, b_reference_donnees, l_nom_constante, mot);
  46. f_deplacement_mot:= concat('[', l_nom_constante, ']');
  47. end;
  48. procedure met_operande_un_octet;
  49. var l_nom_constante: string15;
  50. begin
  51. lis_octet_suivant(l_operande);
  52. l_operande_precedent:= l_operande;
  53. ajoute_label_donnees(l_operande, racine_immediat, b_reference_immediat,
  54. l_nom_constante, octet);
  55. ajoute_label_donnees(l_operande, racine_donnees, false, l_nom_constante, octet);
  56. met(l_nom_constante);
  57. end;
  58. procedure met_operande_un_mot;
  59. var l_nom_constante: string15;
  60. l_mot: integer;
  61. begin
  62. lis_entier_suivant(l_mot);
  63. ajoute_label_donnees(l_mot, racine_immediat, b_reference_immediat, l_nom_constante, mot);
  64. ajoute_label_donnees(l_mot, racine_donnees, false, l_nom_constante, mot);
  65. l_operande_precedent:= l_mot;
  66. (*
  67. adresse_lib:= l_operande_precedent;
  68. *)
  69. met(l_nom_constante);
  70. end;
  71. procedure met_operande(p_bit_mot: byte);
  72. begin
  73. if p_bit_mot= 0
  74. then met_operande_un_octet
  75. else met_operande_un_mot;
  76. end;
  77. procedure met_operande_relatif_un_octet;
  78. var l_adresse: integer;
  79. begin
  80. lis_octet_suivant(l_operande);
  81. if l_operande< $80
  82. then l_adresse:= l_operande+ adresse
  83. else l_adresse:= l_operande+ adresse- $100;
  84. met(f_ajoute_label_relatif(l_adresse));
  85. end;
  86. procedure met_operande_relatif_un_mot;
  87. var l_deplacement, l_adresse: integer;
  88. begin
  89. lis_entier_suivant(l_deplacement);
  90. met(f_ajoute_label_relatif(adresse+ l_deplacement));
  91. end;
  92. procedure lis_octet_mode;
  93. begin
  94. lis_octet_suivant(l_operande);
  95. l_mode:= (l_operande and $C0) shr 6;
  96. l_registre:= (l_operande and $38) shr 3;
  97. l_registre_memoire:= l_operande and $07;
  98. end;
  99. function f_lis_deplacement: string21;
  100. var l_deplacement1, l_deplacement2: byte;
  101. begin
  102. f_lis_deplacement:='';
  103. case l_mode of
  104. 0 : if l_registre_memoire= 6
  105. then begin
  106. lis_octet_suivant(l_deplacement1);
  107. lis_octet_suivant(l_deplacement2);
  108. f_lis_deplacement:= f_deplacement_mot(l_deplacement2, l_deplacement1);
  109. end;
  110. 1 : begin
  111. lis_octet_suivant(l_deplacement1);
  112. f_lis_deplacement:= f_deplacement_octet(l_deplacement1);
  113. end;
  114. 2 : begin
  115. lis_octet_suivant(l_deplacement1);
  116. lis_octet_suivant(l_deplacement2);
  117. f_lis_deplacement:= f_deplacement_mot(l_deplacement2, l_deplacement1);
  118. end;
  119. end;
  120. end;
  121. procedure decode_registre(p_bit_mot, p_bit_registre: byte;
  122. var pv_chaine: string21);
  123. begin
  124. if p_bit_mot= 0
  125. then
  126. case p_bit_registre of
  127. 0 : pv_chaine:= 'al';
  128. 1 : pv_chaine:= 'cl';
  129. 2 : pv_chaine:= 'dl';
  130. 3 : pv_chaine:= 'bl';
  131. 4 : pv_chaine:= 'ah';
  132. 5 : pv_chaine:= 'ch';
  133. 6 : pv_chaine:= 'dh';
  134. 7 : pv_chaine:= 'bh';
  135. end
  136. else
  137. case p_bit_registre of
  138. 0 : pv_chaine:= 'ax';
  139. 1 : pv_chaine:= 'cx';
  140. 2 : pv_chaine:= 'dx';
  141. 3 : pv_chaine:= 'bx';
  142. 4 : pv_chaine:= 'sp';
  143. 5 : pv_chaine:= 'bp';
  144. 6 : pv_chaine:= 'si';
  145. 7 : pv_chaine:= 'di';
  146. end
  147. end;
  148. procedure traite_registre(var pv_chaine: string21);
  149. var l_virgule, l_chaine3: string21;
  150. l_crochet: boolean;
  151. begin
  152. l_crochet:= true;
  153. case l_mode of
  154. 0, 1, 2 : begin
  155. case l_registre_memoire of
  156. 0 : pv_chaine:= 'bx+ si';
  157. 1 : pv_chaine:= 'bx+ di';
  158. 2 : pv_chaine:= 'bp+ si';
  159. 3 : pv_chaine:= 'bp+ di';
  160. 4 : pv_chaine:= 'si';
  161. 5 : pv_chaine:= 'di';
  162. 6 : if l_mode<> 0
  163. then pv_chaine:= 'bp'
  164. else pv_chaine:= '';
  165. 7 : pv_chaine:= 'bx';
  166. end;
  167. end;
  168. 3 : begin
  169. decode_registre(l_bit_mot, l_registre_memoire, pv_chaine);
  170. l_crochet:= false;
  171. end;
  172. end;
  173. l_virgule:= '';
  174. l_chaine3:= f_lis_deplacement;
  175. if (pv_chaine<> '') and (l_chaine3<> '')
  176. then l_virgule:= '+ ';
  177. if l_crochet
  178. then begin
  179. if length(l_chaine3)> 1
  180. then begin
  181. (*$r-*)
  182. move(l_chaine3[2], l_chaine3[1], length(l_chaine3)- 1);
  183. l_chaine3[0]:= chr(length(l_chaine3)- 2);
  184. (*$r+*)
  185. end;
  186. pv_chaine:= concat('[', pv_chaine, l_virgule, l_chaine3, ']');
  187. end
  188. else pv_chaine:= concat(pv_chaine, l_virgule, l_chaine3);
  189. end;
  190. procedure traite_mode;
  191. begin
  192. traite_registre(l_chaine);
  193. if (l_code_operation in [$80..$83])
  194. and (l_mode< 3)
  195. then begin
  196. if (l_bit_mot= 0)
  197. then met('b ')
  198. else met('w ');
  199. end;
  200. met(l_chaine);
  201. end;
  202. procedure traite_bit_mot;
  203. begin
  204. traite_registre(l_chaine);
  205. if (l_code_operation in [$F6..$F7])
  206. and (l_registre in [0, 2, 3])
  207. then begin
  208. if (l_bit_mot= 0)
  209. then met('b ')
  210. else met('w ');
  211. end;
  212. met(l_chaine);
  213. end;
  214. procedure traite_accumulateur_immediat;
  215. begin
  216. if l_bit_mot= 0
  217. then begin
  218. met('al, ');
  219. met_operande_un_octet;
  220. end
  221. else begin
  222. met('ax, ');
  223. met_operande_un_mot;
  224. end;
  225. end;
  226. procedure traite_direction_mot;
  227. begin
  228. lis_octet_mode;
  229. traite_registre(l_chaine);
  230. decode_registre(l_bit_mot, l_registre, l_chaine2);
  231. if l_bit_direction= 0
  232. then begin
  233. met(l_chaine);
  234. if l_chaine2<> ''
  235. then met2(', ', l_chaine2);
  236. end
  237. else begin
  238. met(l_chaine2);
  239. if l_chaine<> ''
  240. then met2(', ', l_chaine)
  241. end;
  242. end;
  243. procedure traite_fin_registre;
  244. begin
  245. decode_registre(1, l_bits_registre, l_chaine);
  246. met(l_chaine);
  247. end;
  248. procedure traite_registre_registre_memoire;
  249. begin
  250. lis_octet_mode;
  251. traite_registre(l_chaine);
  252. decode_registre(l_bit_mot, l_registre, l_chaine2);
  253. if l_bit_direction= 0
  254. then met3(l_chaine, ', ', l_chaine2)
  255. else met3(l_chaine2, ', ', l_chaine);
  256. end;