70
12.2. Вътрешно представяне на данните
използвате като такава в подпрограмите си на асемблер. Но след връщане в
интерпретатора съдържанието и може да се промени.
Таблица на разпределението на нулевата страница
*
$0000..$007f - резервирана за BIOS, UniBIOS и UniDOS;
*
$0080..$00af - резервирана за интерпретатора на Y код. Не трябва да бъде
променяна по време на работа на програма на UniPascal;
*
$00b0..$00df - работна памет за интерпретатора на Y код. Може да бъде
използвана за работна и в подпрограми на асемблер;
*
$00e0..$00ff - не се използва от интерпретатора на Y код.
12.2. Вътрешно представяне на данните
Във всички случаи простите променливи (тези които не са елементи на масив или
запис) се разполагат на граница на дума (2 байта) и са с големина, кратна на 16 бита,
независимо от това колко бита са необходими за представянето й. Това правило важи и
за елементите на масиви или записи, като изключение се прави само при
непосредствено указване на пакетиране (низовете са пакетирани по премълчаване).
12.2.1. Непакетирани променливи
При представянето на променливи от прост тип младшият байт в думата
предхожда старшия, въпреки че на този процесор (СМ 601) това е обратно.
Изключение правят променливите от тип указател, които се представят в нормалния за
процесора вид (старши-младши).
За променливите, за които са достатъчни не повече от 8 бита, се използват целите
16 бита. Това означава, че проста променлива, обявена от тип shortint, byte ..., всъщност
заема два байта и се интерпретира като променлива от тип integer, word, ... Ако е
включена проверката за граници {$R+}, тя се извърша както трябва и това, че се
използват 16 бита е 'прозрачно' за програмиста. Но ако се използват някои от
специалните процедури, като например MOVE, BLOCKREAD, FILLCHAR, ... трябва да
се внимава старшият байт да е винаги 0 (или $FF при отрицателна стойност). Например:
function GetByte(var f: file): byte;
var b: byte;
begin
b:= 0; {
 нулиране на старшия байт
}
BlockRead(f, b, 1);
GetByte:= b;
end { GetByte };
или
function GetByte(var f: file): byte;
var b: byte;
begin
BlockRead(f, b, 1);
GetByte:= b and $ff;{
 връщаме само младшия байт
 }
end { GetByte };
Ако е изключена проверката на границите, при даването на стойност също може
да се получи по-голяма стойност, отколкото разрешава типа (ако е включена, ще
получите грешка по време на изпълнение). Използването на стандартните процедури
<<  <  GO  >  >>

Вернуться к началу сайта