Tarea #8

INSTRUCCIONES DE

ENSAMBLADOR

 

 

Instrucciones del 8086 y 8088.

INSTRUCCIONES DE TRANSFERENCIA DE DATOS

(No afectan flags)

 

MOV dest,src

Copia el contenido del operando fuente (src) en el destino (dest).

Operación: dest <- src

Las posibilidades son:

1. MOV reg,{reg|mem|inmed}

2. MOV mem,{reg|inmed}

3. MOV {reg16|mem16},{CS|DS|ES|SS}

4. MOV {DS|ES|SS},{reg16|mem16}

 

PUSH src 

Pone el valor en el tope del stack.

Operación: SP <- SP - 2, [SP+1:SP] <- src donde src = {reg16|mem16|CS|DS|ES|SS}.

 

POP des  t

Retira el valor del tope del stack poniéndolo en el lugar indicado.

Operación: dest <- [SP+1:SP], SP <- SP + 2 donde dest = {reg16|mem16|DS|ES|SS}.

 

XCHG reg,{reg|mem}

Intercambia ambos valores.

 

IN {AL|AX},{DX|inmed (1 byte)}

Pone en el acumulador el valor hallado en el port indicado.

 

OUT {DX|inmed (1 byte)},{AL|AX}

Pone en el port indicado el valor del acumulador.

 

XLAT 

Realiza una operación de traducción de un código de un byte a otro código de un byte mediante una tabla.

Operación: AL <- [BX+AL]

 

LEA reg,mem

Almacena la dirección efectiva del operando de memoria en un registro.

Operación: reg <- dirección mem

 

LDS reg,mem32

Operación: reg <- [mem], DS <- [mem+2]

 

LES reg,mem32

Operación: reg <- [mem], ES <- [mem+2]

 

LAHF

Copia en el registro AH la imagen de los ocho bits menos significativos del registro de indicadores.

Operación: AH <- SF:ZF:X:AF:X:PF:X:CF

 

SAHF

Almacena en los ocho bits menos significativos del registro de indicadores el valor del registro AH.

Operación: SF:ZF:X:AF:X:PF:X:CF <- AH

 

PUSHF

Almacena los flags en la pila.

Operación: SP <- SP - 2, [SP+1:SP] <- Flags.

 

POPF

Pone en los flags el valor que hay en la pila.

Operación: Flags <- [SP+1:SP], SP <- SP + 2

 

 

INSTRUCCIONES ARITMETICAS

(Afectan los flags AF, CF, OF, PF, SF, ZF)

ADD dest,src

Operación: dest <- dest + src.

 

ADC dest,src

Operación: dest <- dest + src + CF.

 

SUB dest,src

Operación: dest <- dest - src.

 

SBB dest,src

Operación: dest <- dest - src - CF.

 

CMP dest,src

Operación: dest - src (sólo afecta flags).

 

INC dest

Operación: dest <- dest + 1 (no afecta CF).

 

DEC dest

Operación: dest <- dest - 1 (no afecta CF).

 

NEG dest

Operación: dest <- - dest.

donde dest = {reg|mem} y src = {reg|mem|inmed} no pudiendo ambos operandos estar en memoria.

 

DAA

Corrige el resultado de una suma de dos valores BCD empaquetados en el registro AL (debe estar inmediatamente después de una instrucción ADD o ADC). OF es indefinido después de la operación.

 

DAS

Igual que DAA pero para resta (debe estar inmediatamente después de una instrucción SUB o SBB).

 

AAA

Lo mismo que DAA para números BCD desempaquetados.

 

AAS

Lo mismo que DAS para números BCD desempaquetados.

 

AAD 

Convierte AH:AL en BCD desempaquetado a AL en binario.

Operación: AL <- AH * 0Ah + AL, AH <- 0. Afecta PF, SF, ZF, mientras que AF, CF y OF quedan indefinidos.

 

AAM

Convierte AL en binario a AH:AL en BCD desempaquetado.

Operación: AH <- AL / 0Ah, AL <- AL mod 0Ah. Afecta PF, SF, ZF, mientras que AF, CF y OF quedan indefinidos.

 

MUL {reg8|mem8} 

Realiza una multiplicación con operandos no signados de 8 por 8 bits.

