My signature
Principia Lenguaje Ensamblador para Intel 808x/80x86

APENDICES

APENDICE A.-  MODELO DE REGISTROS DEL 8086





APENDICE B.-  REGISTROS EXPANDIDOS DEL 8087.











APENDICE C.-  MODELO DE SEGMENTACION DE MEMORIA.





APENDICE D.-  DIRECTIVAS DEL MASM.



.186                                                                               Permite reconocer instrucciones para microprocesadores 8086 y 80186.

.286c                                                                             Permite ensamblar instrucciones 80286 en modo no protegido, 8086 y 80186.

.286p                                                                             Activa el ensamble de instrucciones 80286 en modo protegido, 80186, 8086.

.287                                                                               Ensamblar instrucciones 80287 y 8087.

.8086                                                                             Modo por defecto. Activa el ensamble de instrucciones 8086 (idénticas para el 8088).

.8087                                                                             Activa el ensamble de instrucciones 8087. Modo por defecto.

nombre=expresión                                                          Asigna el valor de expresión a nombre.

ASUME                                                                          segmentregister:segmentname. Selecciona segmentregister que sea el segmento por defecto para todos los símbolos en el segmento o grupo nombrados. Si segmentname es NOTHING, ningún registro es seleccionado.

COMMENT                                                                     delimitador texto delimitador.  Trata como un comentario a todo texto dado entre delimitador y delimitador.

.CREF                                                                            Restablece el listado de referencia cruzada de símbolos.

[nombre]DB valor                                                            Aloja e inicializa un byte (DB).

[nombre]DW valor                                                           una palabra (DW, 2 bytes)

[nombre]DD valor                                                            una palabra doble(DD)

[nombre]DQ valor                                                            una palabra cuádruple (DQ)

