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

Перейдем к разработке более сложной программы на ассемблере, выполняющей дампирование (вывод на экран) содержимого памяти подобно тому, как это делает Debug при выполнении команды D. В процессе этой разработки производится изучение новых приемов программирования на ассемблере, к которым относятся применение относительной регистровой  адресации для обработки последовательности однотипных  величин, а также первоначальное знакомство с системными программами BIOS.

12.1. Дампирование шестнадцати байтов

Разработку программы, выполняющей дампирование, целесообразно начать с создания процедуры, выполняющей вывод на экран содержимого шестнадцати байтов. Именно столько информации удобно разместить на одной строке экрана. Назовем данную процедуру Disp_line. Для каждого из 16-ти  байтов она выводит на экран соответствующее шестнадцатеричное представление, разделяя два соседних числа пробелами.

Ниже приведен файл  Disp_sec.asm, который содержит начальную версию процедуры  Disp_line:

org    l00h

jmp    Disp_line

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

Sector     db     10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h    ; Образец

         db     18h, 19h, 1Ah, 1Bh,1Ch,1Dh,1Eh,1Fh     ;    текста

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

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

;                                     шестнадцатеричных  чисел

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

;  Вызовы:     Write_hex,   Write_char

;  Чтение:       Sector

;

Disp_line:

xor    bx,bx                             ; Обнуление  BX

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

.M:   

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

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

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

call    Write_char                    ;   пробела

inc     bx                                 ; Возврат за следующим

loop  .M                                 ;   байтом

int     20h                               ; Возврат в DOS

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

 

 

В начале программы находится оператор безусловного перехода, осуществляющий переход через область данных, расположенную после оператора перехода, на начало области исполнительных операторов программы. Для исполнительных операторов новым является использование относительной регистровой адресации в операторе:

Hex_loop:       mov   dl, [Sector+bx]

Байт программы, отмеченный меткой Sector, имеет смещение 259 (100h+3) относительно самого первого байта сегмента памяти, выделенного программе (команда jmp имеет длину три байта). Тогда при выполнении на ЦП машинной команды mov, соответствующей записанному оператору, реальный адрес второго операнда будет определен по формуле

       R = (DS) * 16 + 259 + (ВХ).

Задав нулевое содержимое регистра BX: (ВХ) = 0, мы получим адрес байта с меткой Sector, в который транслятором было помещено число l0h. Меняя содержимое регистра ВХ от 0 до 15, мы можем с помощью приведенного выше оператора mov записать в регистр DL содержимое любого из 16-ти байтов, проинициализированных по нашей просьбе транслятором.

З а п и ш и т е  файл  Disp_sec.asm, а затем получите файл  Disp_sec.com. Если после запуска программы вы не увидите:

10  11  12  13  14  15  16  17  18  19  IA  1В  1C  1D  1E  1F  ,

то вернитесь назад и найдите ошибку.

 


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