varios son que para numeros niños multiplicar multiplicaciones multiplicacion muchas digitos desglosada con como cifras math binary assembly

math - son - Ensamblaje 8x8 algoritmo de multiplicación de cuatro cuadrantes



multiplicaciones de muchas cifras (2)

En el libro "Aplicaciones musicales de microprocesadores", el autor proporciona el siguiente algoritmo para hacer una multiplicación de cuatro cuadrantes de dos enteros de 8 bits con un resultado firmado de 16 bits:

Haz una multiplicación sin signo en los operandos sin procesar. Luego, para corregir el resultado, si el signo de multiplicar es negativo, la precisión simple sin signo resta el multiplicador de los 8 bits superiores del resultado de 16 bits sin procesar. Si el signo multiplicador también es negativo, la precisión simple sin signo resta el multiplicando de los 8 bits superiores del resultado bruto de 16 bits.

Intenté implementar esto en ensamblador y parece que no puedo hacer que funcione. Por ejemplo, si no firmo, multiplico -2 veces -2, el resultado bruto en binario es B11111100.00000100. Cuando restar B1111110 dos veces de los 8 bits superiores de acuerdo con el algoritmo, obtengo B11111110.00000100, no B00000000.00000100 como uno quisiera. ¡Gracias por cualquier idea de dónde podría estar yendo mal!

Edición - código:

#define smultfix(a,b) / ({ / int16_t sproduct; / int8_t smultiplier = a, smultiplicand = b; / uint16_t uproduct = umultfix(smultiplier,smultiplicand);/ asm volatile ( / "add %2, r1 /n/t" / "brpl smult_"QUOTE(__LINE__)"/n/t" / "sec /n/t" / "sbc %B3, %1 /n/t" / "smult_"QUOTE(__LINE__)": add %1, r1 /n/t" / "brpl send_"QUOTE(__LINE__)" /n/t" / "sec /n/t" / "sbc %B3, %2 /n/t" / "send_"QUOTE(__LINE__)": movw %A0,%A3 /n/t" / :"=&r" (sproduct):"a" (smultiplier), "a" (smultiplicand), "a" (uproduct)/ ); / sproduct; / })


Cuando restar B1111110 dos veces de los 8 bits superiores de acuerdo con el algoritmo, obtengo B11111110.00000100, no B00000000.00000100 como uno quisiera.

Si restamos B11111110 dos veces de B11111100 , obtengo B00000000 , según se requiera:

B11111100 - B11111110 = B11111110 B11111110 - B11111110 = B00000000

Parece lo suficientemente simple.


Editar: Tienes la resta incorrecta.

1111''1110b * 1111''1110b == 1111''1100''0000''0100b -1111''1110''0000''0000b -1111''1110''0000''0000b --------------------- 100b

De lo contrario, su algoritmo es correcto: en el cuarto cuadrante, necesita restar 100 h multiplicado por la suma (a + b). Al escribir los bytes de dos complementos como (100h-x) obtengo:

(100h-a)(100h-b) = 10000h - 100h*(a+b) + ab = 100h*(100h-a) + 100h*(100h-b) + ab mod 10000h (100h-a)(100h-b) - 100h*(100h-a) - 100*(100h-b) = ab mod 10000h