6.2 Trabalho Pratico BIP
6.2 Trabalho Pratico BIP
6.2 Trabalho Pratico BIP
O modelo BIP III -> extensão do BIP II com acréscimo de instruções com foco no suporte à
operações bit a bit. Inclusão de unidade lógica e mudanças no decodificador e junção da
unidade aritmética com unidade lógica (chamada de Unidade Funcional). As instruções lógicas
baseiam-se na BIP II com adição da classe de instruções de lógica booleana e destacamento
lógico (NOT, AND, ANDI, OR, ORI, XOR, XORI, SLL e SRL).
O modelo BIP IV -> extensão do BIP III com mesmas características de arquitetura. Foram
aderidos a antecipação de classes de instruções, de manipulação de vetores e suporte a sub-
rotinas. As instruções de controle são as mesmas do BIP III com adições das intruções: de
deslocamento lógico (SLL e SRL); manipulação de vetor (LDV e STOV); suporte a procedimentos
(RETURN e CALL).
2. Explique como funciona a pilha de instruções disponível no BIP IV. Como ela funciona.
R: O código de operação contém cinco bits, enquanto que o operando possui onze bits. Os
modos de endereçamento são direto, indireto e imediato. Seus registradores: ACC
(acumulador); PC (controlador de programa); STATUS (registrador de status); INDR (registrador
de índice); SP (apontador do topo da pilha). O BIP IV contém 28 instruções. Os componentes
possuem uma pilha de suporte a procedimentos onde é salvo o endereço de memória da
instrução seguinte à chamada da sub-rotina em uma unidade de manipulação de vetores.
.data
atribui_a_a : 0
atribui_b_b : 0
subtrai_r : 0
subtrai_x : 0
subtrai_y : 0
s:0
.text
JMP _PRINCIPAL
_ATRIBUI_A:
LDI 5
STO ATRIBUI_A_a
LD ATRIBUI_A_a
RETURN 0
_ATRIBUI_B:
LDI 2
STO ATRIBUI_B_b
LD ATRIBUI_B_b
RETURN 0
_SUBTRAI:
LD SUBTRAI_x
SUB SUBTRAI_y
STO SUBTRAI_r
LD SUBTRAI_r
RETURN 0
_PRINCIPAL:
CALL _ATRIBUI_A
STO SUBTRAI_x
CALL _ATRIBUI_B
STO SUBTRAI_y
CALL _SUBTRAI
STO s
HLT 0
- R:
- JMP _PRINCIPAL;
- CALL ATRIBUI_A;
- LDI 5;
- STO ATRIBUI_A_a; -> entra valor 5 na variável ATRIBUI_A_a;
- LD_ATRIBUI_A_a;
- RETURN 0;
- STO SUBTRAI_x; -> entra valor 5 na variável de parâmetro SUBTRAI_x;
- CALL ATRIBUI_B;
- LDI 2;
- STO_ATRIBUI_B_b -> entra valor 2 na variável ATRIBUI_B_b;
- LD ATRIBUI_B_b;
- RETURN 0;
- STO SUBTRAI_y; -> entra valor 2 na variável SUBTRAII_y;
- CALL_SUBTRAI;
- LD SUBTRAI_x; -> pega valor da variável de parâmetro;
- SUB _SUBTRAI_y -> subtrai o valor da variável y de parâmetro;
- STO _SUBTRAI_r -> entra valor 3 de subtração dos dois parâmetros;
- LD SUBTRAI_r;
- RETURN 0;
- STO s -> entra valor 3 da variável de retorno SUBTRAI_r na variável s;
- HLT 0.
c) Quantas variáveis foram utilizadas durante o programa?
d) Qual será o endereço de dados que será armazenado o resultado final deste
programa?
e) Qual o resultado final da execução do programa, que será armazenado na variável “s”?
R:
R: O programa executa um erro na instrução: “ADD b”. O erro diz: “Valor 65534 não
pode ser representado por 16 bits. O valor excede o limite de dados que podem ser
representados pelo formato de instrução do BIP IV onde o tipo de dado é inteiro com sinal,
variando de -32768 a +32767.
.data
m_i : 0
m_result : 0
m_a : 0
m_c : 0
j:0
k:0
.text
JMP _PRINCIPAL
_M:
LDI 0
STO M_result
LDI 1
STO M_i
LD M_c
STO 1000
LDI 1
STO 1001
LD M_i
PARA1:
SUB 1000
BGT FIMPARA1
LD M_result
ADD M_a
STO M_result
LD M_i
ADD 1001
STO M_i
JMP PARA1
FIMPARA1:
LD M_result
RETURN 0
_PRINCIPAL:
LDI 3
STO k
LDI 2
STO j
LD k
STO M_a
LD j
STO M_c
CALL _M
STO k
LD k
STO $out_port
HLT 0
R: O código chama uma funcão “m” que multiplica o primeiro valor pelo segundo. O
primeiro valor é passado pela variável “k” e o segundo valor é passado pela variável “j”
pelos parâmetros da função (“a” e “c” respectivamente).
7. Escreva um programa que leia um número e eleve este número ao quadrado. Use sub-
rotinas. Após escrever e compilar o programa, insira o valor 5, e indique quantas vezes a
instrução ADD será executada para apresentar o valor de 5²?
R: Foram executadas 10 vezes o comando ADD, pois para que a subrotina do comando
“para” do portugol fosse executada cinco vezes, foi preciso adicionar um valor em um
endereço de memória que fizesse uma “contagem”. Dentro de cada uma dessas cinco
execuções, fez-se a soma de 5 ao resultado anterior. Em resumo, houveram cinco rotinas
de “5 + resultado”.
Ao simularmos este programa no BIPIDE, ele não executa conforme o esperado, mas também
não apresenta erro. Simplesmente termina o programa sem completar todo o vetor. Simule e
analise a após responda qual foi o motivo que fez isso ocorrer. Dica: analise o comportamento
da memória de dados.
R: Não existirão endereços de memória suficientes para guardar todos os valores dos
endereços dos vetores, mais as variáveis e endereços de sub rotinas.
R: Sente caso, não sobram endereços de memória mesmo sem os endereços utilizados para
subrotinas. Portanto o programa mostra o erro.
procedimento principal()
declaracoes
inicio
vetor[i]<-i
fimpara
fim
Após a sua compilação, a simulação do código executa 38 instruções (do código assembly).
Com auxílio do simulador do BIPIDE, descreva o passo a passo de cada instrução, comentando
o que ocorreu em cada um dos passos. Não esqueça de comentar o estado dos registradores
em cada passo e se houve transferência da memória ou para a memória.
R:
.text
_PRINCIPAL:
STO 1000 -> valor do acumulador passado para o endereço de memória 1000.
STO 1001 -> valor do acumulador passado para o endereço de memória 1001.
SUB 1000 -> valor subtraído do acumulador para ver se a subrotina “para” será executada
novamente.
BGT FIMPARA1 -> atualiza o valor do registrador caso o resultado da operação anterior na
ULA tenha sido maior que zero. (Nesse caso o foi igual a -1).
STO 1002 -> pega o valor do acumulador e joga na posição 1002 de memória.
STOV vetor -> armazena o conteúdo do acumulador em uma posição da memória definida
pelo operando somado ao conteúdo do registrador INDR.
ADD 1001 -> carrega o valor da posição de memória 1001 e soma com o valor do
acumulador, salva o resultado no acumulador.
JMP PARA1 -> atualiza o valor do registrador PC com o endereço de uma instrução para
realizar um desvio incondicional.
PARA1:
SUB 1000 -> valor subtraído do acumulador para ver se a subrotina “para” será executada
novamente.
BGT FIMPARA1 -> atualiza o valor do registrador caso o resultado da operação anterior na
ULA tenha sido maior que zero. (Nesse caso o valor foi igual a zero).
STO 1002 -> pega o valor do acumulador e joga na posição 1002 de memória.
ADD 1001 -> carrega o valor da posição de memória 1001 e soma com o valor do
acumulador, salva o resultado no acumulador.
JMP PARA1 -> atualiza o valor do registrador PC com o endereço de uma instrução para
realizar um desvio incondicional.
PARA1:
SUB 1000 -> valor subtraído do acumulador para ver se a subrotina “para” será executada
novamente.
BGT FIMPARA1 -> atualiza o valor do registrador caso o resultado da operação anterior na
ULA tenha sido maior que zero. (Nesse caso o foi igual a -1).
FIMPARA1:
11. Analise o código assembly do BIP (abaixo) e responda o que faz o programa (algoritmo) e
qual o resultado final é apresentado ao final da execução do programa.
.data
m_i : 0
m_result : 0
m_a : 0
m_c : 0
s_n : 0
k:0
.text
JMP _PRINCIPAL
_M:
LDI 0
STO M_result
LDI 1
STO M_i
LD M_c
STO 1000
LDI 1
STO 1001
LD M_i
PARA1:
SUB 1000
BGT FIMPARA1
LD M_result
ADD M_a
STO M_result
LD M_i
ADD 1001
STO M_i
JMP PARA1
FIMPARA1:
LD M_result
RETURN 0
_S:
LD S_n
STO M_a
LD S_n
STO M_c
CALL _M
RETURN 0
_PRINCIPAL:
LDI 3
STO S_n
CALL _S
STO $out_port
HLT 0
declaracoes
inteiro i, result
inicio
result <- 0
result<-result+a
fimpara
retornar result
fim
inteiro s(inteiro n)
inicio
retornar m(n,n)
fim
procedimento principal()
declaracoes
inteiro k
inicio
escreva(s(3))
fim