Предыдущий раздел | ДАМПИРОВАНИЕ ПАМЯТИ | Следующий раздел |
После того как мы сделали первую версию процедуры вывода на экран шестнадцатеричного представления 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
Рис. 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
Предыдущий раздел | В начало | Следующий раздел |