Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
MICROPROGRAMACION
UNIDAD III
Modos de direccionamiento:
Estos procesadores tienen 27 modos de direccionamiento (una cantidad bastante más grande que los
microprocesadores anteriores) o reglas para localizar un operando de una instrucción. Tres de ellos
son comunes a microprocesadores anteriores:
Direccionamiento inmediato (el operando es un número que se encuentra en la misma instrucción),
Direccionamiento a registro (el operando es un registro del microprocesador) y
Direccionamiento inherente (el operando está implícito en la instrucción, por ejemplo, en la
multiplicación uno de los operandos siempre es el acumulador).
El resto de los modos sirve para localizar un operando en memoria. Para facilitar la explicación de
estos modos, se pueden resumir de la siguiente manera:
Deben sumarse cuatro cantidades: 1) dirección de segmento, 2) dirección base, 3) una cantidad
índice y 4) un desplazamiento.
El programador puede utilizar tanto la base como el índice para gestionar ciertas cosas, tales como
matrices de dos dimensiones, o estructuras internas a otras estructuras, esquemas que se utilizan en
las prácticas comunes de programación. La base y el índice son variables o dinámicas, ya que están
almacenadas en registros de la CPU. Es decir, pueden modificarse fácilmente mientras se ejecuta
un programa.
Además del segmento, base e índice, se usa un desplazamiento de 16 bits, 8 bits o 0 bits (sin
desplazamiento). Ésta es una cantidad estática que se fija al tiempo de ensamblado (paso de código
fuente a código de máquina) y no puede cambiarse durante la ejecución del programa (a menos que
el programa se escriba sobre sí mismo, lo que constituye una práctica no aconsejada).
Todo esto genera los 24 modos de direccionamiento a memoria que se ven a continuación:
Otras combinaciones no están implementadas en la CPU y generarán error al querer ensamblar, por
ejemplo, ADD CL,[DX+SI].
El ensamblador genera el tipo de desplazamiento más apropiado (0, 8 ó 16 bits) dependiendo del
valor que tenga la constante: si vale cero se utiliza el primer caso, si vale entre -128 y 127 se utiliza
el segundo, y en otro caso se utiliza el tercero. Nótese que [BP] sin desplazamiento no existe.
En la arquitectura de 32 bit esa combinación es permitida, puesto que los operandos en memoria
puede direccionarse (calcular su Offset) según lo especifica la siguiente figura.
Al ensamblar una instrucción como, por ejemplo, MOV AL,[BP], se generará un desplazamiento de
8 bits con valor cero. Esta instrucción ocupa tres bytes, mientras que MOV AL,[SI] ocupa dos,
porque no necesita el desplazamiento.
Veamos un ejemplo: MOV AL, ES:[BX+SI+6]. En este caso el operando de la izquierda tiene
direccionamiento a registro mientras que el de la derecha indica una posición de memoria. Poniendo
valores numéricos, supongamos que los valores actuales de los registros sean:
ES = 3200h, BX = 200h, SI = 38h. Como se apuntó antes la dirección real de memoria será:
UES_MICROPROGRAMACION_JEIT
Otros ejemplos de direccionamiento son:
Instrucciones de Máquina
INSTRUCCIONES DE TRANSFERENCIA DE DATOS
(No afectan flags)
MOV dest,src
UES_MICROPROGRAMACION_JEIT
MOVZX dest,src
Copia el contenido del operando fuente (src) (registro o ubicación de memoria) en el operando de
destino (registro) y extiende el valor con ceros. El tamaño del valor convertido depende del
atributo de tamaño de operando.
MOVSX dest,src
Copia el contenido del operando fuente (src) (registro o ubicación de memoria) en el operando de
destino (registro) y extiende el valor del signo a 16 o 32 bits. El tamaño del valor convertido
depende del atributo de tamaño de operando.
PUSH src
POP dest
Retira el valor del tope del stack poniéndolo en el operando destino (dest).
Operación: dest <- [SP], SP <- SP + 2|4 donde
dest = { reg32|mem32|reg16|mem16|DS|ES|SS|FS|GS}.
Recupera el valor del tope del stack colocándolo en el operando destino (dest) y después
incrementa el SP en el tamaño del valor(src)
XCHG reg,{reg|mem}
UES_MICROPROGRAMACION_JEIT
IN {AL|AX\EAX},{DX|inmed (1 byte)}
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 <- DS:[(E)BX+AL sin signo]
LEA reg,mem
LDS reg,mem32/mem48
LAHF
Copia en el registro AH la imagen de los ocho bits menos significativos del registro de
indicadores.
Operación: AH <- SF:ZF:0:AF:0:PF:1: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
POPF
PUSHA
Almacena el contenido de los registros de propósito general en la pila. Los registros se almacenan
en la pila en el siguiente orden: AX, CX, DX, BX, SP (valor original), BP, SI y DI.
PUSHAD
Almacena el contenido de los registros de propósito general en la pila. Los registros se almacenan
en la pila en el siguiente orden: EAX, ECX, EDX, EBX, ESP (valor original), EBP, ESI y EDI.
POPA
Recupera el contenido de la pila en los registros de propósito general. Los registros se cargan en el
siguiente orden: DI, SI, BP, BX, DX, CX y AX . El valor en la pila para el registro SP se ignora.
En cambio, el registro SP se incrementa después de cargar cada registro.
POPAD
UES_MICROPROGRAMACION_JEIT
Recupera el contenido de la pila en los registros de propósito general. Los registros se cargan en el
siguiente orden: EDI, ESI, EBP, EBX, EDX, ECX y EAX . El valor en la pila para el registro ESP
se ignora. En cambio, el registro ESP se incrementa después de cargar cada registro.
INSTRUCCIONES ARITMETICAS
(Afectan los flags AF, CF, OF, PF, SF, ZF)
ADD dest,src
ADC dest,src
SUB dest,src
SBB dest,src
CMP dest,src
Comparar.
Operación: dest - src (sólo afecta flags).
INC dest
Incrementa en 1.
Operación: dest <- dest + 1 (no afecta CF).
DEC dest
Disminuye en 1.
Operación: dest <- dest - 1 (no afecta CF).
UES_MICROPROGRAMACION_JEIT
NEG dest
Como recordarán estas instrucciones aritméticas utilizan la nomenclatura dest = {reg|mem} y src =
{reg|mem|inmed} no pudiendo ambos operandos estar en memoria.
DAA
DAS
AAA
AAS
AAD
AAM
MUL {reg8|mem8}
MUL {reg16|mem16}
MUL {reg32|mem32}
IMUL {reg8|mem8}
IMUL {reg16|mem16}
IMUL {reg32|mem32}
DIV {{reg8|mem8}|{reg16|mem16}|{reg32|mem32}}
UES_MICROPROGRAMACION_JEIT
Realiza una división con divisor no signados de 8 , 16 bits o 32 bits.
IDIV {{reg8|mem8}|{reg16|mem16}|{reg32|mem32}}
CBW
CWD
CWDE
CDQ
Conjunción Lógica.
UES_MICROPROGRAMACION_JEIT
Operación: Realiza una conjunction lógica ( AND ) sobre los bits de cada uno de los operandos,
donde dest <- dest and src.
TEST dest,src
Examina bits.
Operación: Examina un campo por una configuración específica de bits tal como AND, pero no
cambia el operando destino. dest and src. Sólo afecta flags.
OR dest,src
Disyunción lógica.
Operación: Realiza una disyunción sobre los bits de dos operandos dest <- dest or src.
XOR dest,src
Disyunción exclusiva.
Operación: Realiza una disyunción excluyente sobre los bits de dos operandos
dest <- dest xor src.
NOT dest
Negación Lógica
Operación: dest <- Complemento a 1 de dest. No afecta los flags.
SHR dest,{1|CL}
0 DATO CF
Realiza un desplazamiento lógico a la derecha. SHR
SAR dest,{1|CL}
DATO CF
Realiza un desplazamiento aritmético a la derecha.
SAR
ROL dest,{1|CL}
Realiza una rotación hacia la izquierda. CF DATO
ROL
UES_MICROPROGRAMACION_JEIT
DATO CF
ROR
ROR dest,{1|CL}
RCL dest,{1|CL}
CF DATO
RCL
Realiza una rotación hacia la izquierda usando el CF.
RCR dest,{1|CL}
DATO CF
Realiza una rotación hacia la derecha usando el CF. RCR
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.
MOVSB
MOVSW
MOVSD
UES_MICROPROGRAMACION_JEIT
LODSB
LODSW
LODSD
STOSB
STOSW
STOSD
UES_MICROPROGRAMACION_JEIT
CMPSB
CMPSW
CMPSD
SCASB
SCASW
SCASD
UES_MICROPROGRAMACION_JEIT
INSB
Operación:
1. ES:[EDI] <- un byte del puerto indicado en DX
2. EDI <- EDI±1
INSW
Operación:
1. ES:[EDI] <- dos bytes del puerto indicado en DX
2. EDI <- EDI±2
INSD
Operación:
1. ES:[EDI] <- cuatro byte del puerto indicado en DX
2. EDI <- EDI±4
OUTSB
Escribe un byte desde la ubicación de memoria especificada en DS: (E) SI al puerto de E/S
especificado en DX
Operación:
1. Puerto en DX <- DS:[ESI] (un byte)
2. ESI <- ESI±1
OUTSW
Escribe una palabra desde la ubicación de memoria especificada en DS: (E) SI al puerto de E / S
especificado en DX
Operación:
1. Puerto en DX <- DS:[ESI] (dos bytes)
2. ESI <- ESI±2
UES_MICROPROGRAMACION_JEIT
OUTSD
Escribe una Doble palabra desde la ubicación de memoria especificada en DS: (E) SI al puerto de
E / S especificado en DX
Operación:
1. Puerto en DX <- DS:[ESI] (cuatro byte)
2. ESI <- ESI±4
En todos los casos el signo POSITIVO (+) se toma si el indicador DF vale cero. Si vale 1 hay que
tomar el signo NEGATIVO (-).
Prefijos para las instrucciones CMPSB, CMPSW, CMPSD, SCASB, SCASW y SCASD:
REPZ/REPE: Repetir mientras que sean iguales hasta un máximo de ECX veces.
REPNZ/REPNE: Repetir mientras que sean diferentes hasta un máximo de ECX veces.
JMP label
CALL 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.
UES_MICROPROGRAMACION_JEIT
Saltos condicionales aritméticos (usar después de CMP):
Aritmética signada (con números positivos, negativos y cero)
JL etiqueta/JNGE etiqueta
JE etiqueta
JNE etiqueta
JG etiqueta/JNLE etiqueta
JE etiqueta
JNE etiqueta
JC label
JNC label
JZ label
JNZ label
JS label
JNS label
JO label
JNO label
JP/JPE label
JNP/JPO label
UES_MICROPROGRAMACION_JEIT
Saltos condicionales que usan el registro ECX como contador:
LOOP label
LOOPZ/LOOPE label
LOOPNZ/LOOPNE label
JCXZ label
JECXZ label
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
IRET
Clear Carry
Operación : CF <- 0.
UES_MICROPROGRAMACION_JEIT
STC
CMC
Complemento de la bandera de Carry
CF <- 1 - CF.
NOP
No hace nada.
CLD
Poner en 0 la bandera de Dirección
DF <- 0 (Dirección ascendente).
STD
CLI
STI
HLT
Detiene la ejecución del procesador hasta que llegue una interrupción externa.
WAIT
Detiene la ejecución del procesador hasta que se active el pin TEST del mismo.
LOCK
UES_MICROPROGRAMACION_JEIT