ICODE3.PAS 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  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. begin
  7. l_bit_mot:= l_code_operation and 1;
  8. l_bit_direction:= (l_code_operation and 2) shr 1;
  9. l_bits_registre:= l_code_operation and 7;
  10. l_bit_registre_mot:= (l_code_operation and 8) shr 3;
  11. case l_code_operation of
  12. $37: met('aaa ');
  13. $D5: begin
  14. met('aad');
  15. lis_octet_suivant(l_operande);
  16. if l_operande<> $0A
  17. then met(' ???_1');
  18. end;
  19. $D4: begin
  20. met('aam');
  21. lis_octet_suivant(l_operande);
  22. if l_operande<> $0A
  23. then met(' ???_2');
  24. end;
  25. $3F: met('aas');
  26. $10..$15: begin
  27. met('adc ');
  28. case l_code_operation of
  29. $10..$13 : traite_direction_mot;
  30. $14 : begin
  31. met('al, ');
  32. met_operande_un_octet;
  33. end;
  34. $15 : begin
  35. met('ax, ');
  36. met_operande_un_mot;
  37. end;
  38. end;
  39. end;
  40. $00..$05: begin
  41. met('add ');
  42. case l_code_operation of
  43. $00..$03 : traite_direction_mot;
  44. $04..$05 : traite_accumulateur_immediat;
  45. end;
  46. end;
  47. $20..$25: begin
  48. met('and ');
  49. case l_code_operation of
  50. $20..$23 : traite_direction_mot;
  51. $24..$25 : traite_accumulateur_immediat;
  52. end;
  53. end;
  54. $9A, $E8: begin
  55. met('call ');
  56. case l_code_operation of
  57. $9A : begin
  58. lis_entier_suivant(l_adresse);
  59. l_chaine:= f_entier_hexadecimal(l_adresse);
  60. lis_entier_suivant(l_adresse);
  61. l_chaine2:= f_entier_hexadecimal(l_adresse);
  62. met3(l_chaine2, ':', l_chaine);
  63. end;
  64. $E8 : begin
  65. lis_entier_suivant(l_adresse);
  66. met(f_ajoute_label_call(adresse+ l_adresse));
  67. end;
  68. end;
  69. end;
  70. $98: met('cbw');
  71. $F8: met('clc');
  72. $FC: met('cld');
  73. $FA: met('cli');
  74. $F5: met('cmc');
  75. $38..$3D: begin
  76. met('cmp ');
  77. case l_code_operation of
  78. $38..$3B: traite_direction_mot;
  79. $3C: begin
  80. traite_accumulateur_immediat;
  81. if l_operande in [$0..$7E]
  82. then affiche_caractere;
  83. end;
  84. $3D: traite_accumulateur_immediat;
  85. end;
  86. end;
  87. $A6: met('cmps b');
  88. $A7: met('cmps w');
  89. $99: met('cwd');
  90. $27: met('daa');
  91. $2F: met('das');
  92. $48..$4F: begin
  93. met('dec ');
  94. traite_fin_registre;
  95. end;
  96. $D8..$DF: begin
  97. met('esc ');
  98. lis_octet_mode;
  99. traite_registre(l_chaine);
  100. met(l_chaine);
  101. end;
  102. $F6..$F7: begin
  103. lis_octet_mode;
  104. if l_bit_mot= 0
  105. then begin
  106. case l_registre of
  107. 0 : begin
  108. met('test ');
  109. traite_bit_mot;
  110. met(', ');
  111. met_operande_un_octet;
  112. end;
  113. 1 : begin
  114. met('???_3');
  115. end;
  116. 2 : begin
  117. met('not ');
  118. traite_bit_mot;
  119. end;
  120. 3 : begin
  121. met('neg ');
  122. traite_bit_mot;
  123. end;
  124. 4 : begin
  125. met('mul al, ');
  126. traite_mode;
  127. end;
  128. 5 : begin
  129. met('imul al, ');
  130. traite_mode;
  131. end;
  132. 6 : begin
  133. met('div al, ');
  134. traite_mode;
  135. end;
  136. 7 : begin
  137. met('idiv al, ');
  138. traite_mode;
  139. end;
  140. end;
  141. end
  142. else begin
  143. case l_registre of
  144. 0 : begin
  145. met('test ');
  146. traite_bit_mot;
  147. met(', ');
  148. met_operande_un_mot;
  149. end;
  150. 1 : begin
  151. met('???_4');
  152. end;
  153. 2 : begin
  154. met('not ');
  155. traite_bit_mot;
  156. end;
  157. 3 : begin
  158. met('neg ');
  159. traite_bit_mot;
  160. end;
  161. 4 : begin
  162. met('mul ax, ');
  163. traite_mode;
  164. end;
  165. 5 : begin
  166. met('imul ax, ');
  167. traite_mode;
  168. end;
  169. 6 : begin
  170. met('div ax, ');
  171. traite_mode;
  172. end;
  173. 7 : begin
  174. met('idiv ax, ');
  175. traite_mode;
  176. end;
  177. end;
  178. end;
  179. end;
  180. $FE..$FF: begin
  181. lis_octet_mode;
  182. if l_bit_mot= 0
  183. then begin
  184. case l_registre of
  185. 0 : begin
  186. met('inc b ');
  187. traite_mode;
  188. end;
  189. 1 : begin
  190. met('dec b ');
  191. traite_registre(l_chaine);
  192. met(l_chaine);
  193. end;
  194. else begin
  195. met('???_5');
  196. end;
  197. end;
  198. end
  199. else begin
  200. case l_registre of
  201. 0 : begin
  202. met('inc w ');
  203. traite_mode;
  204. end;
  205. 1 : begin
  206. met('dec w ');
  207. traite_registre(l_chaine);
  208. met(l_chaine);
  209. end;
  210. 2 : begin
  211. traite_registre(l_chaine);
  212. met2('call ', l_chaine);
  213. end;
  214. 3 : begin
  215. traite_registre(l_chaine);
  216. met2('call ', l_chaine);
  217. end;
  218. 4 : begin
  219. met('jmp_ra ');
  220. traite_bit_mot;
  221. end ;
  222. 5 : begin
  223. met('jmp_er ');
  224. traite_bit_mot;
  225. end;
  226. 6 : begin
  227. met('push ');
  228. traite_bit_mot;
  229. end;
  230. 7 : met('???_7');
  231. end;
  232. end;
  233. end;
  234. $F4: met('hlt');
  235. $80..$82: begin
  236. lis_octet_mode;
  237. case l_registre of
  238. 0 : met('add ');
  239. 1 : met('or ');
  240. 2 : met('adc ');
  241. 3 : met('sbb ');
  242. 4 : met('and ');
  243. 5 : met('sub ');
  244. 6 : met('xor ');
  245. 7 : met('cmp ');
  246. end;
  247. traite_mode;
  248. met(', ');
  249. met_operande(l_bit_mot);
  250. end;
  251. $83: begin
  252. lis_octet_mode;
  253. case l_registre of
  254. 0 : met('add ');
  255. 1 : met('or ');
  256. 2 : met('adc ');
  257. 3 : met('sbb ');
  258. 4 : met('and ');
  259. 5 : met('sub ');
  260. 6 : met('xor ');
  261. 7 : met('cmp ');
  262. end;
  263. traite_mode;
  264. met(', ');
  265. met_operande(0);
  266. end;
  267. $E4..$E5,
  268. $EC..$ED: begin
  269. met('in ');
  270. case l_code_operation of
  271. $EC : met('al, dx');
  272. $ED : met('ax, dx');
  273. $E4..$E5 : traite_accumulateur_immediat;
  274. end;
  275. end;
  276. $40..$47: begin
  277. met('inc ');
  278. traite_fin_registre;
  279. end;
  280. $CC: met('int 3');
  281. $CD: begin
  282. met('int ');
  283. met_operande_un_octet;
  284. commente_interruption;
  285. end;
  286. $CE: met('into');
  287. $CF: met('iret');
  288. $72: begin
  289. met('jb ');
  290. met_operande_relatif_un_octet;
  291. end;
  292. $76: begin
  293. met('jbe ');
  294. met_operande_relatif_un_octet;
  295. end;
  296. $E3: begin
  297. met('jcxz ');
  298. met_operande_relatif_un_octet;
  299. end;
  300. $74: begin
  301. met('je ');
  302. met_operande_relatif_un_octet;
  303. end;
  304. $7C: begin
  305. met('jl ');
  306. met_operande_relatif_un_octet;
  307. end;
  308. $7E: begin
  309. met('jle ');
  310. met_operande_relatif_un_octet;
  311. end;
  312. $E9..$EB: begin
  313. if l_code_operation= $EB
  314. then met('jmp_s ')
  315. else met('jmp ');
  316. case l_code_operation of
  317. $E9 : met_operande_relatif_un_mot;
  318. $EA : begin
  319. met_operande_un_mot;
  320. met(':');
  321. met_operande_un_mot;
  322. end;
  323. $EB : begin
  324. met_operande_relatif_un_octet;
  325. end;
  326. end;
  327. end;
  328. $73: begin
  329. met('jnc ');
  330. met_operande_relatif_un_octet;
  331. end;
  332. $77: begin
  333. met('jnbe ');
  334. met_operande_relatif_un_octet;
  335. end;
  336. $75: begin
  337. met('jnz ');
  338. met_operande_relatif_un_octet;
  339. end;
  340. $7D: begin
  341. met('jnl ');
  342. met_operande_relatif_un_octet;
  343. end;
  344. $7F: begin
  345. met('jnle ');
  346. met_operande_relatif_un_octet;
  347. end;
  348. $71: begin
  349. met('jno ');
  350. met_operande_relatif_un_octet;
  351. end;
  352. $7B: begin
  353. met('jnp ');
  354. met_operande_relatif_un_octet;
  355. end;
  356. $79: begin
  357. met('jns ');
  358. met_operande_relatif_un_octet;
  359. end;
  360. $70: begin
  361. met('jo ');
  362. met_operande_relatif_un_octet;
  363. end;
  364. $7A: begin
  365. met('jp ');
  366. met_operande_relatif_un_octet;
  367. end;
  368. $78: begin
  369. met('js ');
  370. met_operande_relatif_un_octet;
  371. end;
  372. $9F: met('lahf ');
  373. $C5: begin
  374. met('lds ');
  375. lis_octet_mode;
  376. decode_registre(1, l_registre, l_chaine);
  377. met2(l_chaine, ', ');
  378. traite_registre(l_chaine);
  379. met(l_chaine);
  380. end;
  381. $8D: begin
  382. met('lea ');
  383. lis_octet_mode;
  384. decode_registre(1, l_registre, l_chaine);
  385. met2(l_chaine, ', ');
  386. traite_registre(l_chaine);
  387. met(l_chaine);
  388. end;
  389. $C4: begin
  390. met('les ');
  391. lis_octet_mode;
  392. decode_registre(1, l_registre, l_chaine);
  393. met2(l_chaine, ', ');
  394. traite_registre(l_chaine);
  395. met(l_chaine);
  396. end;
  397. $F0: met('lock');
  398. $AC: met('lods b');
  399. $AD: met('lods w');
  400. $E2: begin
  401. met('loop ');
  402. met_operande_relatif_un_octet;
  403. end;
  404. $E0: begin
  405. met('loopnz ');
  406. met_operande_relatif_un_octet;
  407. end;
  408. $E1: begin
  409. met('loopz ');
  410. met_operande_relatif_un_octet;
  411. end;
  412. $88..$8C, $8E,
  413. $A0..$A3,
  414. $B0..$BF,
  415. $C6..$C7: begin
  416. met('mov ');
  417. case l_code_operation of
  418. $88..$8B : begin
  419. traite_registre_registre_memoire;
  420. end;
  421. $8C : begin
  422. lis_octet_mode;
  423. if l_registre> 3
  424. then met('???_9')
  425. else begin
  426. l_bit_mot:= 1;
  427. traite_registre(l_chaine);
  428. met2(l_chaine, ', ');
  429. case l_registre of
  430. 0 : met('es');
  431. 1 : met('cs');
  432. 2 : met('ss');
  433. 3 : met('ds');
  434. end;
  435. end;
  436. end;
  437. $8E : begin
  438. lis_octet_mode;
  439. if l_registre> 3
  440. then met('???_9')
  441. else begin
  442. l_bit_mot:= 1;
  443. traite_registre(l_chaine);
  444. case l_registre of
  445. 0 : met('es, ');
  446. 1 : met('cs, ');
  447. 2 : met('ss, ');
  448. 3 : met('ds, ');
  449. end;
  450. met(l_chaine);
  451. end;
  452. end;
  453. $A0 : begin
  454. met('al, [');
  455. met_operande_un_mot;
  456. met(']');
  457. end;
  458. $A1 : begin
  459. met('ax, [');
  460. met_operande_un_mot;
  461. met(']');
  462. end;
  463. $A2 : begin
  464. met('[');
  465. met_operande_un_mot;
  466. met('], al');
  467. end;
  468. $A3 : begin
  469. met('[');
  470. met_operande_un_mot;
  471. met('], ax');
  472. end;
  473. $B0..$BF : begin
  474. decode_registre(l_bit_registre_mot, l_bits_registre, l_chaine);
  475. met2(l_chaine, ', ');
  476. met_operande(l_bit_registre_mot);
  477. recupere_valeur_stockee_dans_registre;
  478. end;
  479. $C6..$C7 : begin
  480. lis_octet_mode;
  481. traite_registre(l_chaine);
  482. met2(l_chaine, ', ');
  483. met_operande(l_bit_mot);
  484. end;
  485. end;
  486. end;
  487. $A4: met('movs b');
  488. $A5: met('movs w');
  489. $90: met('nop');
  490. $08..$0B,
  491. $0C..$0D: begin
  492. met('or ');
  493. case l_code_operation of
  494. $08..$0B : traite_direction_mot;
  495. $0C..$0D : traite_accumulateur_immediat;
  496. end;
  497. end;
  498. $E6..$E7,
  499. $EE..$EF: begin
  500. met('out ');
  501. case l_code_operation of
  502. $EE : met('dx, al');
  503. $EF : met('dx, ax');
  504. $E6..$E7 : traite_accumulateur_immediat;
  505. end;
  506. end;
  507. $07, $17, $1F,
  508. $58..$5F, $8F: begin
  509. met('pop ');
  510. case l_code_operation of
  511. $58..$5F : traite_fin_registre;
  512. $8F: begin
  513. lis_octet_mode;
  514. if l_registre<> 0
  515. then met('???_10')
  516. else begin
  517. traite_registre(l_chaine);
  518. met(l_chaine);
  519. end;
  520. end;
  521. $07: met('es');
  522. $17: met('ss');
  523. $1F: met('ds');
  524. end;
  525. end;
  526. $9D: met('popf');
  527. $06, $0E, $1E,
  528. $16, $50..$57: begin
  529. met('push ');
  530. case l_code_operation of
  531. $06 : met('es');
  532. $0E : met('cs');
  533. $16 : met('ss');
  534. $1E : met('ds');
  535. $50..$57: traite_fin_registre;
  536. end;
  537. end;
  538. $9C: met('push_f');
  539. $F2: met('rep');
  540. $F3: met('rep_z');
  541. $C2..$C3,
  542. $CA..$CB: begin
  543. met('ret ');
  544. case l_code_operation of
  545. $C2 : begin
  546. lis_entier_suivant(l_adresse);
  547. met2(f_entier_hexadecimal(l_adresse) , ' ; intra');
  548. end;
  549. $C3 : ;
  550. $CA : begin
  551. lis_entier_suivant(l_adresse);
  552. met2(f_entier_hexadecimal(l_adresse) , ' ; inter');
  553. end;
  554. $CB : met(' ; inter seg');
  555. end;
  556. end;
  557. $9E: met('sahf');
  558. $18..$1D: begin
  559. met('sbb ');
  560. case l_code_operation of
  561. $18..$1B : traite_direction_mot;
  562. $1C..$1B : traite_accumulateur_immediat;
  563. end;
  564. end;
  565. $AE: met('scas b');
  566. $AF: met('scas w');
  567. $26, $2E,
  568. $36, $3E: begin
  569. met('seg ');
  570. case l_code_operation of
  571. $26 : met('es');
  572. $2E : met('cs');
  573. $36 : met('ss');
  574. $3E : met('ds');
  575. end;
  576. end;
  577. $D0..$D3: begin
  578. lis_octet_mode;
  579. case l_registre of
  580. 0 : met('rol ');
  581. 1 : met('ror ');
  582. 2 : met('rcl ');
  583. 3 : met('rcr ');
  584. 4 : met('shl ');
  585. 5 : met('shr ');
  586. 6 : met('???_11');
  587. 7 : met('sar ');
  588. end;
  589. if l_registre <> 6
  590. then begin
  591. traite_registre(l_chaine);
  592. met(l_chaine);
  593. if l_bit_direction= 1
  594. then met(', cl')
  595. else met(', 1');
  596. end;
  597. end;
  598. $F9: met('stc');
  599. $FB: met('sti');
  600. $FD: met('std');
  601. $AA: met('stos b');
  602. $AB: met('stos w');
  603. $28..$2D: begin
  604. met('sub ');
  605. case l_code_operation of
  606. $28..$2B : traite_direction_mot;
  607. $2C..$2D : traite_accumulateur_immediat;
  608. end;
  609. end;
  610. $84..$85,
  611. $A8..$A9: begin
  612. met('test ');
  613. case l_code_operation of
  614. $84..$85 : begin
  615. l_bit_direction:= 1;
  616. traite_registre_registre_memoire;
  617. end;
  618. $A8..$A9 : traite_accumulateur_immediat;
  619. end;
  620. end;
  621. $9B: met('wait');
  622. $86..$87,
  623. $91..$97: begin
  624. met('xchg ');
  625. case l_code_operation of
  626. $86..$87 : begin
  627. lis_octet_mode;
  628. traite_registre(l_chaine);
  629. decode_registre(l_bit_mot, l_registre, l_chaine2);
  630. met3(l_chaine2, ', ', l_chaine)
  631. end;
  632. $91..$97 : traite_fin_registre;
  633. end;
  634. end;
  635. $D7: met('xlat');
  636. $30..$35: begin
  637. met('xor ');
  638. case l_code_operation of
  639. $30..$33: begin
  640. traite_direction_mot;
  641. if (l_code_operation= $32) and (l_chaine= l_chaine2) then
  642. if l_chaine= 'ah' then l_ah_precedent:= 0 else
  643. if l_chaine= 'al' then l_al_precedent:= 0 else
  644. if l_chaine= 'bl' then l_bl_precedent:= 0 else
  645. if l_chaine= 'bh' then l_bh_precedent:= 0 else
  646. if l_chaine= 'cl' then l_cl_precedent:= 0 else
  647. if l_chaine= 'ch' then l_ch_precedent:= 0 else
  648. if l_chaine= 'dl' then l_dl_precedent:= 0 else
  649. if l_chaine= 'dh' then l_dh_precedent:= 0;
  650. end;
  651. $34..$35: traite_accumulateur_immediat;
  652. end;
  653. end;
  654. $0F, $60..$6F,
  655. $C0..$C1,
  656. $C8..$C9,
  657. $D6, $F1:met('???_?');
  658. end;
  659. end;
  660. procedure affiche_debut_de_ligne;
  661. var l_pt_commentaire: t_pt_commentaire;
  662. l_commentaire: string127;
  663. begin
  664. writeln(sortie);
  665. if b_avec_octets_hexadecimaux
  666. then write(sortie, f_entier_hexadecimal(adresse_debut_ligne), ' ');
  667. l_pt_commentaire:= racine_commentaire;
  668. while l_pt_commentaire<> nil do
  669. begin
  670. cherche_commentaire(adresse_debut_ligne, 'D', l_pt_commentaire,
  671. l_commentaire);
  672. if l_commentaire<> ''
  673. then begin
  674. if b_avec_octets_hexadecimaux
  675. then write(sortie, '': 22);
  676. writeln(sortie, l_commentaire);
  677. if b_avec_octets_hexadecimaux
  678. then write(sortie, f_entier_hexadecimal(adresse_debut_ligne), ' ');
  679. end;
  680. end;
  681. l_pt_commentaire:= racine_commentaire;
  682. while l_pt_commentaire<> nil do
  683. begin
  684. cherche_commentaire(adresse_debut_ligne, 'M', l_pt_commentaire,
  685. l_commentaire);
  686. if l_commentaire<> ''
  687. then begin
  688. if b_avec_octets_hexadecimaux
  689. then write(sortie, '': 22);
  690. if nom_debut_ligne[1]<> ' '
  691. then begin
  692. write(sortie, nom_debut_ligne);
  693. nom_debut_ligne:= ' ';
  694. end
  695. else write(sortie, '': 15);
  696. writeln(sortie, ' ', l_commentaire);
  697. if b_avec_octets_hexadecimaux
  698. then write(sortie, f_entier_hexadecimal(adresse_debut_ligne), ' ');
  699. end;
  700. end;
  701. end;
  702. procedure affiche_instruction;
  703. var l_indice: integer;
  704. l_pt_commentaire: t_pt_commentaire;
  705. l_commentaire: string127;
  706. begin
  707. if b_avec_octets_hexadecimaux
  708. then begin
  709. for l_indice:= adresse- adresse_debut_ligne to 7 do
  710. write(sortie, ' ');
  711. write(sortie, ' ', numero_ligne:4, ' ');
  712. end;
  713. write(sortie, nom_debut_ligne, ' ', l_ligne);
  714. l_pt_commentaire:= racine_commentaire;
  715. while l_pt_commentaire<> nil do
  716. begin
  717. cherche_commentaire(adresse_debut_ligne, 'F', l_pt_commentaire,
  718. l_commentaire);
  719. if l_commentaire<> ''
  720. then write(sortie, l_commentaire);
  721. end;
  722. if (l_code_operation in [$C2, $C3, $CA, $CB, $E9, $EA, $EB, $CF])
  723. or ((l_code_operation in [$FE..$FF])
  724. and ((l_code_operation and $38)<> 0))
  725. then writeln(sortie);
  726. end;
  727. begin
  728. adresse:= p_adresse_debut;
  729. l_al_precedent:= 0;
  730. l_ah_precedent:= 0;
  731. l_ax_precedent:= 0;
  732. l_bl_precedent:= 0;
  733. l_bh_precedent:= 0;
  734. l_bx_precedent:= 0;
  735. l_cl_precedent:= 0;
  736. l_ch_precedent:= 0;
  737. l_cx_precedent:= 0;
  738. l_dl_precedent:= 0;
  739. l_dh_precedent:= 0;
  740. l_dx_precedent:= 0;
  741. while adresse<= p_adresse_fin do
  742. begin
  743. l_ligne:= '';
  744. adresse_debut_ligne:= adresse;
  745. nom_debut_ligne:= f_label_debut_ligne(adresse);
  746. affiche_debut_de_ligne;
  747. lis_octet_suivant(l_code_operation);
  748. decode_instruction;
  749. affiche_instruction;
  750. numero_ligne:= numero_ligne+ 1;
  751. if b_stop_ecran and (numero_ligne mod 20= 0)
  752. then begin
  753. read(kbd, choix1); writeln(choix1);
  754. if upcase(choix1)= 'Q'
  755. then adresse:= adresse_fin+ 1;
  756. end;
  757. end;
  758. writeln(sortie);
  759. if p_adresse_fin+ 1- adresse<> 0
  760. then begin
  761. writeln;
  762. write('dernier octet d‚sassembl‚: ', f_entier_hexadecimal(adresse- 1));
  763. writeln(' <> adresse fin: ', f_entier_hexadecimal(p_adresse_fin));
  764. end;
  765. end;