Operación: AX <- AL * {reg8|mem8}. CF=OF=0 si AH = 0, CF=OF=1 en caso contrario. AF, PF, SF, ZF quedan indefinidos.

 

MUL {reg16|mem16}

 Realiza una multiplicación con operandos no signados de 16 por 16 bits.

Operación: DX:AX <- AX * {reg16|mem16}. CF=OF=0 si DX = 0, CF=OF=1 en caso contrario. AF, PF, SF, ZF quedan indefinidos.

 

IMUL {reg8|mem8}

Realiza una multiplicación con operandos con signo de 8 por 8 bits.

Operación: AX <- AL * {reg8|mem8} realizando la multiplicación con signo. CF = OF = 0 si el resultado entra en un byte, en caso contrario valdrán 1. AF, PF, SF, ZF quedan indefinidos.

 

IMUL {reg16|mem16}

Realiza una multiplicación con operandos con signo de 16 por 16 bits.

Operación: DX:AX <- AX * {reg16|mem16} realizando la multiplicación con signo. CF = OF = 0 si el resultado entra en dos bytes, en caso contrario valdrán 1. AF, PF, SF, ZF quedan indefinidos.

 

CBW

Extiende el signo de AL en AX. No se afectan los flags.

 

CWD

Extiende el signo de AX en DX:AX. No se afectan flags.

 

 

INSTRUCCIONES LOGICAS

 (Afectan AF, CF, OF, PF, SF, ZF)

AND dest,src

Operación: dest <- dest and src.

 

TEST dest,src

Operación: dest and src. Sólo afecta flags.

 

OR dest,src

Operación: dest <- dest or src.

 

XOR dest,src

Operación: dest <- dest xor src.

Las cuatro instrucciones anteriores ponen CF = OF = 0, AF queda indefinido y PF, SF y ZF dependen del resultado.

 

NOT dest

Operación: dest <- Complemento a 1 de dest. No afecta los flags.

 

SHL/SAL dest,{1|CL}

Realiza un desplazamiento lógico o aritmético a la izquierda.

 

SHR dest,{1|CL}

Realiza un desplazamiento lógico a la derecha.

 

SAR dest,{1|CL}

Realiza un desplazamiento aritmético a la derecha.

 

ROL dest,{1|CL}

Realiza una rotación hacia la izquierda.

 

ROR dest,{1|CL}

Realiza una rotación hacia la derecha.

 

RCL dest,{1|CL}

Realiza una rotación hacia la izquierda usando el CF.

 

RCR dest,{1|CL}

Realiza una rotación hacia la derecha usando el CF.

En las siete instrucciones anteriores la cantidad de veces que se rota o desplaza puede ser un bit o la cantidad de bits indicado en CL.

 

 

INSTRUCCIONES DE MANIPULACION DE CADENAS:

MOVSB

Copiar un byte de la cadena fuente al destino.

Operación:

1. ES:[DI] <- DS:[SI] (un byte)

2. DI <- DI±1

3. SI <- SI±1

 

MOVSW

Copiar dos bytes de la cadena fuente al destino.

Operación:

1. ES:[DI] <- DS:[SI] (dos bytes)

2. DI <- DI±2

3. SI <- SI±2

 

LODSB

Poner en el acumulador un byte de la cadena fuente.

Operación:

1. AL <- DS:[SI] (un byte)

2. SI <- SI±1

 

LODSW

Poner en el acumulador dos bytes de la cadena fuente.

Operación:

1. AX <- DS:[SI] (dos bytes)

2. SI <- SI±2

 

STOSB

Almacenar en la cadena destino un byte del acumulador.

Operación:

1. ES:[DI] <- AL (un byte)

2. DI <- DI±1

 

STOSW

Almacenar en la cadena destino dos bytes del acumulador.

Operación:

1. ES:[DI] <- AX (dos bytes)

2. DI <- DI±2

 

CMPSB

Comparar un byte de la cadena fuente con el destino.

Operación:

1. DS:[SI] - ES:[DI] (Un byte, afecta sólo los flags)

2. DI <- DI±1

3. SI <- SI±1

 

CMPSW

Comparar dos bytes de la cadena fuente con el destino.

Operación:

1. DS:[SI] - ES:[DI] (Dos bytes, afecta sólo los flags)

2. DI <- DI±2

3. SI <- SI±2

 

SCASB

Comparar un byte del acumulador con la cadena destino.

