; Подключить файл мнемонических обозначений
; кодов управляющих клавиш
include "lst_2_03.inc"
; Подключить файл мнемонических обозначений цветов
include "lst_2_05.inc"
SEGMENT sseg para stack 'STACK'
DB 400h DUP(?)
ENDS
DATASEG
; Текстовые сообщения
Txt1 DB LIGHTMAGENTA,0,28,"Дамп оперативной памяти",0
DB YELLOW,2,0,"Адрес:",0
DB LIGHTGREEN,2,11
DB "Шестнадцатеричное представление:",0
DB LIGHTCYAN,2,61,"ASCII-коды:",0
DB LIGHTRED,21,0,"Введите число "
DB "или нажмите управляющую клавишу:",0
Txt2 DB 23,0, "Стрелка вниз - следующие 256 байт;",0
DB 23,35, "Стрелка вверх - предыдущие 256 байт;",0
DB 24,0, "Enter - завершение ввода адреса;",0
DB 24,33, "Esc - отмена ввода адреса;",0
DB 24,60, "F10 - выход.",0
; Количество введенных символов числа
CharacterCounter DB 0
; Позиция для ввода адреса на экране
OutAddress DB 21,47
; Строка для ввода адреса
AddressString DB 9 DUP(0)
; Строка пробелов для "затирания" числа
SpaceString DB 21,47,9 DUP(' '),0
; Начальный адрес
StartAddress DD 0
; Код команды
CommandByte DB 0
ENDS
CODESEG
|
|
;*****************************
;* Основной модуль программы *
;*****************************
PROC MemoryDump
Mov AX,DGROUP
Mov DS,AX
; Устанавливаем режим прямой адресации памяти
Call Initialization
; Установить текстовый режим и очистить экран
Mov AX,3
Int 10h
; Скрыть курсор - убрать за нижнюю границу экрана
mov [ScreenString],25
mov [ScreenColumn],0
Call SetCursorPosition
; Вывести текстовые сообщения на экран
Mov CX,5
Mov SI,offset Txt1
@@NextString1:
Call ShowColorString
loop @@NextString1
mov [TextColorAndBackground],WHITE
Mov CX,5
Mov SI,offset Txt2
@@NextString2:
Call ShowString
loop @@NextString2
; Установить белый цвет символов и черный фон
mov [TextColorAndBackground],WHITE
; Отобразить символы-разделители колонок
Mov AL,0B3h
mov [ScreenString],2
mov [ScreenColumn],9
Call ShowASCIIChar
mov [ScreenColumn],59
Call ShowASCIIChar
mov [ScreenString],3
mov [ScreenColumn],9
Call ShowASCIIChar
mov [ScreenColumn],59
Call ShowASCIIChar
; Инициализируем переменные
mov [StartAddress],0
mov [CommandByte],0
; ВНЕШНИЙ ЦИКЛ
@@q0: mov EBX,[StartAddress]
mov [ScreenString],4
Mov DX,16
@@q1: mov [ScreenColumn],0
; Отобразить линейный адрес первого байта в группе
mov [TextColorAndBackground],YELLOW
Mov EAX,EBX
Call ShowHexDWord
; Отобразить символ-разделитель колонок
mov [TextColorAndBackground],WHITE
inc [ScreenColumn]
Mov AL,0B3h
Call ShowASCIIChar
inc [ScreenColumn]
; Отобразить очередную группу байт
; в шестнадцатеричном коде
Mov CX,16
mov [TextColorAndBackground],LIGHTGREEN
@@q2: mov AL,[GS:EBX]
Call ShowByteHexCode
inc [ScreenColumn]