.usando pseudo-op

Propósito

Permite que o usuário especifique um endereço base e atribua um número de registro base.

Sintaxe

Item Descrição
.usando Expressão, Registo

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 .

No próximo exemplo, o intervalo de uso debase2edata[PR]sobreposição. A segunda instrução l é após o segundo .usando pseudo-op. Porque o deslocamento dedata[PR]parad12é maior do que o deslocamento debase2parad12,base2ainda é escolhido.

        .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.

Exemplo 1:

            .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)
Exemplo 2:

            .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)
Duas faixas de uso coincidem quando o mesmo endereço de base é especificado em dois diferentes .usando pseudo-ops, enquanto o registro de base usado é diferente. O montador utiliza o registro de numeração inferior como o registro de base ao converter para formulário de endereço baseado em explícito, pois a tabela de uso é pesquisada a partir do registro de menor numeração para o registro de numeração mais alta. O próximo exemplo mostra este caso:

        .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:

Exemplo 1:

        .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]
Exemplo 2:

        .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]
Nota: O montador não converte as referências de endereço implícito que estão fora do Domínio do Uso. Assim, se essas referências de endereço implícitas aparecem antes de qualquer pseudo-op .usando que define um endereço base do csect atual, ou após o .gota pseudo-ops soltar todos os endereços base do csect atual, é relatado um erro.
O próximo exemplo mostra as condições de erro:

        .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

O exemplo a seguir demonstra o uso do pseudo-op .usando :

.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