Operación:

1. AL - ES:[DI] (Un byte, afecta sólo los flags)

2. DI <- DI±1

 

SCASW

Comparar dos bytes del acumulador con la cadena destino.

Operación:

1. AX - ES:[DI] (Dos byte, afecta sólo los flags)

2. DI <- DI±2

En todos los casos el signo + se toma si el indicador DF vale cero. Si vale 1 hay que tomar el signo -. Prefijo para las instrucciones MOVSB, MOVSW, LODSB, LODSW, STOSB y STOSW:

REP: Repetir la instrucción CX veces.

 

Prefijos para las instrucciones CMPSB, CMPSW, SCASB, SCASW:

REPZ/REPE: Repetir mientras que sean iguales hasta un máximo de CX veces.

REPNZ/REPNE: Repetir mientras que sean diferentes hasta un máximo de CX veces.

 

 

INSTRUCCIONES DE TRANSFERENCIA DE CONTROL

(No afectan los flags):

 

JMP label

Saltar hacia la dirección label.

 

CALL label

Ir al procedimiento cuyo inicio es label. Para llamadas dentro del mismo segmento equivale  a  PUSH IP: JMP label, mientras que para llamadas entre segmentos equivale a PUSH CS: PUSH IP: JMP label.

 

RET

Retorno de procedimiento.

 

RET inmed

Retorno de procedimiento y SP <- SP + inmed.

Variaciones de la instrucción de retorno:

 

RETN [inmed]

En el mismo segmento de código. Equivale a POP IP [:SP <- SP + inmed].

 

RETF [inmed]

En otro segmento de código. Equivale a POP IP: POP CS [:SP <- SP + inmed]

 

Saltos condicionales aritméticos (usar después de CMP):

Aritmética signada (con números positivos, negativos y cero)

 

JL etiqueta/JNGE etiqueta

Saltar a etiqueta si es menor.

 

JLE etiqueta/JNG etiqueta

Saltar a etiqueta si es menor o igual.

 

JE etiqueta

Saltar a etiqueta si es igual.

 

JNE etiqueta

Saltar a etiqueta si es distinto.

 

JGE etiqueta/JNL etiqueta

Saltar a etiqueta si es mayor o igual.

 

JG etiqueta/JNLE etiqueta

Saltar a etiqueta si es mayor.

Aritmética sin signo (con números positivos y cero)

 

JB etiqueta/JNAE etiqueta

Saltar a etiqueta si es menor.

 

JBE etiqueta/JNA etiqueta

Saltar a etiqueta si es menor o igual.

 

JE etiqueta

Saltar a etiqueta si es igual.

 

JNE etiqueta

Saltar a etiqueta si es distinto.

 

JAE etiqueta/JNB etiqueta

Saltar a etiqueta si es mayor o igual.

 

JA etiqueta/JNBE etiqueta

Saltar a etiqueta si es mayor.

 

Saltos condicionales según el valor de los indicadores:

JC label

Saltar si hubo arrastre/préstamo (CF = 1).

 

JNC label

Saltar si no hubo arrastre/préstamo (CF = 0).

 

JZ label

Saltar si el resultado es cero (ZF = 1).

 

JNZ label

Saltar si el resultado no es cero (ZF = 0).

 

JS label

Saltar si el signo es negativo (SF = 1).

 

JNS label

Saltar si el signo es positivo (SF = 0).

 

JP/JPE label

Saltar si la paridad es par (PF = 1).

 

JNP/JPO label

Saltar si la paridad es impar (PF = 0).

 

Saltos condicionales que usan el registro CX como contador:

LOOP label

Operación: CX <- CX-1. Saltar a label si CX<>0.

 

LOOPZ/LOOPE label

Operación: CX <- CX-1. Saltar a label si CX <> 0 y ZF = 1.

 

LOOPNZ/LOOPNE label

Operación: CX <- CX-1. Saltar a label si CX <> 0 y ZF = 0.

 

JCXZ label

Operación: Salta a label si CX = 0.

 

Interrupciones:

INT número

Salva los flags en la pila, hace TF=IF=0 y ejecuta la interrupción con el número indicado.

 

INTO

Interrupción condicional. Si OF = 1, hace INT 4.

 

IRET

Retorno de interrupción. Restaura los indicadores del stack.

