double arrow

Dataseg

Label REGROW_386 byte

DB 0,0,'EAX =',0

DB 1,0,'EBX =',0

DB 2,0,'ECX =',0

DB 3,0,'EDX =',0

DB 4,0,'ESI =',0

DB 5,0,'EDI =',0

DB 6,0,'EBP =',0

DB 7,0,'ESP =',0

DB 8,0,'IP =',0

DB 9,0,'CS =',0

DB 10,0,'DS =',0

DB 11,0,'ES =',0

DB 12,0,'FS =',0

DB 13,0,'GS =',0

DB 14,0,'SS =',0

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: