O problema a ser solucionado é, dados dois números em notação científica, achar o resultado da multiplicação 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 |
+3150 |
LER mantissa_1 |
01 |
+3151 |
LER expoente_1 |
02 |
+3152 |
LER mantissa_2 |
03 |
+3153 |
LER expoente_2 |
04 |
+1150 |
CEA mantissa_1 |
05 |
+2352 |
MUL mantissa_2 |
06 |
+1256 |
CAE menos_sig |
07 |
+6200 |
ADD |
08 |
+6200 |
ADD |
09 |
+6200 |
ADD |
10 |
+6200 |
ADD |
11 |
+1255 |
CAE mais_sig |
12 |
+2260 |
SUB 999 |
13 |
+5235 |
DPO corrige |
14 |
+1156 |
CEA menos_sig |
15 |
+6200 |
ADD |
16 |
+6200 |
ADD |
17 |
+6200 |
ADD |
18 |
+1256 |
CAE menos_sig |
19 |
+1155 |
CEA mais_sig |
20 |
+6100 |
ADE |
21 |
+2156 |
SOM menos_sig |
22 |
+1255 |
CAE mais_sig |
23 |
+1151 |
CEA expoente_1 |
24 |
+2153 |
SOM expoente_2 |
25 |
+1257 |
CAE exp_final |
26 |
+5130 |
DES fim |
30 |
+4155 |
fim: IMP mais_sig |
31 |
+4157 |
IMP exp_final |
32 |
+7000 |
PAR |
35 |
+1151 |
corr: CEA expoente_1 |
36 |
+2153 |
SOM expoente_2 |
37 |
+2161 |
SOM um |
38 |
+1257 |
CAE exp_final |
39 |
+5130 |
DES fim |
50 |
- |
mantissa_1: |
51 |
- |
expoente_1: |
52 |
- |
mantissa_2: |
53 |
- |
expoente_2: |
55 |
- |
mais_sig: |
56 |
- |
menos_sig: |
57 |
- |
exp_final: |
60 |
+0999 |
999: |
61 |
+0001 |
um: |
Levando em conta apenas a mantisa dos números a serem multiplicados, temos que o menor resultado possível resultda da multiplicação 0000 1000 x 0000 1000 = 0100 0000 e o maior resultado possível resulta de 0000 9999 x 0000 9999 = 9999 9999. Observe que no segundo caso os quatro digitos mais significativos já são a mantissa do resultado.
Para sabermos se determinada multiplicação cai no segundo caso, o que é feito é subtrair-se 0999 dos dígitos mais significativos do resultado. Se essa subtração for estritamente positiva, os quatro digitos em questão já são a mantissa do resultado. Caso essa subtração não seja positiva, os quatro dígitos mais significativos do acumulador não estão em notação científica (pois nesse caso o primeiro dígito é nulo). Para fazermos a correção, isolamos o primeiro dígito (mais significativo) dos dígitos menos significativos, deslocamos os dígitos mais significativos uma posição para a esquerda e então somamos os dois números, o que resultará na procurada mantissa do resultado.
Com relação aos expoentes, basta repetirmos a análise já feita, desta vez considerando que a 'vírgula esteja nas mantissas':
1,000x10A x 1,000x10B = 01,00 0000x10A+B | e | |
9,999x10C x 9,999x10D = 99,99 9999x10C+D |
No segundo caso, apesar dos quatro dígitos mais significativos já serem a mantissa, a vírgula está após o segundo dígito, o que é corrigido somando-se uma unidade ao expoente da potênica de dez do resultado:
99,99 9999x10C+D | Þ | 9,999 9999x10C+D+1 |