Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.150.178] |
|
Сообщ.
#1
,
|
|
|
А Б С О Л Ю Т Н Ы Е П Е Р Е М Е Н Н Ы Е
Память для переменных, объявленных в разделе Var, выделяется при старте блока, в котором содержится данный раздел, в порядке объявления имен переменных. Местоположе-ние блока в пространстве оперативной памяти ЭВМ определяет операционная система. В то же время Турбо Паскаль предоставляет возможность программисту так описать переменные, чтобы им были назначены заранее заданные адреса. Такие переменные называются абсолют-ными; их описание после имени типа должно содержать так называемое абсолютное пред-ложение. Синтаксис абсолютного предложения: absolute + целое без знака + ':' + целое без знака или absolute + иденитификатор переменной Структура абсолютного предложения имеет два альтернативных варианта. В первом варианте производится задание абсолютного адреса в форме, принятой в опе-рационной системе MS DOS. Пример 1. Type ScreenChar = record Symbol : char; Attrib : byte; end; ScreenAr = array[1..25,1..80] of ScreenChar; Var y : real absolute $A100:$0000; Screen : ScreenAr absolute $B800:$0000; Здесь переменным y и Screen назначаются конкретные адреса оперативной памяти. В частности, значение $B800:$0000 определяет фиксированный адрес видеопамяти. Примечание. В конструкции record .. end объединяются переменные различного типа (см.раздел FAQ "Записи"). Во втором варианте для абсолютной переменной назначается адрес другой, ранее объ-явленной переменной. Пример 2 (аналогично примеру 2 статьи FAQ "Приведение типов"). Type ByteAr = array[1..2] of byte; Var W : word; Br : ByteAr absolute W; Begin Br[1]:=10; Br[2]:=20; Writeln(W,' ',Br[1],' ',Br[2]); W:=2500; Writeln(W,' ',Br[1],' ',Br[2]); В результате работы программы будет отпечатано: 5130 10 20 2500 196 9 Переменные W и Br адресуют одно и то же поле памяти. Другими словами, одно и то же поле памяти размером два байта имеет два имени: имя W и имя Br. Если в программе ис-пользуется имя W, то это поле можно обрабатывать как переменную типа word, для имени Br допустимые операции определяются именем типа ByteAr. При совмещении переменных с помощью директивы absolute не рекомендуется в раз-деле Var использовать описание типа вместо имени типа. Нарушение этого правила не ана-лизируется компилятором, но может привести к неправильной работе программы, вплоть до ее "зависания", особенно при использовании сопроцессора. Например, вместо описания Var A : record x,y : real; k,m,n : integer end; B : array[1..3] of real absolute A; следует применять описание Type RecType = record x,y : real; k,m,n : integer end; ArType = array[1..3] of real; Var A : RecType; B : ArType absolute A; По мотивам лекций Назаренко В.И. |
Сообщ.
#2
,
|
|
|
P.S. from vot:
Напомню, что использовать числовые адресные значения сегментов памяти считается дурным тоном, поскольку они актуальны только в REAL режиме. Стоит перейти в защищенный режим, и программа перестанет работать. Поэтому, вместо фактических системных адресов рекомендуется использовать специально предусмотренные для этого символические константы. Например, вместо $B800, $A000 следует использовать: SegB800, SegA000 и т.д. И еще: если упоминаете ФАК - делайте ссылку на конкретный URL ! |