Instrucciones del 80286

 

ARPL dest, src (Adjust Requested Privilege Level of selector): Compara los bits RPL de dest contra src.

Si el RPL de dest es menor que el RPL de src, los bits RPL del destino se cargan con los bits RPL de src y el indicador ZF se pone a uno. En caso contrario ZF se pone a cero. Ver nota 1.

 

CLTS (Clear Task Switched Flag): Pone a cero el indicador TS (bit 3 de la palabra de control de la máquina MSW).

 

LAR dest, src (Load Access Rights): El byte más alto del registro destino se carga con el byte de derechos de acceso del segmento indicado por el selector almacenado en src. Pone ZF a uno si se puede realizar la carga.

 

LGDT mem64 (Load Global Table register): Carga el valor del operando en el registro GDTR. Antes de ejecutar esta instrucción la tabla debe estar en memoria.

 

LIDT mem64 (Load Interrupt Table register): Carga el valor del operando en el registro IDTR. Antes de ejecutar esta instrucción la tabla debe estar en memoria.

 

LLDT {reg16|mem16} (Load Local Descriptor Table Register): Carga el selector indicado por el operando en el registro LDTR. Antes de ejecutar esta instrucción la tabla deberá estar en memoria.

 

LMSW {reg16|mem16} (Load Machine Status Word): Carga el valor del operando en la palabra de estado de la máquina MSW. El bit PE (bit 0) no puede ser puesto a cero por esta instrucción, por lo que una vez que se cambió a modo protegido, la única manera de volver a modo real es mediante un RESET del microprocesador.

 

LSL dest, src (Load Segment Limit): Carga el límite del segmento de un selector especificado en src en el registro destino si el selector es válido y visible en el nivel de privilegio actual. Si ocurre lo anterior el indicador ZF se pone a uno, en caso contrario, se pone a cero.

 

LTR {reg16|mem16} (Load Task Register): Carga el selector indicado por el operando en el registro TR.

El TSS (Task State Segment) apuntado por el nuevo TR deberá ser válido.

 

SGDT mem64 (Store Global Descriptor Table register): Almacena el contenido del registro GDTR en el operando especificado.

 

SIDT mem64 (Store Interrupt Descriptor Table register): Almacena el contenido del registro IDTR en el operando especificado.

 

SLDT {reg16|mem16} (Store Global Descriptor Table register): Almacena el contenido del registro LDTR (que es un selector a la tabla de descriptores globales) en el operando especificado.

 

SMSW {reg16|mem16} (Store Machine Status Word): Almacena la palabra de estado de la máquina MSW en el operando especificado.

 

STR {reg16|mem16} (Store Task Register): Almacena el registro de tarea actual (selector a la tabla de descriptores globales) en el operando especificado.

 

VERR/VERW {reg16|mem16} (Verify Read/Write): Verifica si el selector de segmento especificado en el operando es válido y se puede leer/escribir en el nivel de privilegio actual. En este caso se pone ZF a uno, en caso contrario se pone ZF a cero.

 

Instrucciones del 80386

 

BSF dest, src (Bit Scan Forward): Busca el primer bit puesto a 1 del operando fuente src (comenzando por el bit cero hasta el bit n-1). Si lo encuentra pone el indicador ZF a 1 y carga el destino dest con el índice a dicho bit. En caso contrario pone ZF a 0.

 

BSR dest, src (Bit Scan Reverse): Busca el primer bit puesto a 1 del operando fuente src (comenzando por el bit n-1 hasta el bit cero). Si lo encuentra pone el indicador ZF a 1 y carga el destino dest con el índice a dicho bit. En caso contrario pone ZF a 0.

 

BT dest, src (Bit Test): El bit del destino dest indexado por el valor fuente se copia en el indicador CF.

 

BTC dest, src (Bit Test with Complement): El bit del destino dest indexado por el valor fuente se copia en el indicador CF y luego se complementa dicho bit.

 

BTR dest, src (Bit Test with Reset): El bit del destino dest indexado por el valor fuente src se copia en el indicador CF y luego pone dicho bit a cero.

 

BTS dest, src (Bit Test with Set): El bit del destino dest indexado por el valor fuente src se copia en el indicador CF y luego pone dicho bit a uno.

 

CDQ (Convert Doubleword to Quadword): Convierte el número signado de 4 bytes en

 

