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

; Строка для ввода адреса

Наши рекомендации