1. Os 16 registradores de propósito geral
O z/Architecture tem 16 registradores de propósito geral (GPR — General Purpose Registers), numerados de R0 a R15. Cada um tem 64 bits (8 bytes), mas pode ser usado em modo de 32 bits (baixos 32 bits) em operações clássicas.
🦕 Analogia — registradores como bancada de trabalho
Imagine uma bancada com 16 gavetas. A memória principal é o depósito — tem muita capacidade, mas você precisa trazer o item para a bancada (registrador) antes de trabalhar. Todas as operações Assembler acontecem nas gavetas. Você carrega da memória para a gaveta, opera, e guarda de volta na memória.
2. Convenções de uso dos registradores
Embora qualquer registrador possa ser usado para qualquer fim, existe uma convenção de uso forte no z/OS que todo programa deve respeitar — especialmente ao chamar e ser chamado por outros programas:
| Registrador | Uso convencional | Deve ser preservado? |
|---|---|---|
R0 | Parâmetro / resultado / não preservado | Não |
R1 | Ponteiro para lista de parâmetros | Não |
R2–R11 | Uso geral — trabalho e variáveis locais | Sim (se alterado) |
R12 | Base register (endereçamento de código) | Sim |
R13 | Ponteiro para a savearea (área de salvamento) | Sim |
R14 | Endereço de retorno ao chamador | Não precisa preservar (caller salva) |
R15 | Endereço do programa chamado / Return Code | Não precisa preservar |
A savearea (área de salvamento) é uma estrutura de 18 fullwords (72 bytes em 32-bit / 144 bytes em 64-bit) onde o programa salva os registradores do chamador. Isso permite que, ao retornar, o chamador encontre seus registradores intactos.
3. Base register e endereçamento
O Assembler z/Architecture usa endereçamento relativo ao base register. Toda instrução que referencia memória usa a forma deslocamento(base) ou deslocamento(índice,base).
Isso significa que o código do programa não usa endereços absolutos — usa deslocamentos a partir de um registrador base. Isso permite que o programa seja carregado em qualquer endereço de memória e funcione corretamente.
4. BALR e USING — o par fundamental
O BALR (Branch And Link Register) carrega o endereço da próxima instrução em um registrador. O USING informa ao assembler qual registrador usar como base e a partir de qual endereço.
O USING é uma diretiva de montagem — não gera código. Ele instrui o assembler a calcular os deslocamentos dos labels usando R12 como base. Sem o USING, o assembler não sabe qual registrador usar e dá erro.
💡 Limite de 4096 bytes por base register
Um base register só endereça 4096 bytes (12 bits de deslocamento) a partir do seu valor. Programas maiores que 4096 bytes precisam de múltiplos base registers. A instrução USING *,R12,R11 define dois base registers, e o assembler automaticamente usa o correto para cada label.
5. Modelo de memória e tipos de dado
A memória do z/OS é endereçada em bytes. Os tipos de dado em Assembler são declarados com as diretivas DC (Define Constant) e DS (Define Storage):
| Tipo | Significado | Exemplo | Tamanho |
|---|---|---|---|
C | Character (EBCDIC) | DC CL8'NOME ' | 1 byte por char |
F | Fullword (inteiro 32-bit) | DC F'12345' | 4 bytes |
H | Halfword (inteiro 16-bit) | DC H'100' | 2 bytes |
G | Doubleword (inteiro 64-bit) | DC G'99999' | 8 bytes |
P | Packed decimal | DC P'12345' | variável |
Z | Zoned decimal | DC Z'12345' | 1 byte por dígito |
X | Hexadecimal | DC X'FF00' | 1 byte por 2 hex |
A | Address (ponteiro 32-bit) | DC A(DADOS) | 4 bytes |
A diferença entre DC e DS: DC inicializa a memória com um valor; DS apenas reserva o espaço sem inicializar.