Anda di halaman 1dari 7

Exercício

 para  o  Neander  
Siga o primeiro exemplo e desenvolva os demais programas em linguagem de
máquina para o computador hipotético Neander.

1) Faça um programa para somar duas variáveis representadas em complemento de dois.


As variáveis e o resultado estão dispostos segundo o mapa de memória abaixo:
Posição 128: primeira variável
Posição 129: segunda variável
Posição 130: resultado
Variáveis Constantes
A = 5 (posição 128)
B = 3 (posição 129)
R = 0 (posição 130)
Programa ASM
// Carrega o Acumulador com A
LDA A

// Soma acumulador com B ( AC = AC + B )


ADD B

// Transfere resultado para R


STA R

HLT //Fim
Programa em Mnemônicos
0:LDA 128
2:ADD 129
4:STA 130
6:HLT
Programa em Ling. de Máquina
32 128 48 129 16 130 240

2) Faça um programa para subtrair duas variáveis representadas em complemento de


dois. As variáveis e o resultado estão dispostos segundo o mapa de memória abaixo:
Posição 128: primeira variável
Posição 129: segunda variável
Posição 130: resultado
Variáveis Constantes
A = 5 (posição 128) UM = 1 (posição 131)
B = 3 (posição 129)
R = 0 (posição 130)
Programa com variáveis
// Carrega o Acumulador com -B
LDA B
NOT
ADD UM
// Soma acumulador com A ( AC = AC + A ) = ( -B + A )
ADD A
// Transfere resultado para R
STA R
HLT // Fim
Programa em Mnemônicos
0: LDA 129
2: NOT
3: ADD 131
5: ADD 128
7: STA 130
9: HLT
Programa em Ling. de Máquina
32 129 96 48 131 48 128 16 130 240

3) Faça um programa para somar três variáveis representadas em complemento de dois.


As variáveis e o resultado estão dispostos segundo o mapa de memória abaixo:
Posição 128: primeira variável
Posição 129: segunda variável
Posição 130: terceira variável
Posição 131: resultado

Variáveis Constantes
A = 5 (posição 128)
B = 3 (posição 129)
C = 7 (posição 130)
R = 0 (posição 131)
Programa ASM
// Carrega o Acumulador com A
LDA A

// Soma acumulador com B ( AC = AC + B )


ADD B

// Soma acumulador com C ( AC = AC + C )


ADD C

// Transfere resultado para R


STA R

HLT //Fim

Programa em Mnemônicos
0:LDA 128
2:ADD 129
4:ADD 130
6:STA 131
8:HLT

Programa em Ling. de Máquina


32 128 48 129 48 130 16 131 240

4) Faça um programa que determine qual a maior de 3 variáveis representadas em


complemento de dois. As variáveis e o resultado estão dispostos segundo o mapa de
memória abaixo:
Posição 128: primeira variável
Posição 129: segunda variável
Posição 130: terceira variável
Posição 131: resultado

Variáveis Constantes
A = 5 (posição 128) UM = 1 (posição 132)
B = 3 (posição 129)
C = 8 (posição 130)
R = 0 (posição 131)
Programa com variáveis
// Transfere o valor de A para R (R = A)
// Motivo: O maior valor (até agora o único) encontrado até aqui.
0: LDA A
2: STA R

// Comparar o maior valor com B


// Carrega o Acumulador com -R
4: LDA R
6: NOT
7: ADD UM

// Soma acumulador com B ( AC = B - R )


9: ADD B

// Se resultado negativo vai para 17


// Motivo: R é maior que B, logo, saltar para comparar R com C
11: JN 17

// Transfere o valor de B para R (R = B)


// Motivo: B é maior que R.
13: LDA B
15: STA R

// Comparar o maior valor com C


// Carrega o Acumulador com -R
17: LDA R
19: NOT
20: ADD UM

// Soma acumulador com C ( AC = C - R )


22: ADD C

// Se resultado negativo vai para 30


// Motivo: R é maior que B, logo, R contém a resposta certa
24: JN 30

// Transfere o valor de C para R (R = C)


// Motivo: C é maior que R.
26: LDA C
28: STA R

30: HLT
Programa em Mnemônicos
0: LDA 128
2: STA 131
4: LDA 131
6: NOT
7: ADD 132
9: ADD 129
11: JN 17
13: LDA 129
15: STA 131
17: LDA 131
19: NOT
20: ADD 132
22: ADD 130
24: JN 30
26: LDA 130
28: STA 131
30: HLT
Programa em Ling. de Máquina
32 128 16 131 32 131 96 48 132 48 129 144 17 32 129 16 131 32 131 96
48 132 48 130 144 30 32 130 16 131 240
5) Faça um programa que realize multiplicação de duas variáveis a partir de somas
sucessivas. As variáveis e o resultado estão dispostos segundo o mapa de memória
abaixo:
Posição 128: primeira variável
Posição 129: segunda variável
Posição 130: resultado

