Предыдущая глава | ДАМПИРОВАНИЕ ПАМЯТИ | Следующий раздел |
Перейдем к разработке более сложной программы на ассемблере, выполняющей дампирование (вывод на экран) содержимого памяти подобно тому, как это делает Debug при выполнении команды D. В процессе этой разработки производится изучение новых приемов программирования на ассемблере, к которым относятся применение относительной регистровой адресации для обработки последовательности однотипных величин, а также первоначальное знакомство с системными программами BIOS.
Разработку программы, выполняющей дампирование, целесообразно начать с создания процедуры, выполняющей вывод на экран содержимого шестнадцати байтов. Именно столько информации удобно разместить на одной строке экрана. Назовем данную процедуру 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
%include ‘Video_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 ,
то вернитесь назад и найдите ошибку.
Предыдущая глава | В начало | Следующий раздел |