
Captulo 29 - funes de endereos de memria

ADDR - funo que nos retorna o endereo de memria do objeto passado como  
parmetro. O operador @ tem o mesmo efeito. Sua sintaxe:
ADDR (<x>) : POINTER;
Exemplo:
PROGRAM teste_addr;
VAR
  x : STRING[10];
  pt : POINTER;
BEGIN
  pt := ADDR (x);   {pt contm o endereo de x}
  pt := ADDR (pt);   {pt contm seu prprio endereo}
END.

CSEG - esta funo nos retorna o valor corrente do registrador de memria
CS, Code Segment. Sua sintaxe:
CSEG : WORD;

DSEG - esta funo nos retorna o valor corrente do registrador de memria
DS, Data Segment. Sua sintaxe:
DSEG : WORD;

SSEG - esta funo nos retorna o valor corrente do registrador de memria
SS, Stack Segment. Sua sintaxe:
SSEG : WORD;

SPTR - esta funo nos retorna o valor corrente do registrador de memria
SP, Stack Pointer. Sua sintaxe:
SPTR : WORD;
 
PTR - esta funo converte o segmento de base e o endereo offset, passados
como parmetros, em um valor do tipo ponteiro. Sua sintaxe:
PTR (<seg>, <ofs> : WORD) : POINTER;

SEG - funo que retorna o endereo do segmento do argumento passado como
parmetro, podendo este argumento ser uma constante, varivel, procedimento
ou ainda uma funo. O resultado retornado  do tipo WORD. Sua sintaxe:
SEG (<argumento>) : WORD;

OFS - funo que retorna o endereo offset do argumento passado como par-
metro, podendo este argumento ser uma constante, varivel, procedimento ou
ainda uma funo. O resultado retornado  do tipo WORD. Sua sintaxe: 
OFS (<argumento>) : WORD;
PROGRAM teste_endereos;
PROCEDURE writehex (w : WORD);
CONST
  hex : ARRAY[0..$F] OF CHAR = 0123456789ABCDEF;
BEGIN
  WRITE (hex[hi(w)shr 4],
  hex [hi(w) AND $F],
  hex [LO(w) shr 4],
  hex [LO(w) AND $F]);
END;
VAR
  i : INTEGER;
BEGIN
  WRITE (o segmento de cdigo corrente est em $);
  WRITEHEX (CSEG);
  WRITELN;
  WRITE (o segmento de dados corrente est em $);
  WRITEHEX (DSEG);
  WRITELN;
  WRITE (o segmento de stack est em $);
  WRITEHEX (SSEG);
  WRITELN;
  WRITE (o stack pointer est em $);
  WRITEHEX (SPtr);
  WRITELN;
  WRITE (e o endereo offset de "i" est em $);
  WRITEHEX (OFS(i));
  WRITE (e no segmento $);
  WRITEHEX (SEG(i));
  READLN;
END.  

  No exemplo anterior, os valores de endereos esto em hexadecimal e desta
forma foi necessria uma rotina que os convertesse.
