double arrow
Mov DI,offset AddressString

mov [byte ptr DS:DI],0

; Очистить позицию ввода (забить пробелами)

Mov SI,offset SpaceString

Call ShowString

; Установить курсор в позицию ввода

mov [ScreenColumn],47

mov AL,[CharacterCounter]

add [byte ptr ScreenColumn],AL

Call SetCursorPosition

; Ввести цифру или команду

Call GetChar

; Адрес или команда?

Cmp AL,0

jz @@Command

; Введена первая цифра числа

; ВВОД АДРЕСА В ШЕСТНАДЦАТЕРИЧНОМ КОДЕ

@@Address:

; Проверка на диапазон '0'-'9'

cmp AL,'0'

jb @@AddressError

cmp AL,'9'

jbe @@WriteChar

; Проверка на диапазон 'A'-'F'

cmp AL,'A'

jb @@AddressError

cmp AL,'F'

jbe @@WriteChar

; Проверка на диапазон 'a'-'f'

cmp AL,'a'

jb @@AddressError

cmp AL,'f'

ja @@AddressError

@@WriteChar:

; Проверяем количество цифр

cmp [CharacterCounter],8

jae @@AddressError

inc [CharacterCounter]

; Записываем цифру в число

mov [DS:DI],AL

Inc DI

; Передвинуть признак конца строки

; в следующий разряд

mov [byte ptr DS:DI],0

; Отобразить число на экране

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-коды:






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