Пройти цепочку MCB(Memory Control Block) в памяти ПЭВМ


Добавил:DMT
Дата создания:24 января 2008, 1:14
Дата обновления:24 января 2008, 1:14
Просмотров:6774 последний сегодня, 23:32
Комментариев: 0
При загрузке EXE модуля выполняются следующие действия:
- в свободной области ОЗУ строится MCB (Memory Control Block) размером в
один параграф (16 байт).

Структура MCB блока.
===================

------T-------T----------¬
¦Смещ.¦Длина  ¦Содержимое¦
+-----+-------+----------+     -'M'(4DH) - блок MCB не последний
¦  0  ¦  1байт¦ Тип блока¦----¦-Z'(5AH) - блок является последним
+-----+-------+----------+
¦  1  ¦  2байт¦ Владелец ¦ сегмент владельца MCB (0 - OS)
+-----+-------+----------+
¦  3  ¦  2байт¦  Размер  ¦ число параграфов в этом блоке распределения
+-----+-------+----------+
 

- далее загружается программа с PSP (Programm Segment Prefix) размером 256
байт. Реально перед загрузкой программы строятся 2 MCB блока.Адрес первого
MCB блока размещается перед началом векторной таблицы DOS минус 2 байта. Для
того, чтобы получить адрес векторной таблицы DOS необходимо выполнить:

mov ax,5200h ;функция 52h прерывания 21h
int 21h

после выполнения прерывания адрес таблицы находится в паре регистров ES:BX.

Исходный текст программы пребегающей по MCB:

Код на ASM
  1. .286
  2. .model small
  3.  
  4. .data
  5. memes dw 0
  6. membx dw 0
  7. upline db '----------T-----------------------T--------¬', 10, 13, '$'
  8. dnline db 'L---------+-----------------------+---------', 10, 13, '$'
  9. hline db '¦0000:0000¦00 00 00 00 00 00 00 00¦AAAAAAAA¦', 10, 13, '$'
  10. mes1 db 'Адрес таблицы векторов: '
  11. h1 db '0000:0000', 10, 13, '$'
  12. mes2 db 10, 13, 'Адрес MCB блока: '
  13. h2 db '0000:0000', 10, 13, '$'
  14. mes3 db 'Адрес следующего MCB блока: '
  15. h3 db '0000:0000', 10, 13, '$'
  16. mes4 db 'Для продолжения нажмите любую клавишу (ESC - выход)...', 10, 13, '$'
  17.  
  18.  
  19. .code
  20. start: mov ax, @data
  21. call ClrScr
  22. mov ds, ax
  23. mov ax, 5200h
  24. int 21h
  25. mov memes, es
  26. mov membx, bx
  27. mov ax, es
  28. mov bx, offset h1
  29. mov cx, 1
  30. call ToHex
  31. mov ax, membx
  32. mov bx, offset h1+5
  33. mov cx, 1
  34. call ToHex
  35. mov dx, offset mes1
  36. call PrnStr
  37. mov bx, membx
  38. sub bx, 2
  39. mov ax, es:[bx]
  40. mov memes, ax
  41. s10: mov es, memes
  42. call PrnDump
  43. mov dx, offset mes4
  44. call PrnStr
  45. s20: xor ax, ax
  46. int 16h
  47. cmp ah, 01h
  48. jz exit
  49. mov al, es:[0]
  50. cmp al, 'M'
  51. jz s10
  52. exit: mov ax, 4c00h
  53. int 21h
  54.  
  55. PrnDump proc
  56. mov ax, es
  57. mov bx, offset h2
  58. mov cx, 1
  59. call ToHex
  60. mov dx, offset mes2
  61. call PrnStr
  62. mov dx, offset upline
  63. call PrnStr
  64. xor si, si
  65. xor dx, dx
  66. mov cx, 4
  67. d10: push cx
  68. mov ax, es
  69. mov bx, offset hline+1
  70. mov cx, 1
  71. call ToHex
  72. mov ax, dx
  73. add bx, 5
  74. mov cx, 1
  75. call ToHex
  76. add dx, 8
  77. mov cx, 8
  78. add bx, 5
  79. mov di, offset hline+35
  80. xor ah, ah
  81. d20: push cx
  82. mov al, es:[si]
  83. mov cx, 0
  84. call ToHex
  85. cmp al, 32
  86. jb d30
  87. cmp al, 127
  88. jb d40
  89. cmp al, 128
  90. jb d30
  91. cmp al, 242
  92. jb d40
  93. d30: mov al, '.'
  94. d40: mov [di], al
  95. add bx, 3
  96. inc si
  97. inc di
  98. pop cx
  99. loop d20
  100. push dx
  101. mov dx, offset hline
  102. call PrnStr
  103. pop dx
  104. pop cx
  105. loop d10
  106. mov dx, offset dnline
  107. call PrnStr
  108. mov ax, es:[0003]
  109. mov bx, es
  110. add ax, bx
  111. inc ax
  112. mov memes, ax
  113. mov bx, offset h3
  114. mov cx, 1
  115. call ToHex
  116. mov dx, offset mes3
  117. call PrnStr
  118. ret
  119. endp
  120.  
  121. ToHex proc near
  122. pusha
  123. inc bx
  124. cmp cx, 0
  125. jz th05
  126. add bx, 2
  127. th05: push ax
  128. and al, 0Fh
  129. cmp al, 09h
  130. ja th10
  131. add al, '0'
  132. jmp th20
  133. th10: add al, 55
  134. th20: mov [bx], al
  135. pop ax
  136. dec bx
  137. shr al, 4
  138. cmp al, 09h
  139. ja th30
  140. add al, '0'
  141. jmp th40
  142. th30: add al, 55
  143. th40: mov [bx], al
  144. cmp cx, 0
  145. jz th50
  146. dec cx
  147. dec bx
  148. mov al, ah
  149. jmp th05
  150. th50: popa
  151. ret
  152. ToHex endp
  153.  
  154. PrnStr proc near
  155. pusha
  156. mov ah, 09h
  157. int 21h
  158. popa
  159. ret
  160. PrnStr endp
  161.  
  162. ClrScr proc near
  163. pusha
  164. mov ax, 0600h
  165. mov bh, 07h
  166. mov cx, 0
  167. mov dx, 184fh
  168. int 10h
  169. popa
  170. ret
  171. ClrScr endp
  172.  
  173. .stack
  174. db 100h dup(?)
  175. end start
При использовании обязательна ссылка на http://DMTSoft.ru
up