EAX en un número signado de 8 bytes en EDX:EAX copiando el bit más significativo (de signo) de EAX en todos los bits de EDX.

 

CWDE (Convert Word to Extended Doubleword): Convierte una palabra signada en el registro AX en una doble palabra signada en EAX copiando el bit de signo (bit 15) de AX en los bits 31-16 de EAX.

 

JECXZ label (Jump on ECX Zero): Salta a la etiqueta label si el registro ECX vale cero.

 

LFS, LGS, LSS dest, src (Load pointer using FS, GS, SS): Carga un puntero de 32 bits de la memoria src al registro de uso general destino dest y FS, GS o SS. El offset se ubica en el registro destino y el segmento en FS, GS o SS. Para usar esta instrucción la palabra en la dirección indicada por src debe contener el offset, y la palabra siguiente debe contener el segmento. Esto simplifica la carga de punteros lejanos (far) de la pila y de la tabla de vectores de interrupción.

 

MOVSX dest, src (Move with Sign eXtend): Copia el valor del operando fuente src al registro destino dest (que tiene el doble de bits que el operando fuente) extendiendo los bits del resultado con el bit de signo. Se utiliza para aritmética signada (con números positivos y negativos).

 

MOVZX dest, src (Move with Zero eXtend): Copia el valor del operando fuente src al registro destino dest (que tiene el doble de bits que el operando fuente) extendiendo los bits del resultado con ceros. Se utiliza para aritmética no signada (sin números negativos).

 

POPAD (Pop All Doubleword Registers): Retira los ocho registros de uso general de 32 bits de la pila en el siguiente orden: EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX. El valor de ESP retirado de la pila se descarta.

 

POPFD (Pop Doubleword Flags): Retira de la pila los indicadores completos (32 bits).

 

PUSHAD (Push All Doubleword Registers): Pone los ocho registros de uso general de 32 bits en la pila en el siguiente orden: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI.

 

PUSHFD (Push Doubleword Flags): Pone los 32 bits del registro de indicadores en la pila.

 

SETcc dest (Set Byte on Condition cc): Pone el byte del destino dest a uno si se cumple la condición, en caso contrario lo pone a cero. Las condiciones son las mismas que para los saltos condicionales (se utilizan las mismas letras que van después de la "J").

 

SHLD dest, src, count (Shift Left Double precision): Desplaza dest a la izquierda count veces y las  posiciones abiertas se llenan con los bits más significativos de src.

 

SHRD dest, src, count (Shift Left Double precision): Desplaza dest a la derecha count veces y las posiciones abiertas se llenan con los bits menos significativos de src.

 

Instrucciones del 80387

 

FSIN: Calcula el seno del valor en ST. El resultado reemplaza el valor anterior de ST.

 

FCOS: Calcula el coseno del valor en ST. El resultado reemplaza el valor anterior de ST.

 

FSINCOS: Calcula el seno y el coseno del valor en ST. Cuando se completa la instrucción, el valor de ST es el coseno del ST original, mientras que en ST(1) se encuentra el seno. Como se realiza una introducción en la pila, el valor que antes se encontaba en ST(1) ahora estará en ST(2).

 

FUCOM ST(i): Realiza una comparación entre el operando y ST. Si no se especifica parámetro se asume ST(1). Actualiza los indicadores de punto flotante como sigue:

Relación C3, C2, C0

No comparables 111

ST > Fuente 000

ST < Fuente 001

ST = Fuente 100

 

FUCOMP ST(i): Hace lo mismo que FUCOM ST(i) y luego elimina el elemento que está en el tope de la pila ST.

 

FUCOMPP: Hace lo mismo que FUCOM ST(1) y luego retira los dos elementos de la pila.

 

FPREM1: Es similar al instrucción FPREM del coprocesador 8087, pero cumple con la norma IEEE 754.

Las instrucciones FLENV y F[N]STENV necesitan ahora un espacio de 18 bytes de memoria y FRSTOR y F[N]SAVE necesitan 98 bytes en memoria. Esto se debe a que las direcciones que maneja el 80387 son de 32 bits (los anteriores manejan direcciones de 16 bits).

 

Instrucciones del 80486

 

BSWAP reg32 (Byte Swap): Cambia el orden de los bytes. Si antes de BSWAP el orden era B0, B1, B2, B3, después de BSWAP el orden será B3, B2, B1, B0.

 

