Introduzir um nível ISA, a ser interpretado pelo microprogarma que esteja rodando na microarquitetura da figura 4.6
Vamos chamar de macroarquitetura (em contraste com microarquitetura), a arquitetura do conjunto de instruções do nível ISA.
A figura 4.8 exemplifica o funcionamento da PIlha após a chamada de vários procedimentos (A, B, C, D)
Figura 4.8 Uso da pilha para armazenar variáveis locais. (a) Enquanto A está ativo. (b) Após A ter chamado B. (c) Após B ter chamado C. (d) Após Ce B terem retornado e A ter chamado D
a1=a2+a3
Figura 4.9 Uso de uma pilha de operandos para execução de cálculos aritméticos
Figura 4.10 As várias partes da memória IJVM
1. O Pool de Constantes
2. O Quadro de Variáveis Locais
3. A Pilha de Operandos
4. A Área do Procedimento
- CPP, LV e SP apontam para palavras (4bytes cada palavra)
- PC aponta para bytes (cada instrução ocupa 1byte)
Hexa | Mnemônico | Significado |
Ox10 | BIPUSH byte | Colocar um byte na pilha |
Ox59 | DUP | Copia a palavra do topo da pilha e coloca a cópia no topo da pilha |
OxA7 | GOTO deslocamento |
Desvio incondicional |
Ox60 | IADD | Retira da pilha as duas palavras do topo; coloca no topo da pilha o resultado da soma dessas palavras |
Ox7E | IAND | Retira da pilha as duas palavras do topo; coloca no topo da pilha o resultado da operação AND booleana dessas palavras |
Ox99 | IFEQ deslocamento | Retira da pilha a palavra do topo; desvia se ela for igual a zero |
Ox9B | IFLT deslocamento | Retira da pilha a palavra do topo; desvia se ela for menor que zero |
Ox9F | IF _ICMPEO deslocamento | Retira da pilha as duas palavras do topo; desvia se elas forem iguais |
Ox84 | IINC varnum const | Soma uma constante a uma variável local |
Ox15 | ILOAD varnum | Coloca uma variável local no topo da pilha |
OxB6 | INVOKEVIRTUAL deslocamento | Chama um procedimento |
Ox80 | IOR | Retira da pilha as duas palavras do topo; coloca no topo da pilha o resultado da operação OR booleana dessas palavras |
OxAC | IRETURN | Retorna de um procedimento trazendo um valor inteiro |
Ox36 | ISTORE varnum | Retira a palavra do topo da pilha; armazena essa palavra numa variável local |
Ox64 | ISUB | Retira da pilha as duas palavras do topo; coloca no topo da pilha o resultado da subtração dessas palavras |
Ox13 |
LDC_W índice |
Coloca no topo da pilha uma constante vinda do
pool de constantes |
OxOO | NOP | Não faz nada |
Ox57 | POP | Retira da pilha a palavra do topo |
Ox5F | SWAP | Troca de posição as duas palavras do topo da pilha |
OxC4 | WIDE | Prefixo de instrução; indica que a próxima instrução tem um índice de 16 bits |
Fig 4.11 O conjunto de instruções IJVM. Os operandos byte, const e varnum tem todos 1byte. Já os operandos disp, indice e deslocamento têm 2 bytes.
Mecanismo usado para implementar uma chamada a procedimento (INVOKEVIRTUAL deslocamento , veja Figuras 4.12 e 4.13)
- Chamador coloca na pilha uma referência (ponteiro) para o objeto a ser chamado, identificado por OBJREF
- Coloca parâmetros (Parameter 1, Parameter 2, ...) do procedimento na pilha
- A instrução INVOKEVIRTUAL é, então, executada
- As variáveis locais do procedimento são colocadas na pilha, sobre os parâmetros
- Os ponteiros PC e LV do chamador são salvos no topo da pilha
- A execução da instrução IRETURN reverte as operações realizadas pela INVOKEVIRTUAL (veja figura 4.13)
- A pilha retorna ao seu estado anterior, sem os parametros do procedimento, e os valores de LV e PC anteriores são recuperados
- O valor de retorno do procedimento é colocado no topo da pilha
Fig 4.12 (a) Memória antes da execução de INVOKEVIRTUAL. (b) Memória após a execução de INVOKEVIRTUAL
Fig 4.13 (a) Memória antes da execução do IRETURN. (b) Memória após a execução do IRETURN
Compilação da Linguagem JAVA para IJVM
A Figura 4.14(a) mostra um fragmento de um programa JAVA.
Quando esse código for entregue ao compilador JAVA, ele deve produzir um programa na linguagem de montagem da IJVM como mostrado em 4.14(b)
O montador JAVA transforma o programa em linguagem de montagem para o programa binário (linguagem de máquina) mostrado na figura 4.14(c)
O código compilado pode ser interpretado como:
- primeiro , j e k são colocados no topo da pilha (1 e 2)
- depois j e k são somados e guardados na variável i (3 e 4)
- depois o valor de i e o valor 3 são colocados na pilha
- esses valores são comparados e, se iguais, a execução é desviada para L1 (7)
- se valores são diferentes, o valor da variável j e o valor 1 são colocados na pilha (8 e 9)
- o valor de j é subtraido de 1 e armazenado na variável j (10 e 11)
- um desvio para um local L2 é executado (12)
i =j + k; 1 ILOAD j // i = j + k Ox15 Ox02
if (i == 3) 2 ILOAD k Ox15 Ox03
k= 0; 3 IADD Ox60
else 4 ISTORE i Ox36 Ox01
j = j -1; 5 ILOAD i // se (i ==3) Ox15 Ox01
6 BIPUSH 3 Ox10 Ox03
7 IF_ICMPEQ L1 Ox9F OxOO OxOD
8 ILOAD j // j = j - 1 Ox15 Ox02
9 BIPUSH 1 Ox10 Ox01
10 ISUB Ox64
11 ISTORE j Ox36 Ox02
12 GOTO L2 OxA7 OxOO OxO7
13 L1: BIPUSH 0 // k = 0 Ox10 OxOO
14 ISTORE k Ox36 Ox03
15 L2:
(a) (b) (c)
Fig 4.14 (a) Fragmento de um programa JAVA. (b) O código correspondente na linguagem de montagem Java. (c) O progrma em IJVM codificado em hexadecimal
A pilha de operandos do programa IJVM acima é mostrada na figura 4.15
Figura 4.15 Estado da pilha após a execução de cada instrução do programa da Figura 4.14 (b)
1. A Fig. 4.2 mostra uma maneira de fazer com que A apareça na saída da UAL. Invente outra forma, diferente dessa.
2. O Mic-1 gasta 1 ns para carregar o MIR, 1 ns para habilitar um registrador para que este coloque seu conteúdo no barramento B, 3 ns aguardando a operação da UAL e do deslocador, e 1 ns para que os resultados se propaguem de volta aos registradores. O período do clock do Mic-1 é de 2 ns. Essa máquina pode rodar a 100 MHz? E a 150 MHz?
3. Na Fig. 4.6, o campo da microinstrução que controla o acesso ao barramento B está codificado em 4 bits, mas o campo do barramento C é controlado por um mapa de bits.* Explique por quê.
4. Na Fig. 4.6 existe uma caixa identificada como "Bit de mais alta ordem". Mostre como seria o circuito eletrônico para a implementação dessa função lógica.
5. Quando o campo JMPC de uma microinstrução é habilitado, o conteúdo do MBR passa pela função OR junto com o campo NEXT_ADDRESS, para formar o endereço da próxima instrução. Existe alguma circunstância na qual faz sentido o campo NEXT _ADDRESS ser igual a Ox1FF e usar JMPC?
6. Suponha que, no exemplo da Fig. 4.14(a), o comando
i = O;
seja colocado após o comando if. Como seria o código em linguagem de montagem resultante dessa modificação? Considere que o compilador utilizado faz uma otimização do código gerado.
7. Considere o seguinte comando Java:
i = j + k + 4;
encontre duas traduções diferentes desse comando para a linguagem de montagem do IJVM.
______________
* O controle é feito por meio de um mapa de bits quando cada sinal de controle é representado por um bit na microinstrução. (NT.)