.usando pseudo-op
Propósito
Permite que o usuário especifique um endereço base e atribua um número de registro base.
Sintaxe
Descrição
O pseudo-op .usando especifica uma expressão como endereço base, e designa um registro de base, supondo que o parâmetro Registo contenha o endereço do programa de Expressão no tempo de execução. Os nomes de símbolos não têm que ser previamente definidos.
Nota: O pseudo-op .usando não carrega o cadastro de base; o programador deve garantir que o endereço base seja carregado no registro de base antes de usar a referência de endereço implícito.
O pseudo-op .usando só afeta instruções com um endereço baseado em implícito. Pode ser emitido na seção de controle (csect) nome e todos os rótulos dos csects. Ele também pode ser usado no nome dsect e em todos os rótulos dos dsects. Outros tipos de símbolos externos não são permitidos (.extern).
Usando Faixa
O intervalo de um pseudo-op .usando (usando faixa) é -32768 ou 32767 bytes, iniciando no endereço base especificado no pseudo-op .usando . O montador converte cada referência de endereço implícito (ou expressão), que fica dentro do intervalo de uso, para uma forma de endereço com base explícita. Os erros são relatados para referências fora do intervalo de uso.
Dois usando intervalos se sobrepõem quando o endereço base de um .usando pseudo-op encontra-se dentro dos intervalos de outro .usando pseudo-op. Ao usar sobreposição de intervalo acontece, o montador converte a referência de endereço implícito escolhendo o menor deslocamento assinado a partir do endereço base como o deslocamento. O cadastro de base correspondente é usado na forma de endereço explícito. Isso se aplica apenas a endereços implícitos que aparecem após o segundo pseudo-op .usando .
.csect data[PR]
.long 0x1
dl: .long 0x2
base2: .long 0x3
.long 0x4
.long 0x4
.long 0x5
d12: .long 0x6
l 12, data_block.T(2) # Load addr. of data[PR] into r12
ca1 14, base2(12) # Load addr. of base2 into r14
.using base2, 14
l 4, d12 # Convert to 1 4, 0xc(14)
.using data[PR], 12
l 4, d12 # Converts to 1 4, 0xc(14)
# because base2 is still chosen
.toc
data_block.T: tc data_block[tc], data[PR]
Há uma tabela de uso interno que é usada pelo montador para rastrear o pseudo-op .usando . Cada entrada da tabela de uso aponta para o csect que contém a expressão ou rótulo especificado pelo parâmetro Expressão do pseudo-op .usando . A tabela usando é atualizada apenas pelos pseudo-ops .usando . A localização dos .usando pseudo-ops no programa de origem influencia o resultado da conversão de um endereço baseado em implícito. Os próximos dois exemplos ilustram essa conversão.
.using label1,4
.using label2,5
.csect data[RW]
label1: .long label1
.long label2
.long 8
label1_a: .long 16
.long 20
label2: .long label2
.long 28
.long 32
label2_a: .long 36
.long 40
.csect sub1[pr]
1 6,label1_a # base address label2 is
# chosen, so convert to:
# 1 6, -8(5)
1 6,label2_a # base address label2 is
# chosen, so convert to:
# 1 6, 0xc(5)
.csect data[RW]
label1: .long label1
.long label2
.long 12
label1_a: .long 16
.long 20
label2: .long label2
.long 28
.csect sub2[pr]
.using label1,4
1 6,label1_a # base address label1 is
# chosen, so convert to:
# 1 6, 0xc(4)
.using label2,5
1 6,label1_a # base address label2 is
# chosen, so convert to:
# 1 6, -8(5)
.csect data[PR]
.long 0x1
dl: .long 0x2
base2; .long 0x3
.long 0x4
.long 0x5
dl2: .long 0x6
1 12, data_block.T(2) # Load addr. of data[PR] into r12
1 14, data_block.T(2) # Load addr. of data[PR] into r14
.using data[PR], 12
1 4, dl2 # Convert to: 1 4, 0x14(12)
.using data[PR], 14
1 4, dl2 # Convert to: 1 4, 0x14(12)
.toc
data_block.T: .tc data_block[tc], data[PR]
Usando Domínio
O domínio de um pseudo-op .usando (o domínio de uso) começa onde o pseudo-op .usando aparece em um csect e continua até o final do módulo de origem, exceto quando:
- Um pseudo-op .gota subsequente especifica o mesmo registro de base atribuído pelo pseudo-op .usando anterior.
- Um pseudo-op .usando subsequente especifica o mesmo registro de base atribuído pelo pseudo-op .usando anterior.
Essas duas exceções fornecem uma maneira de usar um novo endereço base. Os próximos dois exemplos ilustram essas exceções:
.csect data[PR]
.long 0x1
dl: .long 0x2
base2; .long 0x3
.long 0x4
.long 0x5
dl2: .long 0x6
1 12, data_block.T(2) # Load addr. of data[PR] into r12
ca1 14, base2(12) # Load addr. of base2 into r14
.using base2, 14
1 4, dl2 # Convert to: 1 4, 0xc(14)
# base address base2 is used
1 14, data_block.T(2) # Load addr. of data[PR] into r14
.using data[PR], 14
1 4, dl2 # Convert to: 1 4, 0x14(14)
.toc
data_block.T: .tc data_block[tc], data[PR]
.csect data[PR]
.long 0x1
dl: .long 0x2
base2; .long 0x3
.long 0x4
.long 0x5
dl2: .long 0x6
1 12, data_block.T(2) # Load addr. of data[PR] into r12
ca1 14, base2(12) # Load addr. of base2 into r14
.using base2, 14
1 4, dl2 # Convert to: 1 4, 0xc(14)
.drop 14
.using data[PR], 12
1 4, dl2 # Convert to: 1 4, 0x14(12)
.toc
data_block.T: .tc data_block[tc], data[PR]
.csect data[PR]
.long 0x1
dl: .long 0x2
base2; .long 0x3
.long 0x4
.long 0x5
dl2: .long 0x6
1 4, dl2 # Error is reported here
1 12, data_block.T(2) # Load addr. of data[PR] into r12
1 14, data_block.T(2) # Load addr. of data[PR] into r14
.using data[PR], 12
1 4, dl2
1 4, 0x14(12)
.drop 12
1 4, dl2 # Error is reported here
.using data[PR], 14
1 4, dl2
1 4, 0x14(14)
.toc
data_block.T: .tc data_block[tc], data[PR]
.csect data1[PR]
dl3: .long 0x7
.using data[PR], 5
1 5, dl3 # Error is reported
# here, dl3 is in csect
# data1[PR] and
# Using table has no entry of
# csect data1[PR]
l 5, dl2 # No error, because dl2 is in
# data [PR]
Parâmetros
| Item | Descrição |
|---|---|
| Registrar | Representa o número de registro para expressões. Ele deve ser absoluto e deve avaliar para um inteiro de 0 31 inclusive. |
| Expressão | Especifica uma etiqueta ou uma expressão envolvendo um rótulo que representa o deslocamento ou o deslocamento relativo no programa. O parâmetro Expressão pode ser um símbolo externo se o símbolo for uma entrada csect ou Table of Contents (TOC) definida dentro da montagem. |
Exemplos
.csect data[rw]
.long 0x0, 0x0
d1: .long 0x25
# A read/write csect contains the label d1.
.csect text[pr]
.using data[rw], 12
l 4,d1
# This will actually load the contents of
# the effective address, calculated by
# adding the address d1 to the address in
# GPR 12, into GPR 4