O problema a ser solucionado é, dados dois numeros em notação científica, achar o resultado da soma desses dois números e mostrar o mesmo em notação científica. No HIPO-II estaremos representando um numero em notação científica através de dois números que podem variar de 0000 a 9999, sendo o primeiro a mantissa (onde o primeiro dígito necessariamente é diferente de zero) e o segundo o expoente. Exemplo: 3,456. 10789 é representado no HIPO-II pelos números 3456 e 0789.
Uma possível solução para o problema (clique aqui para fazer o download do arquivo no formato .bin):
Endereço |
Linguagem de máquina |
Linguagem simbólica (de montagem) |
00 |
+3190 |
LER mant1 |
01 |
+3191 |
LER exp1 |
02 |
+3192 |
LER mant2 |
03 |
+3193 |
LER exp2 |
04 |
+1191 |
CEA exp1 |
05 |
+2293 |
SUB exp2 |
06 |
+1294 |
CAE dif |
07 |
+5445 |
DNE inverte |
08 |
+1194 |
inverteu: CEA dif |
09 |
+2298 |
SUB quatro |
10 |
+5370 |
DPZ imp |
11 |
+1194 |
loop1: CEA dif |
12 |
+5519 |
DNZ exp_OK |
13 |
+2196 |
SOM menos_um |
14 |
+1294 |
CAE dif |
15 |
+1192 |
CEA m2 |
16 |
+6200 |
ADD |
17 |
+1292 |
CAE mant2 |
18 |
+5111 |
DES loop1 |
19 |
+1190 |
exp_OK: CEA mant1 |
20 |
+2192 |
SOM mant2 |
21 |
+1295 |
CAE aux |
22 |
+6200 |
ADD |
23 |
+1290 |
CAE mant1 |
24 |
+6200 |
ADD |
25 |
+6200 |
ADD |
26 |
+6200 |
ADD |
27 |
+5273 |
DPO corrige |
28 |
+5473 |
DNE corrige |
29 |
+1195 |
CEA aux |
30 |
+1290 |
CAE mant1 |
31 |
+5460 |
loop2: DNE loop_N |
32 |
+5163 |
DES loop_P |
33 |
+5000 |
loop3 : NOP |
34 |
+1191 |
CEA exp1 |
35 |
+2196 |
SOM menos_um |
36 |
+1291 |
CAE exp1 |
37 |
+1190 |
CEA mant1 |
38 |
+6100 |
ADE |
39 |
+1290 |
CAE mant1 |
40 |
+5131 |
DES loop2 |
45 |
+2396 |
inverte: MUL menos_um |
46 |
+1294 |
CAE dif |
47 |
+1190 |
CEA mant1 |
48 |
+1295 |
CAE aux |
49 |
+1192 |
CEA mant2 |
50 |
+1290 |
CAE mant1 |
51 |
+1195 |
CEA aux |
52 |
+1292 |
CAE mant2 |
53 |
+1191 |
CEA exp1 |
54 |
+1295 |
CAE aux |
55 |
+1193 |
CEA exp2 |
56 |
+1291 |
CAE exp1 |
57 |
+1195 |
CEA aux |
58 |
+1293 |
CAE exp2 |
59 |
+5108 |
DES inverteu |
60 |
+2197 |
SOM mil |
61 |
+5570 |
DNZ imp |
62 |
+5133 |
DES loop2 |
63 |
+2297 |
SUB mil |
64 |
+5370 |
DPZ imp |
65 |
+5133 |
DES loop2 |
70 |
+4190 |
imp: IMP mant1 |
71 |
+4191 |
IMP exp1 |
72 |
+7000 |
PAR |
73 |
+1191 |
corige: CEA exp1 |
74 |
+2296 |
SUB menos_um |
75 |
+1291 |
CAE exp1 |
76 |
+5170 |
DES imp |
90 |
- |
mant1: |
91 |
- |
exp1: |
92 |
- |
mant2: |
93 |
- |
exp2: |
94 |
- |
dif: |
95 |
- |
aux: |
96 |
-0001 |
menos_um: |
97 |
+1000 |
mil: |
98 |
+0004 |
quatro: |
Consideremos dois números cuja soma queremos saber, 5.875x1054 e 1.234x1056 por exemplo. Para realizarmos a soma desses dois numeros, devemos transformá-los de forma que ambos estejam com o mesmo expoente na base de dez (isso equivale a dizer que vírgula está debaixo de vírgula). No HIPO-II essa alteração seria dada da seguinte forma:
mantissa do menor numero |
expoente |
0000 5876 |
0054 |
0000 0587 |
0055 |
0000 0058 |
0056 |
Agora que os expoentes se igualaram, basta somar-mos o conteúdo do acumulador com a mantissa do maior número:
0000 0058 + 0000 1234 = 0000 1292
A mantissa da resposta é o número que está no acumulador, sendo que o expoente final é aquele do maior número
Note que se a diferença entre os expoentes dos dois números for maior ou igual a 4, a resposta será o maior número, uma vez que o outro número é muito pequeno para ser somado ao maior.
Outra observação importante é que em certos casos o resultado da soma terá 5 dígitos significativos. Nesses casos, basta deslocar os dígitos do acumulador uma posição à direita, pegar os 4 digitos menos significativos do acumulador (que será a solucao procurada) e somar 1 ao expoente do maior número (que será o expoente da resposta).