2. Tipos de dados¶
Para a representação de valores inteiros,
a linguagem C dispões das designações base char e int,
dos modificadores de sinal signed e unsigned
e dos modificadores de dimensão short e long.
Como a linguagem C não define dimensões concretas para os tipos numéricos, foi definido,
ao nível da biblioteca normalizada,
a existência dos tipos intXX_t sendo XX
o número de bits dessa representação concreta.
A variante uintXX_t representa valores no conjunto dos números naturais
e a variante intXX_t representa valores no conjunto dos números relativos.~
Na programação em assembly do P16, tendo como referência a linguagem C, considera-se que os tipos básicos são representados com as dimensões em bits indicadas na Tabela 2.1.
Designação do tipo na linguagem C |
Representação binária no P16 |
|
|---|---|---|
Relativos |
Naturais |
bits |
|
|
8 |
|
|
16 |
|
|
16 |
|
|
32 |
|
|
8 |
|
|
16 |
|
|
32 |
A designação char é equivalente a unsigned char.
A designação int é equivalente a signed int.
A designação short é equivalente a short int.
A designação long é equivalente a long int.
2.1. Dados em memória¶
A memória de um computador é modelada como uma sequência de lugares onde se armazenam palavras de oito bits (um byte). Cada lugar, designado por “posição de memória”, tem capacidade para armazenar um byte e é identificado por um valor numérico designado por “endereço de memória”,
Os valores representados com palavras de 8 bits podem ser alojados em qualquer posição de memória.
Os valores representados com palavras de 16 bits, ocupam duas posições de memória contíguas. A posição de memória de endereço menor deve ser par – designa-se por “alinhamento par”. Na referenciação por endereço de uma palavra de múltiplos bytes, utiliza-se o endereço menor.
Por exemplo, na Figura 2.1 a palavra de 16 bits que suporta a representação da variável h, ocupa duas posições de memória, possui alinhamento par e o seu endereço é 0x1006.
Figura 2.1 Valores de tipos básicos em memória¶
2.2. Dados em registo¶
As instruções do P16 operam sobre palavras de 16 bits.
Ao carregar um valor a 8 bits (tipos char, int8_t ou uint8_t)
num registo do processador, é necessário extender a representação desse valor
para 16 bits.
Para o tipo char e uint8_t a extensão consiste em afetar
os bits das posições 8 a 15 com o valor zero.
Para o tipo int8_t a extensão consiste em afetar os bits das posições 8 a 15
com o valor do bit da posição 7 (bit de sinal).
Na Figura 2.2 exemplifica-se o carregamento de valores de diversos tipos em registos do processador. Os conteúdos dos registos estão escritos em hexadecimal. As zonas sombreadas correspondem a conteúdos acrescentados para extensão da representação. Por exemplo, o registo R1 recebe nas posições 0 a 7 o valor 0xD3, e nas posições 8 a 15 o valor 0xff para manter a representação do valor -45.
Figura 2.2 Valores de tipos básicos em registos¶