[nombre]DT valor                                                            y 10 bytes ( (DT) de almacenamiento para cada valor

ELSE                                                                             Señala el inicio de un bloque alterno dentro de un bloque condicional.

END [expresión]                                                              Señala el fin de un bloque y, opcionalmente, fija el punto de entrada a expresión.

ENDIF                                                                            Termina un bloque condicional.

ENDM                                                                            Termina una macro.

nombre ENDP                                                                Marca el final de la definición de un procedimiento

nombre ENDS                                                                Marca el final de la definición de una estructura o segmento

nombre EQU expresión                                                    Asigna expresión a nombre.

.ERR                                                                              Genera error.

.ERR1                                                                            Genera error en el paso 1 únicamente.

.ERR2                                                                            Genera error en el paso 2 únicamente.

.ERRB <argumento>                                                       Genera error si argumento es blanco.

.ERRDEF nombre                                                           Genera error si  nombre ya ha sido definido.

.ERRDIF <cadena1>,<cadena2>                                      Genera error si los nombres son diferentes.

.ERRE expresión                                                             Genera error si  expresión es falsa (o)

.ERRIDN <cadena1>,<cadena2>                                      Genera error si las cadenas son idénticas.

.ERRNB <argumento>                                                     Genera error si el argumento no es blanco.

.ERRNDEF nombre                                                         Genera error si nombre no se ha definido.

.ERRNZ expresión                                                           Genera error si expresión no es cero(verdadera).

EVEN                                                                             Si es necesario, incrementa el contador de localidad a un número par y genera una instrucción NOP.

EXITM                                                                           Termina la expansión del bloque de repetición o macro y comienza a ensamblar la siguiente declaración fuera del bloque.

EXTRN nombre:tipo...                                                     Declaración de una variable, etiqueta o símbolo externo.

nombre GROUP segmentname...                                     Asocia el nombre de un grupo con uno o más segmentos.

IF expresión                                                                   Permite el ensamble si expresión es verdadera(no cero).

IF1                                                                                Ensambla sólo en el paso 1.

IF2                                                                                Ensambla sólo en el paso 2.

IFB <argumento>                                                            Ensambla si argumento  es blanco.

IFDEF nombre                                                                Ensambla si nombre ya ha sido definido.

IFDIF <argumento1>,<argumento2>                                 Ensambla sólo si los argumentos son diferentes.

IFE expresión                                                                 Ensambla si expresión es falsa (0).

IFIDN <argumento1>,<argumento2>                                 Ensambla si los argumentos son idénticos.

IFNB <argumento>                                                         Ensambla si el argumento no es blanco.

IFNDEF nombre                                                              Si nombre no ha sido definido permite el ensamble

INCLUDE filename                                                          Inserta código fuente desde el archivo indicado

IRP nombre,<parámetro...>                                             Marca el inicio de un bloque de código que será repetido tantas veces como parámetros  existan y en cada repetición nombre será reemplazado por cada parámetro.

IRPC nombre,<cadena>                                                  Marca el inicio de un bloque de código que será repetido tantas veces como caracteres tenga la cadena indicada y en cada repetición será substituido nombre por cada carácter.

Nombre ETIQUETA tipo                                                  Crea una nueva variable o etiqueta asignando el valor actual del contador de localidades y el tipo dado a nombre.

.LALL                                                                            Lista todas las declaraciones en una macro.

.LFCOND                                                                       Restablece el listado de bloques condicionales.

.LIST                                                                             Restablece el listado de declaraciones en el listado del programa.

LOCAL nombre...                                                           Declara nombre dentro de una macro para quesea reemplazado por el nombre actual, cuando la macro sea expandida

nombre MACRO parámetro...                                           Marca el inicio de la macro nombre y establece cada parámetro para ser substituido por los respectivos parámetros cuando la macro sea llamada.

NAME módulo                                                                Fija el nombre del módulo.

PURGE macro...                                                             Borra las macros indicadas.

ORG expresión                                                               Fija el contador de localidades expresión.

%OUT texto                                                                    Despliega texto en pantalla.

Nombre PROC tipo                                                         Señala el inicio de un procedimiento de determinado tipo.

PAGE longitud,ancho                                                      Fija los márgenes para el listado del programa (en caracteres).

PAGE+                                                                          Incrementa la numeración de página.

PAGE                                                                            Genera un corte de página en el listado.

PUBLIC nombre...                                                          Hace que cada variable, nombre, etiqueta o símbolo absoluto declarado esté disponible para el resto de módulos en el programa.

.RADIX expresión                                                           Fija la base a expresión para la introducción de números.

Nombre RECORD campo:ancho[=expresión]...                  Define una estructura para un registro de 8 ó 16 bits que contiene uno o más campos.

REPT expresión                                                              Marca el inicio de un bloque será repetido el número de veces indicado por expresión.

.SALL                                                                            Suprime el listado de las expansiones de macros.

nombre SEGMENT[alineación][combine]['clase']               Marca el inicio de un segmento del programa llamado nombre y que posee los atributos indicados.

.SFCOND                                                                       Suprime el listado de cualquier bloque condicional subsecuente cuya condición IF sea falsa.

Nombre STRUC                                                              Marca el comienzo en la definición de una estructura.

SUBTTL[texto]                                                               Define un subtítulo para el listado.

.TFCOND                                                                       Fija por defecto el listar los bloques condicionales.

TITLEtexto                                                                     Títulos para los listados de los programas.

.XALL                                                                            Lista sólo aquellas macros que generen código o datos.

.XCREF[nombre...]                                                         Suprime el listado de las referencias cruzadas.

.XLIST                                                                           Suprime el listado de las líneas que sigan.

 

 

APÉNDICE E.-  JUEGO DE INSTRUCCIONES DEL 8086,8087, 80186, 80286 Y 80287.


En la siguiente lista de instrucciones, para la descripción y su sintaxis se recurre a las siguientes abreviaturas:


acum                     uno de los acumuladores: AX o AL.

reg                        cualquiera de los registros

segreg                   uno de los registros de segmento

r/m                        uno de los operandos generales: registro, memoria, basado, indexado o basado-indexado

inmed                    constante o símbolo de 8 o 16 bits

mem                     un operando de memoria: símbolo, etiqueta, variable.

etiqueta                 etiqueta de instrucciones.

src                        fuente en operaciones de cadena

dest                      destino en operaciones de cadena.

 

 

8086/8088


AAA                                Ajuste ASCII para adición.

AAD                                Ajuste ASCII para división.

AAM                                Ajuste ASCII para multiplicación.

AAS                                Ajuste ASCII para división.

ADC   acum, inmed           Suma con acarreo.

r/m,inmed

r/m, reg

reg, r/m

ADD  acum,inmed             Suma.

r/m,inmed

r/m, reg

reg, r/m

AND  acum,inmed             Operación AND a nivel bit.

r/m,inmed

r/m, reg

reg, r/m

CALL etiqueta                  Llamado.

r/m

CBW                               Convierte byte apalabra.

CLC                                 Limpia bandera de acarreo.

CLD                                 Limpia bandera de dirección.

CLI                                  Limpia bandera de interrupción.

CMC                                Complementa bandera de acarreo.

CMP  acum,inmed            Comparación

r/m,inmed

r/m, reg

reg, r/m

CMPS  src,dest                Comparación de cadenas.

CMPSB                           Compara cadenas byte por byte.

CMPSW                          Compara cadenas palabra por palabra.

CWD                               Convierte palabra a palabra doble.

DAA                                Ajuste decimal para adición.

DAS                                Ajuste decimal para substracción.

DEC   r/m                         Decremento.

reg

DIV    r/m                         División.

ESC  inmed, r/m               Escape con 6 bits.

HLT                                 Alto.

IDIV  r/m                          División entera.

IMUL r/m                         Mutiplicación entera.

IN      accum,inmed          Entrada desde puerto.

acum, DX

INC    r/m                         Incremento.

          reg

INT3                                Interrupción3 codificada como un byte.

INT    inmed                     Interrupción0-255.

INTO                               Interrupción en overflow.

IRET                                Retorno de interrupción.

JMP etiqueta                    Brinco incondicional.

        r/m

J(condición)etiqueta          Brinca de acuerdo a las condiciones: A (arriba), AE (arriba o igual), B (siguiente), BE (siguiente o igual), C(acarreo), CXZ (CX en cero), E (igual), G (mayor), GE (mayor o igual),  L (menor), LE (menor o igual), NA (no anterior), NAE (no anterior o igual), NB (no siguiente),  NBE(no siguiente o igual), NC (no acarreo), NE (no igual),  NG(no mayor),  NGE (no mayor o igual),  NL (no menor), NLE (no menor o igual), NO(no sobreflujo), NP (no paridad), NS (no signo), NZ (no cero), O(sobreflujo),  P (paridad), PE(paridad par), PO (paridad impar), S (signo), Z (cero).

LAHF                               Carga AH con las banderas.

LDS  r/m                          Carga DS.

LEA   r/m                         Carga la dirección.

LES  r/m                          Carga ES.

LOCK                              Cierra bus.

LODS  src                        Carga cadena.

LODSB                            Carga byte de cadena en  AL.

LODSW                           Carga palabra de la cadena en  AX.

LOOP  etiqueta                Ciclo.

LOOPE  etiqueta              Ciclo mientras igual.

LOOPNE  etiqueta            Ciclo mientras no igual.

LOOPNZ  etiqueta            Ciclo mientras no cero.

LOOPZ  etiqueta               Ciclo mientras cero.

MOV  acum,mem             Mueve un valor del segundo al primer operando

r/m,inmed

mem, acum

r/m, reg

r/m,segreg

reg, inmed

reg,r/m

segreg,r/m

MOVS  dest, src               Mueve cadena.

MOVSB                           Mueve cadena byte por byte.

MOVSW                          Mueve cadena palabra por palabra.

MUL  r/m                         Multiplicación.

NEG  r/m                          Niega(complemento a 2).

NOP                                Operación ociosa.

NOT  r/m                          Invierte valores de bits (complemento a 1).

OR   acum, inmed             Operación OR a nivel de bit.

r/m,inmed

r/m, reg

reg,r/m

OUTDX, accum                Salida por el puerto dado por el primer operando.

inmed, acum            (inmediato de 8 bits)

POP  r/m                         Recupera valor de la pila.

reg

segreg

POPF                              Recupera banderas.

PUSH  r/m                       Guarda valor en la pila.

reg

segreg

PUSHF                            Guarda banderas.

RCL  r/m,1                       Rotación a la izquierda con acarreo.

r/m,CL

RCR  r/m, 1                      Rotación a la derecha con acarreo.

r/m, CL

REP                                 Repite.

REPE                               Repite si igual.

REPNE                            Repite si no igual.

REPNZ                             Repite si no cero.

REPZ                               Repite si cero.

RET  [inmed]                    Regresa después de recuperar bytes de la pila.

ROL r/m,1                        Rotación a la izquierda.

r/m, CL

ROR r/m,1                        Rotación a la derecha.

r/m, CL

SAHF                              Carga banderas con el valor de AH.

SAL  r/m, 1                      Desplazamiento aritmético a la izquierda.

r/m, CL

SAR  r/m, 1                      Desplazamiento aritmético a la derecha.

r/m, CL

SBB  acum, inmed            Substracción con acarreo.

r/m,inmed

r/m, reg

reg,r/m

SCAS dest                       Explora cadena.

SCASB                            Explora cadena para el byte en AL.

SCASW                           Explora cadena por la palabra en AX.

SHL  r/m, 1                      Desplazamiento a la izquierda.

r/m, CL

SHR  r/m, 1                      Desplazamiento a la derecha.

r/m, CL

STC                                 Fija bandera de acarreo.

STD                                 Fija bandera de dirección.

STI                                  Fija bandera de interrupción.

STOS dest                       Guarda cadena.

STOSB                            Guarda byte en AL en la cadena.

STOSW                           Guarda palabra en AX en la cadena.

SUB  accum, inmed          Substracción.

r/m,inmed

r/m, reg

reg,r/m

TEST acum, inmed           Comparación.

r/m,inmed

r/m, reg

reg,r/m

WAIT                               Aguarda.

XCHG acum, reg              Intercambio.

r/m,inmed

r/m, reg

reg,r/m

XLAT                               Traduce.

XOR acum, reg                 Operación XOR a  nivel bit.

r/m,inmed

r/m, reg

reg,r/m



8087


F2XM1                             Calcula 2x-1.

FABS                              Toma valor absoluto del tope de la pila.

FADD  mem                     Suma real.

FADD  ST,ST(i)                Suma real desde la pila.

FADD  ST(i),ST                Suma real a la pila.

FADDP  ST(i), ST             Suma real y saca de pila.

FBLD  mem                     Carga un decimal empacado de 10 bytes en  lapila.

FBSTP  mem                   Almacena un decimal empacado de 10 bytes y saca de pila.

FCHS                              Cambia signo del valor en el tope de la pila.

FCLEX                             Borra las excepciones después de un WAIT.

FCOM                              Compara real.

FCOM  ST                       Compara real con el tope de la pila.

FCOM  ST(i)                    Compara real con la pila.

FCOMP                           Compara real y saca de pila.

FCOMP  ST                     Compara real con el tope dela pila y saca de pila.

FCOMP  ST(i)                  Compara real con el tope de la pila y saca.

FCOMPP                         Compara real y saca dos valores de la pila.

FDECSTP                        Decrementa el apuntador de la pila.

FDISI                               Deshabilita las interrupciones después de un WAIT.

FDIV  mem                      División real.

FDIV  ST,ST(i)                 División real desde la pila.

FDIV  ST(i), ST                División real en la pila.

FDIVPST(i), ST                División real sacando valor de la pila.

FDIVR                             División real invertida.

FDIVR  mem                    División real invertida desde memoria.

FDIVR  ST, ST(i)              División real invertida desde la pila.

FDIVR  ST(i), ST              División real invertida desde la pila.

FDIVRPST(i), ST              División con un real invertido y sacando valor de la pila.

FENI                                Habilita interrupciones después de un WAIT.

FFREE                             Libera elemento dela pila.

FIADD mem                     Suma entera de un número de2 ó 4 bytes.

FICOM  mem                   Compara enteros de 2 ó 4 bytes y saca de la pila.

FICOMP mem                  Compara entero de 2 ó4 bytes y saca de pila.

FIDIV mem                      División entera.

FDIVR mem                     División entera invertida.

FILD mem                        Carga un entero de 2, 4 u 8 bytes en la pila.

FIMUL  mem                    Multiplicación entera de 2 ó 4 bytes.

FINCSTP                         Incrementa el apuntador de la pila.

FINIT                               Inicializa el procesador después de WAIT.

FIST  mem                       Almacena entero de 2 ó 4 bytes.

FISTP  mem                    Almacena entero de 2, 4 u 8 bytes y saca de la pila.

FISUB  mem                    Resta entero de 2 ó 4 bytes.

FISUBR  mem                  Resta entera de 2 ó 4 bytes invertida.

FLD  mem                        Carga real de 4, 8 ó 10 bytes en la pila.

FLD1                               Pone +1.0 en el tope de la pila.

FLDCW mem                   Carga la palabra de control.

FLDENV  mem                 Carga entorno 8087 (14 bytes).

FLDL2E                           Cargalog2 e en el tope dela pila.

FLDL2T                           Cargalog2 10en el tope de la pila.

FLDLG2                           Cargalog102 en el tope de la pila.

FLDLN2                           Cargaloge2 en el tope de la pila.

FLDPI                              Carga p en el tope dela pila.

FLDZ                               Carga +0.0 en el tope de la pila.

FMUL                              Multiplicación real.

MUL  mem                       Multiplicación real desde memoria.

FMUL  ST, ST(i)               Multiplicación real desde pila.

FMUL  ST(i), ST               Multiplicación real a la pila.

FMULP  ST, ST(i)            Multiplicación real y saca de la pila.

FNCLEX                          Borra excepciones sin WAIT.

FNDISI                            Inhabilita interrupciones sin WAIT.

FNENI                              Habilita interrupciones sin WAIT.

FNINIT                             Inicializa procesador sin WAIT.

FNOP                              Operación nula.

FNSAVE  mem                 Salva estado 8087 (94 bytes) sin WAIT.

FNSTCW  mem                Almacena la palabra de control sin WAIT.

FNSTENV  mem               Guarda el entorno 8087 sin WAIT.

FNSTSW mem                 Almacena el estado8087 sin WAIT.

FPATAN                          Función arcotangente parcial.

FPREM                            Residuo parcial.

FPTAN                            Función tangente parcial.

FRNDINT                         Redondea a entero

FRSTOR mem                  Restablece estado8087 (94 bytes)

FSAVE mem                    Conserva el estado8087 (94 bytes).

FSCALE                          Escala

FSQRT                            Raíz cuadrada

FST                                 Almacena real.

FST  ST                           Almacena real desde el tope de la pila.

FST  ST(i)                        Almacena real desde lapila.

FSTCW   mem                 Almacena palabra de control  con WAIT.

FSTENV  mem                 Guarda el entorno 8087 después de WAIT.

FSTP  mem                     Guarda real de 4, 8 ó 10 bytes y saca de la pila.

FSTSW  mem                  Almacena la palabra de estado depués de WAIT.

FSUB                              Substracción real.

FSUB mem                      Substracción real desde memora.

FSUB ST, ST(i)                Substracción real desde la pila.

FSUB ST(i), ST                Substracción real a la pila.

FSUBPST, ST(i)               Substrae real y saca de pila.

FSUBR                            Substracción real invertida.

FSUBR  mem                   Substracción real invertida desde memoria.

FSUBR  ST,ST(i)              Substracción real invertida desde la pila.

FSUBR  ST(i), ST             Substracción real invertida a la pila.

FSUBRPST(i), ST            Substracción real invertida a la pila y saca.

FTST                               Prueba el tope dela pila.

FWAIT                             Aguarda que la última operación 8087 termine.

FXAM                              Examina el elemento del tope de la pila.

FXCH                              Intercambia contenido de los elementos de la pila.

FFREEST                         Intercambia el elemento del tope de la pila.

FFREEST(i)                      Intercambia el elemento del tope de la pila y el i-ésimo elemento.

FXTRACT                        Extrae el exponente y significando.

FYL2X                             Calcula Y log2 X.

FYL2PI                            Calcula Y log2 (x+1)

 

 

80186/80188/80286 (modo no protegido)

 

BOUND  reg, mem            Detecta valor fuera de rango.

ENTER inmed16, inmed8   Hace elemento en la pila para llamada a  procedimiento.

IMUL  reg, inmed              Multiplicación entera.

reg, r/m,inmed

INS  mem, DX                  Entrada de cadena desde el puerto DX.

INSB mem,DX                  Entrada de cadena de bytes desde el puerto DX.

INSW  mem DX                Entrada de cadena de palabras desde el puerto DX.

LEAVE                             Deja procedimiento.

OUTS DX, mem               Salida de cadena de bytes o palabras al puerto DX.

OUTSBDX,  mem             Salida de cadena de bytes al puerto DX.

OUTSW DX, mem            Salida de cadena de palabras al puerto DX.

POPA                              Saca todos los registros de la pila.

PUSH  inmed                   Introduce a la pila

PUSHA                            Introduce todos los registros.

RCL  r/m, inmed               Rotación a la izquierda con acarreo

RCR  r/m, inmed               Rotación a la derecha con acarreo.

ROL  r/m, inmed               Rotación a la izquierda.

ROR  r/m, inmed               Rotación a la derecha.

SAL  r/m, inmed               Desplazamiento aritmético a la izquierda.

SAR  r/m, inmed               Desplazamiento aritmético a la derecha.

SHL  r/m, inmed               Desplazamiento a la izquierda.

SHR  r/m, inmed               Desplazamiento a la derecha.

 

 

80286 (modo protegido)

 

ARPL  mem, reg               Ajusta petición de nivel de privilegio.

CLTS                               Limpia bandera de conmutación de tareas.

LAR reg, mem                  Carga derechos de acceso.

LGDT mem                      Carga la tabla de descriptores globales (8 bytes).

LIDT mem                        Carga tabla de descriptores de interrupciones (8 bytes).

LLDT mem                       Carga la tabla de descriptores locales.

LMSW mem                     Carga la palabra de estado.

LSL reg, mem                  Carga el límite del segmento.

LTR mem                         Carga registro de tareas.

SGDT mem                      Guarda la tabla de descriptores locales (8 bytes).

SIDT mem                       Guarda tabla de descriptores de interrupciones (8 bytes).

SMSW mem                    Guarda la palabra de estado.

STR mem                        Guarda registro de tareas.

VERR mem                      Verifica acceso de lectura.

VERW mem                     Verifica acceso de escritura.

80287

FSETPM                          Fija modo protegido.

FSTSWAX                       Almacena palabra de estado en AX (aguarda).

FNSTSWAX                     Almacena palabra de estado en AX (no aguarda).


 

 

APENDICE F.-  INTERRUPCIONES.


DIRECCION                                         INTERRUPCION                                   FUNCION

  (hex)                                                        (hex)                  

   0-3                                                            0                         Division by zero

   4-7                                                            1                         Single step trace

   8-B                                                             2                       Non maskable interrupt

   C-F                                                            3                         Break point instruction

  10-13                                                          4                         Overflow

  14-17                                                          5                         Print screen

  18-1F                                                         6,7                       Reserved

  20-23                                                          8                         Timer

  24-27                                                          9                         Keyboard interrupt

  28-37                                                      A,B,C,D                  Reserved

  38-3B                                                         E                        Diskette interrupt

  3C-3F                                                         F                        Reserved

  40-43                                                        10                         Video screen I/O

  44-47                                                         11                        Equipment check

  48-4B                                                        12                        Memory size check

  4C-4F                                                        13                        Diskette I/O

  50-53                                                         14                        Communication I/O

  54-57                                                         15                        Cassette I/O

  58-5B                                                        16                        Keyboard input

  5C-5F                                                        17                        Printer Output

  60-63                                                         18                        ROM Basic entry code

  64-67                                                         19                        Bootstrap loader

  68-6B                                                        1A                       Time of day

  6C-6F                                                        1B                       Get control on keyboard break

  70-73                                                         1C                       Get control on timer interrupt

  74-77                                                         1D                       Pointer to video initialization table

  78-7B                                                        1E                       Pointer to diskette parameter table

  7C-7F                                                        1F                        Pointer to table for graphics characters ASCII 128-255

  80-83                                                         20                        DOS program terminate

  84-87                                                         21                        DOS function call

  88-8B                                                        22                        DOS terminate address

  90-93                                                         24                        DOS fatal error vector

  94-97                                                         25                        DOS absolute disk read

  98-9B                                                        26                        DOS absolute disk write

  9C-9F                                                        27                        DOS terminate, fix in storage

  A0-FF                                                     28-3F                     Reserved for DOS

 100-1FF                                                    40-7F                     Not used

 200-217                                                    80-85                     Reserved by BASIC

 218-3C3                                                    86-F0                     Used by BASIC interpreter

 3C4-3FF                                                   F1-FF                     Not Used



Este texto puede ser copiado y reproducido libremente mientras su contenido no sea alterado, se cite la fuente y referencias. Las marcas registradas son responsabilidad de sus dueños y el autor de este texto no tiene relación alguna con estos. M. en C. Eduardo René Rodríguez Avila. © Todos los derechos reservados.


Ultima actualización: .