Multiplicação de Inteiros Grandes Prof.ª Leticia Rittner Prof.º Romis R. de Faissol Attux Leandro Aparecido Sangalli (PED) EA075 – Introdução ao Projeto de Sistemas Embarcados Relembrando ● Multiplicação: a multiplicação de dois inteiros A e B ambos de tamanho n bits resulta em um inteiro C de até 2n bits. – Exemplo: Se A e B são de 8 bits. Então, C = A*B tem no máximo 16 bits. ● Problema: processadores de capacidade máxima w bits (w menor ou igual a n) não são capazes de efetuar este tipo de multiplicação utilizando uma simples instrução de MUL. Método de Multiplicação (Escolar) ● ● ● ● Exemplo: Base do método: multiplicação e adição símbolo-a-símbolo. Custo: 9 multiplicações + 6 adições, todas símbolo-a-símbolo. Complexidade: n² operações símbolo-asímbolo. Multiplicação em Hexadecimal ● 255 = 11111111 = 1111 1111 = 0xFF (Hex). ● Lembrando que, FXF = 15X15 = 225 = E1 Multiplicação em Blocos ● O método escolar de multiplicação pode ser adaptado para operar bloco-a-bloco, ao invés de símbolo-a-símbolo. – ● Cada bloco é constituído por w bits, onde normalmente w é o tamanho da palavra do processador. Exemplo: seja X e Y ambos de dois blocos. Então, Z = X*Y possui quatro blocos. – Este exemplo é similar ao caso da multiplicação hexadecimal apresentado anteriormente, supondo que cada bloco seja de 4 bits. Multiplicação em Blocos (Cont.) Multiplicação em Blocos (Cont.) ● Testando a multiplicação em blocos – Calcule a multiplicação de X = 255 por Y = 255, utilizando o método de multiplicação em blocos, onde cada bloco é de 4 bits (Versão binária). – Resposta: 1111111000000001 – Relembrando: ● ● ● ● 0+0=0 1+0=1 0+1=1 1 + 1 = 0 (Carry) Multiplicação em Blocos (Cont.) ● A complexidade do algoritmo de multiplicação em blocos também é n². – ● Desconsiderando o custo das operações de adição e shifts. Existem outros algoritmos para efetuar aritmética de múltipla precisão. – Exemplo: Karatsuba, Toom-Cook, entre outros. ● Toom-Cook tem complexidade menor que n² Dicas para a Atividade 3 ● ● Relembrando: multiplicar A e B ambos de 64 bits, obtendo como resultado um número C de 128 bits. Primeiramente, se for utilizado a base de representação hexadecimal isto facilita a aplicação do método de multiplicação em blocos nesse problema. – ● Ou seja, primeiramente devemos converter A e B para hexadecimal (divisões por 16). Vale ressaltar que o objetivo da atividade não é eficiência. Por isso, é sugerido a utilização do método de multiplicação em blocos (simples). Dicas para a Atividade 3 (Cont.) ● ● Como A e B são ambos de 64 bits, estes podem ser divididos em dois blocos de 32 bits cada, já que o simulador ARMSim# opera com instruções de 32 bits. Porém, neste ponto encontramos um problema. – O produto de dois blocos de 32 bits gera um bloco de 64 bits. Porém este bloco não pode ser armazenado, já que os registradores são de 32 bits cada. – Solução: instrução especial de multiplicação. UMULL: partes mais e menos significativas.