Db 16,8,' avr nioodit sz a p c',0
DB 17,8,' CMF TPLFFFF FF F F F',0
DB 18,0,'Флаги:',0
DB 20,8,'PCN A V NETEMP',0
DB 21,8,'GDW M P ETSMPE',0
DB 22,0,'CR0:',0
DB 24,15
DB 'Для продолжения работы нажмите любую клавишу',0
CODESEG
;**********************************************
;* ВЫВЕСТИ НА ЭКРАН ДАМП РЕГИСТРОВ ПРОЦЕССОРА *
;* (процедура параметров не имеет) *
;**********************************************
PROC ShowRegs FAR
Pushad
Pushfd
Push DS
Mov BP,SP
Mov AX,DGROUP
Mov DS,AX
; Сохраняем глобальные переменные
mov AL,[TextColorAndBackground]
Push AX
push [ScreenString]
push [ScreenColumn]
; Очищаем экран
Call ClearScreen
; Вывести 21 строку текста
mov [TextColorAndBackground],YELLOW
Mov SI, offset REGROW_386
Mov CX,22
@@GLB: call ShowString
loop @@GLB
mov [TextColorAndBackground],WHITE
mov EAX,[BP+34] ;Показать EAX
mov [ScreenString],0
mov [ScreenColumn],6
Call ShowHexDWord
mov EAX,[BP+22] ;Показать EBX
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexDWord
mov EAX,[BP+30] ;Показать ECX
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexDWord
mov EAX,[BP+26] ;Показать EDX
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexDWord
mov EAX,[BP+10] ;Показать ESI
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexDWord
mov EAX,[BP+6] ;Показать EDI
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexDWord
mov EAX,[BP+14] ;Показать EBP
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexDWord
mov EAX,[BP+18] ;Показать ESP
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexDWord
mov AX,[BP+38] ;Показать IP
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexWord
mov AX,[BP+40] ;Показать CS
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexWord
mov AX,[BP] ;Показать DS
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexWord
Mov AX,ES ;Показать ES
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexWord
Mov AX,FS ;Показать FS
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexWord
Mov AX,GS ;Показать GS
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexWord
Mov AX,SS ;Показать SS
inc [ScreenString]
mov [ScreenColumn],6
Call ShowHexWord
add [ScreenString],4
mov [ScreenColumn],8
mov EAX,[BP+2]
Call ShowBinDWord
add [ScreenString],4
mov [ScreenColumn],8
Mov EAX,CR0
Call ShowBinDWord
; Ожидаем нажатия любого символа на клавиатуре
Call GetChar
; Очищаем экран
Call ClearScreen
; Восстановить глобальные переменные
pop [ScreenColumn]
pop [ScreenString]
Pop AX
mov [TextColorAndBackground],AL
Pop DS
Popfd
Popad
Ret
ENDP ShowRegs
ENDS
В программе LAddrTest, показанной в листинге 2.3 [1], используются процедуры из листингов 2.1 и 2.2 для включения режима линейной адресации и демонстрации изменения содержимого сегментных регистров, которое при этом происходит (процедура установки линейного режима перезаписывает теневой регистр у регистра GS, а регистры ES и FS просто обнуляет). После выполнения программы режим линейной адресации данных сохраняется, и любая другая программа, в том числе написанная на языке высокого уровня, может через GS обращаться к любой области памяти по физическому адресу.
Листинг 2.3 – Включение режима линейной адресации
IDEAL
P386
LOCALS
MODEL MEDIUM
; Подключить файл мнемонических обозначений
; кодов управляющих клавиш
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
MODEL MEDIUM
; Подключить файл мнемонических обозначений
; кодов управляющих клавиш
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
; Строка для ввода адреса