<?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/ASMIntroduccionx86</title><revhistory><revision><revnumber>28</revnumber><date>2012-08-23 14:34:41</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>27</revnumber><date>2012-06-12 18:14:12</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>26</revnumber><date>2012-06-12 18:13:01</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>25</revnumber><date>2012-05-29 20:49:27</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>24</revnumber><date>2012-05-29 20:19:24</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>23</revnumber><date>2012-05-29 20:17:55</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>22</revnumber><date>2012-05-29 20:07:06</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>21</revnumber><date>2012-05-29 20:04:55</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>20</revnumber><date>2012-05-29 20:01:37</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>19</revnumber><date>2012-05-29 20:00:46</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>18</revnumber><date>2012-05-29 20:00:32</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>17</revnumber><date>2012-05-29 20:00:12</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>16</revnumber><date>2012-05-29 20:00:03</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>15</revnumber><date>2012-05-29 19:59:39</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>14</revnumber><date>2012-05-29 19:59:16</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>13</revnumber><date>2012-05-29 19:59:02</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>12</revnumber><date>2012-05-29 19:58:34</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>11</revnumber><date>2012-05-29 19:58:15</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>10</revnumber><date>2012-05-29 19:57:39</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>9</revnumber><date>2012-05-29 19:57:09</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>8</revnumber><date>2012-05-29 19:56:51</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>7</revnumber><date>2012-05-29 19:56:28</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>6</revnumber><date>2012-05-29 19:55:45</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>5</revnumber><date>2012-05-29 19:54:37</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>4</revnumber><date>2012-05-29 19:50:39</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>3</revnumber><date>2012-05-29 19:48:22</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>2</revnumber><date>2012-05-29 19:47:41</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>1</revnumber><date>2012-05-29 19:44:19</date><authorinitials>GuillermoSteiner</authorinitials></revision></revhistory></articleinfo><section><title>Assembler de x86</title><section><title>Modos de Direccionamientos</title><para><ulink url="https://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/ASMIntroduccionx86/TecnicasDigitalesII/WebHome/ASMIntroduccionx86/Direccionamiento#">Descripción</ulink> </para></section><section><title>Banderas</title><informaltable><tgroup cols="4"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><colspec colname="col_3"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para>Nombre </para></entry><entry colsep="1" rowsep="1"><para>Descripción </para></entry><entry colsep="1" rowsep="1"><para>Estado = 0 </para></entry><entry colsep="1" rowsep="1"><para>Estado = 1 </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Acarreo </para></entry><entry colsep="1" rowsep="1"><para>indica un acarreo o un préstamo en la última operación aritmética, usado también en operaciones de corrimiento y como indicador de error en ciertos programas. </para></entry><entry colsep="1" rowsep="1"><para>NC-Sin Acarreo </para></entry><entry colsep="1" rowsep="1"><para>CY-Acarreo </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Desborde </para></entry><entry colsep="1" rowsep="1"><para>Indica cuando el resultado de una operación con signo a excedido la capacidad del uP. </para></entry><entry colsep="1" rowsep="1"><para>NV-No hubo  desborde </para></entry><entry colsep="1" rowsep="1"><para>OV-Desborde </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Signo </para></entry><entry colsep="1" rowsep="1"><para>indica el signo del resultado de la última operación aritmética. </para></entry><entry colsep="1" rowsep="1"><para>PL-Positivo </para></entry><entry colsep="1" rowsep="1"><para>NG-Negativo </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Cero </para></entry><entry colsep="1" rowsep="1"><para>indica si la última operación dio como resultado cero. </para></entry><entry colsep="1" rowsep="1"><para>NZ-No Cero </para></entry><entry colsep="1" rowsep="1"><para>ZR-Cero </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Dirección </para></entry><entry colsep="1" rowsep="1"><para>Controla la selección de incremento o decremento de los registros DI o SI en las instrucciones de cadenas. </para></entry><entry colsep="1" rowsep="1"><para>UP-Incremento </para></entry><entry colsep="1" rowsep="1"><para>DN-Decremento </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Interrupción </para></entry><entry colsep="1" rowsep="1"><para>habilita la entrada de interrupción. </para></entry><entry colsep="1" rowsep="1"><para>DI-Interr. anulada </para></entry><entry colsep="1" rowsep="1"><para>EI-Interrupción </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Acarreo auxiliar </para></entry><entry colsep="1" rowsep="1"><para>ocurre cuando en una operación aritmética, se produzco un acarreo o un préstamo entre el bit 3 y 4 del resultado. </para></entry><entry colsep="1" rowsep="1"><para>NA-Sin Acarreo </para></entry><entry colsep="1" rowsep="1"><para>AC-Acarreo </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>Paridad </para></entry><entry colsep="1" rowsep="1"><para>es un conteo de unos en la última operación. </para></entry><entry colsep="1" rowsep="1"><para>PO-Impar </para></entry><entry colsep="1" rowsep="1"><para>PE-Par </para></entry></row></tbody></tgroup></informaltable></section><section><title>Suma con acarreo</title><para><emphasis role="strong">ADD</emphasis>: Esta instrucción suma el primer operador con el segundo y al resultado lo guarda en el primer operador, si hubo acarreo lo guarda en Carry.  <emphasis role="strong">ADC</emphasis>: Realiza la misma operación que ADD incorporando también el Carry en la suma de los operadores. </para><para>Para el caso de sumar números cuya longitud supera a los 16 bits del microprocesador o que su resultado sea mayor que 16 bits, se debe recurrir al uso de la suma con acarreo.  Esto significa, que en el caso por ejemplo de sumar dos números de 32 bits, se realiza la suma de los 16 bits menos significativos y luego los 16 bits mas significativos junto con el acarreo. </para></section><section><title>Corrimiento (Shift) Lógico y Aritmético</title><para>Grupo de instrucciones que permiten realizar desplazamientos de los bits dentro de un registro o posición de memoria. </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><emphasis role="strong">SHL</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>Corrimiento lógico hacia la izquierda </para></entry><entry colsep="1" rowsep="1"><para> <inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/ASMIntroduccionx86?action=AttachFile&amp;do=get&amp;target=shl.png" width="50%"/></imageobject><textobject><phrase>shl.png</phrase></textobject></inlinemediaobject> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">SHR</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>Corrimiento lógico hacia la derecha </para></entry><entry colsep="1" rowsep="1"><para> <inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/ASMIntroduccionx86?action=AttachFile&amp;do=get&amp;target=shr.png" width="50%"/></imageobject><textobject><phrase>shr.png</phrase></textobject></inlinemediaobject> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">SAL</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>Corrimiento Aritmético hacia la izquierda </para></entry><entry colsep="1" rowsep="1"><para> <inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/ASMIntroduccionx86?action=AttachFile&amp;do=get&amp;target=shl.png" width="50%"/></imageobject><textobject><phrase>shl.png</phrase></textobject></inlinemediaobject> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">SAR</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>Corrimiento Aritmético hacia la derecha </para></entry><entry colsep="1" rowsep="1"><para> <inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/ASMIntroduccionx86?action=AttachFile&amp;do=get&amp;target=sar.png" width="50%"/></imageobject><textobject><phrase>sar.png</phrase></textobject></inlinemediaobject> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">ROL</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>Rotación hacia la izquierda </para></entry><entry colsep="1" rowsep="1"><para> <inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/ASMIntroduccionx86?action=AttachFile&amp;do=get&amp;target=rol.png" width="50%"/></imageobject><textobject><phrase>rol.png</phrase></textobject></inlinemediaobject> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">ROR</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>Rotación hacia la derecha </para></entry><entry colsep="1" rowsep="1"><para> <inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/ASMIntroduccionx86?action=AttachFile&amp;do=get&amp;target=ror.png" width="50%"/></imageobject><textobject><phrase>ror.png</phrase></textobject></inlinemediaobject> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">RCL</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>Rotación hacia la izquierda usando acarreo </para></entry><entry colsep="1" rowsep="1"><para> <inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/ASMIntroduccionx86?action=AttachFile&amp;do=get&amp;target=rcl.png" width="50%"/></imageobject><textobject><phrase>rcl.png</phrase></textobject></inlinemediaobject> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">RCR</emphasis> </para></entry><entry colsep="1" rowsep="1"><para>Rotación hacia la derecha usando acarreo </para></entry><entry colsep="1" rowsep="1"><para> <inlinemediaobject><imageobject><imagedata fileref="https://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/ASMIntroduccionx86?action=AttachFile&amp;do=get&amp;target=rcr.png" width="50%"/></imageobject><textobject><phrase>rcr.png</phrase></textobject></inlinemediaobject> </para></entry></row></tbody></tgroup></informaltable><section><title>Formato de las instrucciones</title><para>Si bien se pueden realizar corrimiento o rotaciones de 1 o más bits, solo está permitido en el 8086/8088 el de 1 bit en inmediato, en estos casos para un corrimiento de más de un bits, se debe utilizar un registro auxiliar, el CL </para><para>Ejemplo de Shift a la derecha de 1 bit  </para><screen><![CDATA[SHR BX,1 ]]></screen><para>Ejemplo de Shift a la derecha de 4 bits  </para><screen><![CDATA[MOV CL,4
SHR BX,CL]]></screen></section></section><section><title>Saltos Condicionales e Incondicionales</title><para>En todo programa es necesario interrumpir el flujo normal del mismo y saltar a otra porción del código, podemos distinguir dos saltos diferentes: Los condicionales, donde se evalúa una condición y al ser verdadera se produce el salto, es la forma que tiene el ensamblador de realizar IF o estructuras CASE que acostumbrábamos a usar en lenguajes de alto nivel, lo único que aquí lo hacemos en dos pasos, primero comparamos, quedando el resultado en las banderas (ver banderas al comienzo), luego utilizamos alguna de las instrucciones de salto condicional para realizar el salto. </para><para>El salto incondicional, aquí no hay condición de salto y el mismo se efectúa siempre, es el equivalente al GOTO en lenguajes de alto nivel. </para><section><title>Salto Incondicional</title><para><code> JMP nn </code> </para><para>El salto incondicional puede ser dividido en tres tipos. </para><itemizedlist><listitem><para>Salto corto, en este tipo de salto el parámetro nn es un byte, pudiendo saltar desde +127 hasta -128 posiciones a partir de la dirección próxima a JMP. (largo: 1 byte instrucción + 1 byte salto = 2 bytes) </para></listitem><listitem><para>Salto cercano, el parámetro nn es de dos bytes indicando la dirección del puntero a donde va a saltar. (largo: 1 bytes instrucción + 2 bytes salto = 3 bytes) </para></listitem><listitem><para>Salto lejano, nn es de 4 byte, indica la posición absoluta con segmento y puntero del salto. ( largo: 1 byte instrucción + 4 byte salto = 5 bytes ) </para></listitem></itemizedlist><para>Generalmente el compilador elije la mejor forma (la más corta) para realizar el salto, no siendo necesario determinar su tipo de forma explicita. </para></section><section><title>Salto condicionales</title><para>Este tipo de salto depende de las banderas del uP para realizarlo, todos estos saltos son solamente corto, no pudiendo saltar con estas instrucciones mas allá de +127 – 128 bytes.  </para><section><title>Saltos condicionales para operaciones sin signo</title><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>Instrucción </para></entry><entry colsep="1" rowsep="1"><para>Bandera/s</para></entry><entry colsep="1" rowsep="1"><para>Descripción</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JA         </para></entry><entry colsep="1" rowsep="1"><para> C = 0 y Z = 0 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si está por arriba </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JAE        </para></entry><entry colsep="1" rowsep="1"><para> C = 0         </para></entry><entry colsep="1" rowsep="1"><para> Saltar si está por arriba o es igual </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JB         </para></entry><entry colsep="1" rowsep="1"><para> C = 1         </para></entry><entry colsep="1" rowsep="1"><para> Saltar si está por abajo </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JBE        </para></entry><entry colsep="1" rowsep="1"><para> C = 1 o Z = 1 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si está por debajo a igual </para></entry></row></tbody></tgroup></informaltable></section><section><title>Saltos condicionales para operaciones con signo</title><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>Instrucción </para></entry><entry colsep="1" rowsep="1"><para>Bandera/s</para></entry><entry colsep="1" rowsep="1"><para>Descripción</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JG         </para></entry><entry colsep="1" rowsep="1"><para> Z = 0 y S = Ov </para></entry><entry colsep="1" rowsep="1"><para> Saltar si es mayor </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JGE        </para></entry><entry colsep="1" rowsep="1"><para> S = Ov        </para></entry><entry colsep="1" rowsep="1"><para> Saltar si es mayor o igual </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JL         </para></entry><entry colsep="1" rowsep="1"><para> S &lt;&gt; Ov       </para></entry><entry colsep="1" rowsep="1"><para> Saltar si es menor </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JLE        </para></entry><entry colsep="1" rowsep="1"><para> Z = 1 o S &lt;&gt; Ov </para></entry><entry colsep="1" rowsep="1"><para> Saltar si es menor o igual </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JNS        </para></entry><entry colsep="1" rowsep="1"><para> S = 0           </para></entry><entry colsep="1" rowsep="1"><para> Saltar si no hay signo </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JS         </para></entry><entry colsep="1" rowsep="1"><para> S = 1           </para></entry><entry colsep="1" rowsep="1"><para> Saltar si hay signo </para></entry></row></tbody></tgroup></informaltable></section><section><title>Otros saltos</title><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>Instrucción </para></entry><entry colsep="1" rowsep="1"><para>Bandera/s</para></entry><entry colsep="1" rowsep="1"><para>Descripción</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JE o JZ    </para></entry><entry colsep="1" rowsep="1"><para> Z = 1 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si es igual o cero </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JNE o JNZ  </para></entry><entry colsep="1" rowsep="1"><para> Z = 0 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si no es igual o cero </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JC         </para></entry><entry colsep="1" rowsep="1"><para> C = 1 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si hay acarreo </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JNC        </para></entry><entry colsep="1" rowsep="1"><para> C = 0 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si no hay acarreo </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JNO        </para></entry><entry colsep="1" rowsep="1"><para> Ov = 0 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si no hay overflow </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JNP o JPO  </para></entry><entry colsep="1" rowsep="1"><para> P = 0 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si no hay paridad o paridad impar </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JO         </para></entry><entry colsep="1" rowsep="1"><para> Ov = 1 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si hay overflow </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JP o JPE   </para></entry><entry colsep="1" rowsep="1"><para> P = 1 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si hay paridad o paridad par </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> JCXZ       </para></entry><entry colsep="1" rowsep="1"><para> CX = 0 </para></entry><entry colsep="1" rowsep="1"><para> Saltar si CX = 0 </para></entry></row></tbody></tgroup></informaltable><para>Todos los saltos condicionales están limitados a saltos cortos (+127 bytes a -128 bytes ) para el 8086/80286 o saltos cercanos para 80386 y superiores (saltos dentro del segmento), en caso de necesitar realizar un salto a otro segmento, se debe recurrir a la utilización de una instruccion inversa a la utilizada originalmente acompañada por un salto incondicional  </para><para>ejemplo  </para><screen><![CDATA[        JC salto_lejano]]></screen><para>se sustituye por  </para><screen><![CDATA[        JNC seguir 
        JMP salto_lejano 
seguir:]]></screen></section></section></section></section></article>