Variáveis Constantes
A = 5 (posição 128) UM = 1 (posição 132)
B = 3 (posição 129)
R = 8 (posição 130)
T = 0 (posição 131)
Programa ASM
// Copia B para T
LDA B
STA T

:INICIO
// Se T for zero, então FIM
JZ FIM

// R = R + A
LDA R
ADD A
STA R

// T = T - 1
LDA UM
NOT
ADD UM
ADD T
STA T

// LOOP
JMP INICIO

:FIM
HLT
Programa em Mnemônicos
0: LDA 129
2: STA 131
4: JZ 23
6: LDA 130
8: ADD 128
10: STA 130
12: LDA 132
14: NOT
15: ADD 132
17: ADD 131
19: STA 131
21: JMP 4
23: HLT
Programa em Ling. de Máquina
32 129 16 131 160 23 32 130 48 128 16 130 16 130 32 132 96 48 132 48
131 16 131 128 4 240

6) Faça um programa que determine qual o maior dos valores colocados na memória de
dados a partir da posição inicial (128). O resultado (ou seja o maior valor), deve
aparecer na primeira posição livre de memória na área reservada aos dados.

Variáveis Constantes
EI = 128 (posição 253) – Endereço inicial UM = 1 (posição 255)
EF = 0 (posição 254) – Endereço Final
R=0 (posição EF )
Programa ASM
// Coloca na posição 5 o endereço inicial de memoria
0:LDA 253
2:STA 5

// Busca Endereço final (proximo endereço vazio = zero))


// [BUSCA EF]
4:LDA X (pos 5) // Valor não importa foi alterado pela instrução 2
6:JZ 16 // Se Zero desvia para 16

// X = X + 1
8:LDA 5
10:ADD 255
12:STA 5
14:JMP 4 // Desvia para 4

// [ALTERA REFERENCIAS PARA EF]


16:LDA 5
18:STA 37
20:STA 48
22:STA 59
24:STA 254

// Busca Maior - Começa na posição inicial (Vairável EI)

// Coloca EI na posição (Y) 35 e (K) 53 e 57


26:LDA 253
28:STA 35
30:STA 53
32:STA 57

// Primeiro valor é o maior por enquanto


34:LDA Y //(pos 35)Valor não importa foi alterado pela instrução 28
36:STA R //(pos 37)Valor não importa foi alterado pela instrução 18
// [LOOP Principal]
// Se K = EF então FIM
38:LDA 53 // (Variavel K)
40:NOT
41:ADD 255
43:ADD 254
45:JZ 70 // Se chegou ao endereço final então FIM

47:LDA R //(pos 48)Valor não importa foi alterado pela instrução 20


49:NOT
50:ADD 255
52:ADD K //(pos 53)Valor não importa foi alterado pelas instruções 30
e 64
54:JN 60

// K é maior que R, então R = K


56:LDA K //(pos 57)Valor não importa foi alterado pela instrução 32 e
66
58:STA R //(pos 59)Valor não importa foi alterado pela instrução 22

// INCREMENTA K (K = K + 1)
60:LDA 53
62:ADD 255
64:STA 53
66:STA 57
68:JMP 38

70:HLT
Programa em Mnemônicos
0 LDA 253
2 STA 5
4 LDA 132
6 JZ 16
8 LDA 5
10 ADD 255
12 STA 5
14 JMP 4
16 LDA 5
18 STA 37
20 STA 48
22 STA 59
24 STA 254
26 LDA 253
28 STA 35
30 STA 53
32 STA 57
34 LDA 128
36 STA 132
38 LDA 53
40 NOT
41 ADD 255
43 ADD 254
45 JZ 70
47 LDA 132
49 NOT
50 ADD 255
52 ADD 132
54 JN 60
56 LDA 132
58 STA 132
60 LDA 53
62 ADD 255
64 STA 53
66 STA 57
68 JMP 38
70 HLT
Programa em Ling. de Máquina
32 253 16 5 32 132 60 16 32 5 48 255 16 5 28 4 32 5 16 37 16 48 16 59
16 254 32 253 16 35 16 53 16 57 32 128 16 132 32 53 96 48 255 48 254
160 70 32 132 96 48 255 48 132 144 60 32 132 16 132 32 53 48 255 16 53
16 57 128 38 240

Anda mungkin juga menyukai