Bienvenido: Ingresar
location: WebHome / ASMIntroduccionARM / 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

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

UntitledWiki: WebHome/ASMIntroduccionARM/ASMMultiplicacionARM (última edición 2010-09-09 13:29:37 efectuada por GuillermoSteiner)