## page was renamed from ASMMultiplicacionARM = Instrucciones de Multiplicación = Estas instrucciones, permiten multiplicar dos enteros. Todas las instrucciones de multiplicación realizan esta operación con dos registros, no permite directamente multiplicar un registro con una constante, esto es debido a que realizar una multiplicación por medio de una instrucción de suma y corrimiento o resta y corrimiento es mas eficiente. Podemos distinguir dos tipo de instrucciones de multiplicación || Denominación || Tamaño op. || Resultado || || Normal || 32bits x 32bits || 32 bits (inferiores) || || Long || 32bits x 32bits || 64bits. || == Instrucciones de Multiplicación == === Multiplicación Normal MUL y MLA === Realizan la multiplicación de dos registro y guardan el resultado en un tercero, el resultado es trucado a los 32 bits menos significativos. La instrucción MLA además suma al resultado el contenido de un cuarto registro. Se opera tanto con números con o sin signo, al solo utilizar los 32 bits mas bajos, el signo del resultado no es afectado {{{ MUL{cond}{S} Rd, Rm, Rs ; Rd = Rm x Rs MLA{cond}{S} Rd, Rm, Rs, Rn ; Rd = Rm x Rs + Rn }}} === Multiplicación Long UMULL,UMLAL,SMULL,SMLAL === Estas instrucciones producen un resultado de 64 bits. Se multiplica el valor de dos registros y el resultado es guardado en dos registros que forman los 64bits. En este caso debemos separar en dos grupos las instrucciones * UMULL y UMLAL operan con números sin signo * SMULL y SMLAL operan con números con signo La variantes con acumulación son UMLAL y SMLAL para variables sin y con signo respectivamente, las cuales realizan la multiplicación de dos registros, le suma los 64 bits contenidos en el tercer y cuarto registro y guarda el resultado final en esos mismos registros (tercero y cuarto). Ademas, como regla general los registros Rm y !RdLo o !RdHi no deben ser los mismos, tampoco !RdLo y !RdHi deben ser iguales {{{ UMULL{cond}{S} RdLo, RdHi, Rm, Rs ; RdHi RdLo = Rm x Rs UMLAL{cond}{S} RdLo, RdHi, Rm, Rs ; RdHi RdLo = Rm x Rs SMULL{cond}{S} RdLo, RdHi, Rm, Rs ; RdHi RdLo = RdHi RdLo + Rm x Rs SMLAL{cond}{S} RdLo, RdHi, Rm, Rs ; RdHi RdLo = RdHi RdLo + Rm x Rs }}} == Ejemplos == {{{ MULS R4, R2, R1 ; R4 = R2 x R1, modifica las banderas de N y Z MLA R7, R8, R9, R3 ; R7 = R8 x R9 + R3 SMULL R4, R8, R2, R3 ; R4 = bits 0 to 31 of R2 x R3 R8 = bits 32 to 63 of R2 x R3 (con signo) UMULL R6, R8, R0, R1 ; R8, R6 = R0 x R1 sin signo UMLAL R5, R8, R0, R1 ; R8, R5 = R0 x R1 + R8, R5 sin signo }}} == Código Instrucciones == MUL opcode = 0 0 0 0 MLA opcode = 0 0 0 1 || 31 || 30 || 29 || 28 || 27 || 26 || 25 || 24 || 23 || 22 || 21 || 20 || 19 || 18 || 17 || 16 || 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00 || |||||||| cond || 0 || 0 || 0 |||||||| opcode || S |||||||| Rd |||||||| Rn o ceros |||||||| Rs || 1 || 0 || 0 || 1 |||||||| Rm || SMLAL opcode = 0 1 1 1 SMULL opcode = 0 1 1 0 UMULL opcode = 0 1 0 0 UMLAL opcode = 0 1 0 1 || 31 || 30 || 29 || 28 || 27 || 26 || 25 || 24 || 23 || 22 || 21 || 20 || 19 || 18 || 17 || 16 || 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00 || |||||||| cond || 0 || 0 || 0 |||||||| opcode || S |||||||| !RdHi |||||||| !RdLo |||||||| Rs || 1 || 0 || 0 || 1 |||||||| Rm ||