Важным моментом, еще не упомянутым, является то, что поскольку для доступа к разным областям памяти используются разные инструкции, в оборудовании отсутствует единое понятие «указатель». Любой адрес, который, как известно, находится в пространстве DATA / IDATA, может быть однозначно идентифицирован однобайтовым указателем; аналогично любому адресу, который, как известно, находится в пространстве PDATA. Любой адрес, который, как известно, находится в пространстве CODE, может быть идентифицирован двухбайтовым указателем; аналогично любому адресу, который, как известно, находится в пространстве XDATA. Однако во многих случаях подпрограмма, подобная memcpy
, не будет заранее знать, какое пространство памяти следует использовать с переданными указателями. Для этого компиляторы 8x51 обычно используют трехбайтовый тип указателя, который может использоваться для доступа к объектам в любом пространстве памяти (один байт выбирает, какой тип инструкций должен использоваться с указателем, а другие байты содержат значение). Объявление указателя, например:
char *ptr;
будет определять трехбайтовый указатель, который может указывать на любое пространство памяти. Изменение декларации на
char xdata *data ptr;
будет определять двухбайтовый указатель, который хранится в пространстве DATA, но который может указывать только на вещи в пространстве XDATA. Аналогично
char data * data ptr;
будет определять двухбайтовый указатель, который хранится в пространстве DATA, но который может указывать только на вещи в пространствах DATA и IDATA. Код, который использует указатели, указывающие на известное пространство данных, будет намного быстрее (возможно, в десять раз), чем код, который использует трехбайтовые указатели «общего назначения».