Предыдущий раздел ДАМПИРОВАНИЕ   ПАМЯТИ Следующий раздел

12.2. Дампирование 256 байтов памяти

После того как мы сделали первую версию процедуры вывода на экран  шестнадцатеричного представления 16-и байтов памяти, перейдем к изготовлению программы, выполняющей дамп 256 байтов памяти.

Число 256 обусловлено следующим. Во-первых, дальнейшей целью наших лабораторных работ является создание программы, позволяющей выполнять редактирование текстовой информации, находящейся в сегменте памяти. Во-вторых, объем сегмента равен 65536 байт и 256 есть наибольшее число, которое одновременно отвечает двум требованиям: 1) является делителем числа 65536; 2) содержимое 256 байтов одновременно умещается на экране. Далее будем называть такой объем памяти сектором. Поэтому назовем процедуру, выполняющую дамп 256 байтов, как  Disp_sector .

До сих пор мы делали вывод символов, которые размещались на одной строке экрана. При выполнении дампа 256 байтов нам потребуются 16 строк. Поэтому потребуется выполнять переход с одной строки экрана на следующую строку. Для осуществления такого перехода достаточно "вывести" на экран два управляющих символа кода ASCII. Первый символ имеет код 0Dh и называется "возврат каретки". В результате его "вывода" последующий вывод на экран начнется с самой левой позиции строки. Второй управляющий символ имеет код 0Ah и называется "перевод строки". Его "вывод" и реализует перевод строки экрана.

Назовем процедуру, выполняющую перевод строки как Send_crlf (crlf означает "Carriage Return –-Line Feed." – "Возврат каретки – Перевод строки “). Текст файла  Cursor.asm, содержащего эту процедуру:

 

cr                equ    13             ; Возврат  каретки

lf                 equ    10             ; Перевод  строки

;

;                   Перевод  строки  экрана

;                   ---------------------------------

;

Send_crlf:

push           ax

push           dx

mov            ah,2                     ;  Функция  вывода

mov            dl,cr                     ; Выводимый  символ

int              21h                      ; Вывод  символа

mov            dl,lf

int               21h                      ;           --- // ---

              pop             dx

              pop             ax

              ret

 

Рис. 42.  Дерево подпрограмм и файловая структура программы вывода  на экран сектора

 

Псевдооператор  equ указывает транслятору, что имя cr эквивалентно числу 13, а имя lf эквивалентно числу 10. Поэтому везде в программе, где транслятор встретит данное имя, он заменит его указанным числом. Применение данного псевдооператора позволяет программисту записывать в программе вместо чисел более удобные их символьные обозначения. Например, вместо 13  записывать cr.

На рис.42 приведены дерево подпрограмм и файловая структура программы вывода на экран 256 байтов из переменной Sector. Переменная Address  изображена пунктиром, так как в первой версии программы она не используется.

В в е д и т е  файл  Сursor.asm  и скорректируйте файл   Disp_sec.asm  в соответствии с его новым вариантом:

 

org         l00h

jmp    Disp_sector

;           Данные программы

Sector                    times  16     db  10h                ;  Первая строка байтов

times  16     db  11h

         . . . . . . . . . . . . . . . . . . . . .

times  16     db  1Fh                ;  Последняя  строка  байтов

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

;

;                Отображает  на  экран  сектор (256 байт)

;                --------------------------------------------------------

;    Вызовы:    Disp_line,  Send_crlf

;

Disp_sector:

xor              dx,dx                  ;  Начало  Sector

mov            cx,16                   ;  Число строк 16

.M:                       call             Disp_line             ;  Вывод строки

call             Send_crlf             ;  Перевод строки

add             dx,16                   ;  Номер следующего байта

loop            .M                       ;  Проверка числа строк

int               20h                    ;  Выход в DOS

;

; Процедура дампирует 16 байт памяти в одну строку шестнадцат. чисел

; ------------------------------------------------------------------------------------------------

;  Входы:             DX – номер первого байта строки в  Sector

;  Вызовы :          Write_char,   Write_hex

;  Читается :      Sector

;

Disp_line:

push  bx

push  cx

push  dx

mov   bx,dx                             ; В  ВХ номер первого байта

mov   cx, 16                            ; Счетчик байтов

.M:                  mov   dl, [Sector+bx]              ; Получить один байт

call    Write_byte_hex             ; Вывод шестнад. числа

mov   dl, ’ ‘                           ; Вывод  на  экран

call    Write_char                    ;   пробела

inc     bx                                ; Возврат  за

loop  .M                                 ;   следующим байтом

pop   dx

pop   cx

pop   bx

ret

%include    ‘Video_io.asm’     ; Подсоединение процедур

%include    ‘Cursor.asm’        ;                  --//--

 

Обратите внимание на изменения, которые мы внесли в процедуру Disp_line. Теперь она имеет входной параметр, передаваемый в регистре DX. Это номер байта в поле Sector, начиная с которого следует вывести на экран 16  байтов. Есть и другие изменения в данной процедуре, не требующие пояснений.

В ы п о л н и т е  ассемблирование файла Disp_sес. Выполнив  программу, вы должны получить изображение на экране:

 

              10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10

              11  11  11  11  11  11  11  11  11  11  11  11  11  11  11  11

              12  12  12  12  12  12  12  12  12  12  12  12  12  12  12  12

                                                  .     .     .

              1F  1F  1F 1F  1F  1F  1F  1F  1F 1F  1F  1F 1F  1F  1F  1F

 


Предыдущий раздел В начало Следующий раздел