<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>WebHome/ASMIntroduccionARM/ASMMultiplicacionARM</title><revhistory><revision><revnumber>3</revnumber><date>2010-09-09 13:29:37</date><authorinitials>GuillermoSteiner</authorinitials><revremark>Se cambia nombre desde &quot;ASMMultiplicacionARM&quot;</revremark></revision><revision><revnumber>2</revnumber><date>2010-06-04 17:14:23</date><authorinitials>GuillermoSteiner</authorinitials></revision></revhistory></articleinfo><section><title>Instrucciones de Multiplicación</title><para>Estas instrucciones, permiten multiplicar dos enteros. </para><para>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. </para><para>Podemos distinguir dos tipo de instrucciones de multiplicación </para><informaltable><tgroup cols="3"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para> Denominación </para></entry><entry colsep="1" rowsep="1"><para> Tamaño op.  </para></entry><entry colsep="1" rowsep="1"><para> Resultado </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> Normal  </para></entry><entry colsep="1" rowsep="1"><para> 32bits x 32bits  </para></entry><entry colsep="1" rowsep="1"><para> 32 bits (inferiores) </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> Long  </para></entry><entry colsep="1" rowsep="1"><para> 32bits x 32bits  </para></entry><entry colsep="1" rowsep="1"><para> 64bits. </para></entry></row></tbody></tgroup></informaltable><section><title>Instrucciones de Multiplicación</title><section><title>Multiplicación Normal MUL y MLA</title><para>Realizan la multiplicación de dos registro y guardan el resultado en un tercero, el resultado es trucado a los 32 bits menos significativos. </para><para>La instrucción MLA además suma al resultado el contenido de un cuarto registro. </para><para>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 </para><screen><![CDATA[MUL{cond}{S} Rd, Rm, Rs       ; Rd = Rm x Rs
]]><![CDATA[
MLA{cond}{S} Rd, Rm, Rs, Rn   ; Rd = Rm x Rs + Rn]]></screen></section><section><title>Multiplicación Long UMULL,UMLAL,SMULL,SMLAL</title><para>Estas instrucciones producen un resultado de 64 bits. </para><para>Se multiplica el valor de dos registros y el resultado es guardado en dos registros que forman los 64bits. </para><para>En este caso debemos separar en dos grupos las instrucciones </para><itemizedlist><listitem><para>UMULL y UMLAL operan con números sin signo  </para></listitem><listitem><para>SMULL y SMLAL operan con números con signo  </para></listitem></itemizedlist><para>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). </para><para>Ademas, como regla general los registros Rm y RdLo o RdHi no deben ser los mismos, tampoco RdLo y RdHi deben ser iguales </para><screen><![CDATA[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]]></screen></section></section><section><title>Ejemplos</title><screen><![CDATA[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 ]]></screen></section><section><title>Código Instrucciones</title><para>MUL opcode = 0 0 0 0 </para><para>MLA opcode = 0 0 0 1 </para><informaltable><tgroup cols="32"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><colspec colname="col_3"/><colspec colname="col_4"/><colspec colname="col_5"/><colspec colname="col_6"/><colspec colname="col_7"/><colspec colname="col_8"/><colspec colname="col_9"/><colspec colname="col_10"/><colspec colname="col_11"/><colspec colname="col_12"/><colspec colname="col_13"/><colspec colname="col_14"/><colspec colname="col_15"/><colspec colname="col_16"/><colspec colname="col_17"/><colspec colname="col_18"/><colspec colname="col_19"/><colspec colname="col_20"/><colspec colname="col_21"/><colspec colname="col_22"/><colspec colname="col_23"/><colspec colname="col_24"/><colspec colname="col_25"/><colspec colname="col_26"/><colspec colname="col_27"/><colspec colname="col_28"/><colspec colname="col_29"/><colspec colname="col_30"/><colspec colname="col_31"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para> 31 </para></entry><entry colsep="1" rowsep="1"><para> 30 </para></entry><entry colsep="1" rowsep="1"><para> 29 </para></entry><entry colsep="1" rowsep="1"><para> 28 </para></entry><entry colsep="1" rowsep="1"><para> 27 </para></entry><entry colsep="1" rowsep="1"><para> 26 </para></entry><entry colsep="1" rowsep="1"><para> 25 </para></entry><entry colsep="1" rowsep="1"><para> 24 </para></entry><entry colsep="1" rowsep="1"><para> 23 </para></entry><entry colsep="1" rowsep="1"><para> 22 </para></entry><entry colsep="1" rowsep="1"><para> 21 </para></entry><entry colsep="1" rowsep="1"><para> 20 </para></entry><entry colsep="1" rowsep="1"><para> 19 </para></entry><entry colsep="1" rowsep="1"><para> 18 </para></entry><entry colsep="1" rowsep="1"><para> 17 </para></entry><entry colsep="1" rowsep="1"><para> 16 </para></entry><entry colsep="1" rowsep="1"><para> 15 </para></entry><entry colsep="1" rowsep="1"><para> 14 </para></entry><entry colsep="1" rowsep="1"><para> 13 </para></entry><entry colsep="1" rowsep="1"><para> 12 </para></entry><entry colsep="1" rowsep="1"><para> 11 </para></entry><entry colsep="1" rowsep="1"><para> 10 </para></entry><entry colsep="1" rowsep="1"><para> 09 </para></entry><entry colsep="1" rowsep="1"><para> 08 </para></entry><entry colsep="1" rowsep="1"><para> 07 </para></entry><entry colsep="1" rowsep="1"><para> 06 </para></entry><entry colsep="1" rowsep="1"><para> 05 </para></entry><entry colsep="1" rowsep="1"><para> 04 </para></entry><entry colsep="1" rowsep="1"><para> 03 </para></entry><entry colsep="1" rowsep="1"><para> 02 </para></entry><entry colsep="1" rowsep="1"><para> 01 </para></entry><entry colsep="1" rowsep="1"><para> 00 </para></entry></row><row rowsep="1"><entry align="center" colsep="1" nameend="col_3" namest="col_0" rowsep="1"><para> cond  </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry align="center" colsep="1" nameend="col_10" namest="col_7" rowsep="1"><para> opcode  </para></entry><entry colsep="1" rowsep="1"><para> S  </para></entry><entry align="center" colsep="1" nameend="col_15" namest="col_12" rowsep="1"><para> Rd  </para></entry><entry align="center" colsep="1" nameend="col_19" namest="col_16" rowsep="1"><para> Rn o ceros  </para></entry><entry align="center" colsep="1" nameend="col_23" namest="col_20" rowsep="1"><para> Rs  </para></entry><entry colsep="1" rowsep="1"><para> 1  </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry colsep="1" rowsep="1"><para> 1  </para></entry><entry align="center" colsep="1" nameend="col_31" namest="col_28" rowsep="1"><para> Rm  </para></entry></row></tbody></tgroup></informaltable><para>SMLAL opcode = 0 1 1 1 </para><para>SMULL opcode = 0 1 1 0 </para><para>UMULL opcode = 0 1 0 0 </para><para>UMLAL opcode = 0 1 0 1 </para><informaltable><tgroup cols="32"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><colspec colname="col_3"/><colspec colname="col_4"/><colspec colname="col_5"/><colspec colname="col_6"/><colspec colname="col_7"/><colspec colname="col_8"/><colspec colname="col_9"/><colspec colname="col_10"/><colspec colname="col_11"/><colspec colname="col_12"/><colspec colname="col_13"/><colspec colname="col_14"/><colspec colname="col_15"/><colspec colname="col_16"/><colspec colname="col_17"/><colspec colname="col_18"/><colspec colname="col_19"/><colspec colname="col_20"/><colspec colname="col_21"/><colspec colname="col_22"/><colspec colname="col_23"/><colspec colname="col_24"/><colspec colname="col_25"/><colspec colname="col_26"/><colspec colname="col_27"/><colspec colname="col_28"/><colspec colname="col_29"/><colspec colname="col_30"/><colspec colname="col_31"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para> 31 </para></entry><entry colsep="1" rowsep="1"><para> 30 </para></entry><entry colsep="1" rowsep="1"><para> 29 </para></entry><entry colsep="1" rowsep="1"><para> 28 </para></entry><entry colsep="1" rowsep="1"><para> 27 </para></entry><entry colsep="1" rowsep="1"><para> 26 </para></entry><entry colsep="1" rowsep="1"><para> 25 </para></entry><entry colsep="1" rowsep="1"><para> 24 </para></entry><entry colsep="1" rowsep="1"><para> 23 </para></entry><entry colsep="1" rowsep="1"><para> 22 </para></entry><entry colsep="1" rowsep="1"><para> 21 </para></entry><entry colsep="1" rowsep="1"><para> 20 </para></entry><entry colsep="1" rowsep="1"><para> 19 </para></entry><entry colsep="1" rowsep="1"><para> 18 </para></entry><entry colsep="1" rowsep="1"><para> 17 </para></entry><entry colsep="1" rowsep="1"><para> 16 </para></entry><entry colsep="1" rowsep="1"><para> 15 </para></entry><entry colsep="1" rowsep="1"><para> 14 </para></entry><entry colsep="1" rowsep="1"><para> 13 </para></entry><entry colsep="1" rowsep="1"><para> 12 </para></entry><entry colsep="1" rowsep="1"><para> 11 </para></entry><entry colsep="1" rowsep="1"><para> 10 </para></entry><entry colsep="1" rowsep="1"><para> 09 </para></entry><entry colsep="1" rowsep="1"><para> 08 </para></entry><entry colsep="1" rowsep="1"><para> 07 </para></entry><entry colsep="1" rowsep="1"><para> 06 </para></entry><entry colsep="1" rowsep="1"><para> 05 </para></entry><entry colsep="1" rowsep="1"><para> 04 </para></entry><entry colsep="1" rowsep="1"><para> 03 </para></entry><entry colsep="1" rowsep="1"><para> 02 </para></entry><entry colsep="1" rowsep="1"><para> 01 </para></entry><entry colsep="1" rowsep="1"><para> 00 </para></entry></row><row rowsep="1"><entry align="center" colsep="1" nameend="col_3" namest="col_0" rowsep="1"><para> cond  </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry align="center" colsep="1" nameend="col_10" namest="col_7" rowsep="1"><para> opcode  </para></entry><entry colsep="1" rowsep="1"><para> S  </para></entry><entry align="center" colsep="1" nameend="col_15" namest="col_12" rowsep="1"><para> RdHi  </para></entry><entry align="center" colsep="1" nameend="col_19" namest="col_16" rowsep="1"><para> RdLo  </para></entry><entry align="center" colsep="1" nameend="col_23" namest="col_20" rowsep="1"><para> Rs  </para></entry><entry colsep="1" rowsep="1"><para> 1  </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry colsep="1" rowsep="1"><para> 0 </para></entry><entry colsep="1" rowsep="1"><para> 1  </para></entry><entry align="center" colsep="1" nameend="col_31" namest="col_28" rowsep="1"><para> Rm  </para></entry></row></tbody></tgroup></informaltable></section></section></article>