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