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 |