; Подключить файл мнемонических обозначений
; кодов управляющих клавиш
include "lst_2_03.inc"
; Подключить файл мнемонических обозначений цветов
include "lst_2_05.inc"
SEGMENT sseg para stack 'STACK'
DB 400h DUP(?)
ENDS
DATASEG
; Текстовые сообщения
Text1 DB 0,19,"Включение режима "
DB "линейной адресации данных",0
DB 11,0,"Для просмотра "
DB "содержимого регистров процессора",0
DB 12,0,"перед запуском процедуры "
DB "перехода в режим",0
DB 13,0,"линейной адресации нажмите "
DB "любую клавишу.",0
Text2 DB 11,0,"Произведено переключение в "
DB "режим линейной адресации.",0
DB 12,0,"Для просмотра содержимого "
DB "регистров процессора",0
DB 13,0,"нажмите любую клавишу.",0
Text3 DB 11,0,"После завершения данной "
DB "программы регистр GS",0
DB 12,0,"может использовать для "
DB "линейной адресации",0
DB 13,0,"любая другая программа.",0
DB 24,18,"Для выхода из программы "
DB "нажмите любую клавишу.",0
ENDS
CODESEG
;*****************************
;* Основной модуль программы *
;*****************************
PROC LAddrTest
Mov AX,DGROUP
Mov DS,AX
; Установить текстовый режим и очистить экран
Mov AX,3
Int 10h
; Скрыть курсор - убрать за нижнюю границу экрана
mov [ScreenString],25
mov [ScreenColumn],0
Call SetCursorPosition
; Вывести первое текстовое сообщение
; на экран зеленым цветом
mov [TextColorAndBackground],LIGHTGREEN
Mov CX,4
Mov SI,offset Text1
@@NextString1:
Call ShowString
loop @@NextString1
; Ожидать нажатия любой клавиши
Call GetChar
; Занести контрольное число в дополнительные
; сегментные регистры данных
Mov AX,0ABCDh
Mov ES,AX
Mov FS,AX
Mov GS,AX
; Показать содержимое регистров процессора
Call far ShowRegs
; Установить режим прямой адресации памяти
Call Initialization
; Вывести второе текстовое сообщение
; на экран голубым цветом
mov [TextColorAndBackground],LIGHTCYAN
Mov CX,3
Mov SI,offset Text2
@@NextString2:
Call ShowString
loop @@NextString2
; Ожидать нажатия любой клавиши
Call GetChar
; Показать содержимое регистров процессора
Call far ShowRegs
; Вывести третье текстовое сообщение
; на экран желтым цветом
mov [TextColorAndBackground],YELLOW
Mov CX,4
Mov SI,offset Text3
@@NextString3:
Call ShowString
loop @@NextString3
; Ожидать нажатия любой клавиши
Call GetChar
; Установить текстовый режим
Mov ax,3
Int 10h
; Выход в DOS
Mov AH,4Ch
Int 21h
ENDP LAddrTest
ENDS
; Подключить набор процедур вывода/вывода данных
include "lst_2_02.inc"
; Подключить подпрограмму, переводящую сегментный
; регистр GS в режим линейной адресации
include "lst_3_01.inc"
; Подключить подпрограмму, отображающую на экране
; содержимое регистров процессора
include "lst_3_02.inc"
END
Листинг 2.4 [1] демонстрирует использование линейной адресации для отображения содержимого памяти компьютера на экране, то есть выдачи дампа памяти. Программа MemoryDump позволяет просматривать все адресное пространство, а не только оперативную память. Можно, например, считывать память видеоконтроллера или вообще неиспользуемые области.
Кроме процедур ввода/вывода общего назначения, в MemoryDump используются также следующие подпрограммы:
- процедура ShowASCIIChar осуществляет вывод символа в ASCII-коде в заданную позицию экрана;
- процедура HexToBin32 осуществляет перевод числа (введенного с клавиатуры адреса) из шестнадцатеричного кода в двоичный;
- процедура GetAddressOrCommand принимает команды, вводимые с клавиатуры (введенное число воспринимается как линейный адрес памяти в шестнадцатеричном коде, нажатие на управляющие клавиши — как команда).
Листинг 2.4 – Использование линейной адресации для отображения на экран содержимого оперативной памяти
IDEAL
P386
LOCALS