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