CMPXCHG dest, src (Compare and Exchange): Compara el acumulador (AL o EAX) con dest. Si es igual, dest se carga con el valor de src, en caso contrario, el acumulador se carga con el valor de dest.

 

INVD (Invalidate Cache): Vacía el caché interno. Realiza un ciclo de bus especial que indica que deben vaciarse los cachés externos. Los datos en el caché que deben escribirse en la memoria se pierden.

 

INVLPG (Invalidate Translation Look-Aside Buffer Entry): Invalida una entrada de página en el buffer de conversión por búsqueda (TLB). Esta instrucción puede ser implementada de forma diferente en microprocesadores futuros.

 

WBINVD (Write Before Invalidate Data Cache): Realiza los cambios indicados en el caché en la memoria externa y luego lo invalida.

 

XADD dest, src (Exchange and Add): Suma los operandos fuente y destino poniendo el resultado en el destino. El valor original del destino se mueve a la fuente. La instrucción cambia los indicadores de acuerdo al resultado de la suma.

 

Instrucciones del Pentium

 

CMPXCHG8B reg, mem64 (Compare and Exchange 8 Bytes): Compara el valor de 64

bits ubicado en EDX:EAX con un valor de 64 bits situado en memoria. Si son iguales, el valor en memoria se reemplaza por el contenido de ECX:EBX y el indicador ZF se pone a uno. En caso contrario, el valor en memoria se carga en EDX:EAX y el indicador ZF se pone a cero.

 

CPUID (CPU Identification): Le informa al software acerca del modelo de microprocesador en que está ejecutando. Un valor cargado en EAX antes de ejecutar esta instrucción indica qué información deberá retornar CPUID. Si EAX = 0, se cargará en dicho registro el máximo valor de EAX que se podrá utilizar en CPUID (para el Pentium este valor es 1). Además, en la salida aparece la cadena de identificación del fabricante contenido en EBX, ECX y EDX. EBX contiene los primeros cuatro caracteres, EDX los siguientes cuatro, y ECX los últimos cuatro. Para los procesadores Intel la cadena es "GenuineIntel".

 

RDMSR (Read from Model-Specific Register): El valor en ECX especifica uno de los registros de 64 bits específicos del modelo del procesador. El contenido de ese registro se carga en EDX:EAX. EDX se carga con los 32 bits más significativos, mientras que EAX se carga con los 32 bits menos significativos.

 

RDTSC (Read from Time Stamp Counter): Copia el contenido del contador de tiempo (TSC) en EDX:EAX (el Pentium mantiene un contador de 64 bits que se incrementa por cada ciclo de reloj). Cuando el nivel de privilegio actual es cero el estado del bit TSD en el registro de control CR4 no afecta la operación de esta instrucción. En los anillos 1, 2 ó 3, el TSC se puede leer sólo si el bit TSD de CR4 vale cero.

 

RSM (Resume from System Management Mode): El estado del procesador se restaura utilizando la copia que se creó al entrar al modo de manejo del sistema (SMM). Sin embargo, los contenidos de los registros específicos del modelo no se afectan. El procesador sale del SMM y retorna el control a la aplicación o sistema operativo interrumpido. Si el procesador detecta alguna información inválida, entra en el estado de apagado (shutdown).

 

WRMSR (Write to Model-Specific Register): El valor en ECX especifica uno de los registros de 64 bits específicos del modelo del procesador. El contenido de EDX:EAX se carga en ese registro. EDX debe contener los 32 bits más significativos, mientras que EAX debe contener los 32 bits menos significativos.

CONCLUSIONES 

Estas instrucciones son esenciales para la programacion incluso de la misma computadora, ademas de que todos los demas lenguajes esteructurados se basan en algunas de estas instrucciones y las tienen como base para poder relizar los programas. Estas son solo algunas de las instrucciones usadas por los procesadores de Intel y me pude dar cuenta que cada dia tratan de hacer mejoras para sacarle mas provecho a las computadoras asi como facilitarle y hacer mas agradable el uso de estas a los usuarios.

REFERENCIAS

http://www.sinergia-web.com.mx/clases/asm9708/Temas/clase07.htm

htttp://www.intel.com

inicio
Hosted by www.Geocities.ws

1