Mov SI,offset SpaceString
Call ShowString
Mov SI,offset OutAddress
Call ShowString
@@GetNextChar:
; Отобразить курсор в новой позиции ввода
mov [ScreenColumn],47
mov AL,[CharacterCounter]
add [byte ptr ScreenColumn],AL
Call SetCursorPosition
; Ожидать ввода следующего символа
Call GetChar
Cmp AL,0
jne @@Address
; Проанализировать код нажатой клавиши
Cmp AH,B_Esc ;отмена ввода адреса
je @@GetAddressOrCommand
@@TestF10:
cmp AH,F10 ;"Выход"
jne @@TestRubout
mov [CommandByte],AH
jmp @@End
@@TestRubout:
cmp AH,B_RUBOUT ;"Забой"
jne @@TestEnter
cmp [CharacterCounter],0
je @@AddressError
; Передвинуть признак конца строки
; на разряд влево
Dec DI
dec [CharacterCounter]
mov [byte ptr DS:DI],0
; Отобразить число на экране
Mov SI,offset SpaceString
Call ShowString
Mov SI,offset OutAddress
Call ShowString
jmp @@GetNextChar
@@TestEnter:
Cmp AH,B_Enter ;завершение ввода числа
jne @@AddressError
mov [CommandByte],AH
Mov SI,offset AddressString
Call HexToBin32
mov [StartAddress],EAX
jmp short @@End
@@AddressError:
Call Beep
jmp @@GetNextChar
; ОБРАБОТКА "КОМАНД"
@@Command:
cmp AH,F10 ;"Выход"
jne @@TestDn
mov [CommandByte],AH
jmp short @@End
@@TestDn:
cmp AH,B_DN ;"Стрелка вниз"
jne @@TestUp
mov [CommandByte],AH
add [StartAddress],256
jmp short @@End
@@TestUp:
cmp AH,B_UP ;"Стрелка вверх"
jne @@CommandError
mov [CommandByte],AH
sub [StartAddress],256
jmp short @@End
@@CommandError:
Call Beep
jmp @@GetAddressOrCommand
@@End: popad
Ret
ENDP GetAddressOrCommand
ENDS
; Подключить подпрограмму, переводящую сегментный
; регистр GS в режим линейной адресации
include "lst_3_01.inc"
; Подключить набор процедур вывода/вывода данных
include "lst_2_02.inc"
END
Метод Родена проверен не только на процессорах Intel, но и на клонах, изготовленных AMD, Cyrix, IBM, TI [1]. На всех протестированных компьютерах переход в режим линейной адресации данных проходил нормально, то есть метод не только работоспособен, но и универсален. Метод Родена в свое время не был оценен по достоинству, поскольку обычный объем памяти персональных компьютеров составлял тогда 1-2 Мбайт, и преимущества линейной адресации не были очевидными. Резкое увеличение объема памяти в устройствах массового применения произошло гораздо позже — начиная с 1995 года. В это же время был внедрен новый стандарт на видеоконтроллеры (VESA 2.0) и появилась возможность линейной адресации видеопамяти, однако о методе Родена программисты уже успели забыть. Между тем, совместное использование линейной адресации данных в оперативной памяти и линейного пространства видеопамяти дает наибольший выигрыш по скорости выполнения программ и позволяет сильно упростить алгоритмы построения изображений.
Таким образом, метод Томаса Родена обладает следующими основными преимуществами [1]:
- имеется свободный доступ ко всем аппаратным ресурсам компьютера;
- возможна линейная адресация всей оперативной памяти и памяти видеоконтроллера;
- логические и физические адреса отображенной на шину процессора памяти периферийных устройств совпадают;
- метод совместим с клонами процессоров Intel;
- сохраняется возможность использования всех функций DOS и BIOS, как в обычном реальном режиме работы процессора.
Последнее свойство особенно важно: не нужно разрабатывать собственные программы для работы с периферийными устройствами на уровне регистров, следовательно, не проявляются и не создают лишних проблем нестандартные особенности оборудования.
Основной недостаток метода Родена — существенное ослабление защиты памяти. Поскольку отменен контроль границы сегмента данных, работающая с линейным пространством подпрограмма в случае ошибки адресации или зацикливания может не только разрушить смежные данные, но и вообще стереть все содержимое оперативной памяти, в том числе все программы и резидентную часть операционной системы. Чаще всего стирается таблица векторов прерываний, размещенная в начале адресного пространства. Следовательно, необходимо ограничивать число подпрограмм, работающих с линейной адресацией, и очень тщательно их отлаживать.
Второй недостаток прямо вытекает из первого — работа в реальном режиме DOS и ослабление защиты не позволяют реализовать многозадачность. Однако для решения прикладных задач часто вполне достаточно фоново-оперативного режима работы, когда всеми ресурсами системы распоряжается один программный модуль, а остальные предназначены для узкоспециальных целей и вызываются на короткие промежутки времени через механизм прерываний. Иными словами, доступ к видеопамяти и всей оперативной памяти должен быть только у основной программы, а вспомогательные процедуры и драйверы периферийных устройств могут хранить свои данные только в основной области памяти DOS (то есть, в пределах первого мегабайта адресного пространства). Линейная адресация, сама по себе, не накладывает слишком жестких ограничений на работу системы, поскольку персональные компьютеры вообще функционируют в основном в однозадачном режиме: аппаратные средства для реализации многозадачности имеются уже давно, но сильные ограничения создают физиологические и психологические особенности человека, который сидит за компьютером. Любая серьезная работа требует от оператора полной концентрации внимания на одном процессе. То же самое относится к компьютерным играм — невозможно одновременно играть в Quake и редактировать текст.
Третий недостаток: строковые команды процессора х86 в реальном режиме не пригодны для работы с сегментом, настроенным на линейной адресацию памяти. Это не очень существенный недостаток, поскольку внутренняя RISC-архитектура современных процессоров позволяет выполнять группу из нескольких простых команд с той же скоростью, что и одну сложную составную команду, выполняющую аналогичную операцию. Кроме того, процессор выполняет внутренние операции быстрее, чем операции обращения к оперативной памяти, и гораздо быстрее, чем операции чтения/записи в видеопамять.
В целом можно сказать, что предложенный Роденом режим — это в первую очередь режим учебно-отладочный. Его очень удобно применять в процессе освоения методов непосредственной работы с периферийными устройствами. Во-первых, линейная адресация абсолютно прозрачна — область памяти устройства можно просматривать прямо по физическому адресу. Во-вторых, исследуемое устройство можно рассматривать изолированно, исключив опасность возникновения паразитных взаимодействий с другими аппаратными компонентами и посторонним программным обеспечением.
Ниже приведены файлы, включаемые в программу, приведенную в листинге 2.4 [1].
Листинг 2.3 – Мнемонические обозначения кодов управляющих клавиш
; Для клавиш, традиционно выполняющих определенные
; функции, приведены краткие комментарии справа.
; Для "текстовых" управляющих клавиш вместо скан-кодов
; используются ASCII-коды:
B_RUBOUT equ 8 ;забой