Unidad 2 Ensamblador
Unidad 2 Ensamblador
Unidad 2 Ensamblador
UNIDAD II
ELEMENTOS DEL
LENGUAJE
2.1 INSTRUCCIONES LINEALES.
2.1.1 Movimientos.
2.1.2 Pila.
2.1.3 Matemáticos.
2.1.4 Ajustes.
2.1.5 Comparación.
2.2 SALTOS.
2.2.1 Incondicionales.
2.2.2 Condicionales.
2.5 DESPLAZAMIENTO.
2.5.1 Lineal.
2.5.2 Circular.
2.1.1 Movimientos.
MOV (transferencia).
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Con la instrucción MOV diremos que se pueden realizar todo tipo de movimientos
teniendo en cuenta las siguientes restricciones:
DATO1 ← DATO2
la instrucción MOV DATO2, DATO1 sería incorrecta. Lo que sí sería correcto sería
utilizar el registro DX, u otro, como puente y hacer:
2. Tampoco se puede hacer una transferencia directa entre dos registros de segmento.
Por eso, como en el caso anterior, si fuera preciso se utilizaría un registro como
puente.
MOV hacia un registro de segmento, las interrupciones quedan inhibidas hasta después
de ejecutarse la siguiente instrucción (8086/88 de 1983 y procesadores posteriores).
XCHG (intercambiar).
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Por ejemplo, si queremos intercambiar los contenidos de los registros AX y BX, podemos
hacer:
MOV AUX, AX
MOV AX, BX
MOV BX, AUX
en donde AUX es una variable auxiliar que hace de puente, o simplemente utilizar:
XCHG AX, BX
Otro ejemplo:
XCHG BL, CH
XCHG MEM_PAL, BX
Las restricciones que presenta esta operación es que no se pueden efectuar intercambios
directamente entre posiciones de memoria ni tampoco entre registros de segmento.
XLAT (traducción).
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
DATOS SEGMENT
TABLA DB 2, 3, 5, 8, 16, 23
DATOS ENDS
CODIGO SEGMENT
MOVE BX, OFFSET TABLA ;Inicializa BX con la dirección donde comienza la tabla
MOVE AL, 5
XLAT TABLA
CODIGO ENDS
Otro ejemplo:
MOV BX, OFFSET TABLA
MOV AL, 4
XLAT TABLA
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Ejemplo:
PUNT DD 12345678H
IN (entrada).
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Ejemplo:
IN AX, 0FH
IN AL, DX
OUT (salida).
Ejemplo:
OUT 12H, AX
OUT DX, AL
2.1.2 Pila.
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Transfiere el elemento palabra que se encuentra en lo alto de la pila (apuntado por SP) al
operando destino que a de ser tipo palabra, e incrementa en dos el registro SP. La
instrucción POP CS, poco útil, no funciona correctamente en los 286 y superiores.
Ejemplos:
POP AX
POP PEPE
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Ejemplo:
PUSH CS
Sintaxis: POPF
Indicadores: OF DF IF TF SF ZF AF PF CF
x x x x x x x x x
Sintaxis: PUSHF
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
2.1.3 Matemáticos.
S U M A S.
Sintaxis: AAA
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - ? ? x ? x
Ejemplo:
ADD AL, BL
AAA
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
Ejemplo:
ADC AX, BX
ADD (suma).
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
Sintaxis: DAA
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - x x x x x
Convierte el contenido del registro AL en un par de valores BCD: si los cuatro bits menos
significativos de AL son un número mayor que 9, el indicador AF se pone a 1 y se suma 6
a AL. De igual forma, si los cuatro bits más significativos de AL tras la operación anterior
son un número mayor que 9, el indicador CF se pone a 1 y se suma 60h a AL.
Ejemplo:
ADD AL, CL
DAA
INC (Incrementar).
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x -
Ejemplos:
INC AL
INC ES: [DI]
INC SS: [BP+4]
INC WORD PTR CS: [BX+DI+7]
R E S T A S.
Sintaxis: AAS
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - ? ? x ? x
Ejemplo:
SUB AL, BL
AAS
CMP (Comparación).
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
Resta origen de destino sin retornar ningún resultado. Los operandos quedan inalterados,
paro los indicadores pueden ser consultados mediante instrucciones de bifurcación
condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma
dimensión.
Ejemplo:
CMP BX, MEM_PAL
CMP CH, CL
Sintaxis: DAS
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - x x x x x
Ejemplo:
SUB AL, BL
DAS
DEC (Decrementar).
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x -
Resta una unidad del operando destino. El operando puede ser byte o palabra. Obsérvese
que esta instrucción no modifica el bit de acarreo (CF) y no es posible detectar un
desbordamiento por este procedimiento (utilícese ZF).
Ejemplo:
DEC AX
DEC MEM_BYTE
NEG (Negación).
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
Ejemplo:
NEG AL
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
de más de 16 bits, en varios pasos, considerando lo que nos llevamos (el acarreo) de la
resta anterior.
Ejemplo:
SBB AX, AX
SBB CH, DH
SUB (Resta).
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
Ejemplos:
SUB AL, BL
SUB DX, DX
M U L T I P L I C A C I O N E S.
Sintaxis: AAM
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - x x ? x ?
Ejemplo:
MUL BL
AAM
Sintaxis: IMUL origen (origen no puede ser operando inmediato en 8086, sí en 286)
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - ? ? ? ? x
Ejemplo:
IMUL BX
IMUL CH
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - ? ? ? ? x
Ejemplo:
MUL BYTE PTR DS: [DI]
MUL DX
MUL CL
Desbordamientos.
Este alerta con los desbordamientos en las operaciones aritméticas. Ya que un byte solo
permite el uso de un bit de signo y siete de datos (desde -128 hasta +127), una operación
aritmética puede exceder con facilidad la capacidad de un registro de un byte. Y una
suma en el registro AL, que exceda su capacidad puede provocar resultados inesperados.
esta en el registro AX. La operación ignora y borra cualquier información que pueda estar
en el AH.
Para multiplicar dos números de palabras dobles, el multiplicando esta en el registro EAX
y el multiplicador es una palabra doble en memoria o en otro registro. El producto es
generado en el par EDX:EAX. La operación ignora y borra cualquier información que ya
este en el EDX.
MUL CL byte AL AX
MUL BX palabra AX DX:AX
MUL EBX palabra doble EAX EDX:EAX
BYTE1 DB ?
WORD1 DW ?
DWORD1 DD ?
DIVISIONES.
Sintaxis: AAD
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - x x ? x ?
Ejemplo:
AAD
DIV BL
En el ejemplo, tras convertir los dos números BCD no empaquetados (en AX) en un
dividendo válido, la instrucción de dividir genera un resultado correcto.
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - ? ? ? ? ?
Ejemplo:
DIV BL
DIV MEM_PAL
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - ? ? ? ? ?
Ejemplo:
IDIV BL
IDIV BX
Las operaciones de división básicas son byte entre byte, palabra entre palabra y palabras
dobles entre palabra dobles.
Para esta operación, el dividendo esta en el par DX:AX y el divisor es una palabra en
memoria o en otro registro. Después de la división, el residuo esta en el DX y el cociente
esta en el AX. El cociente de una palabra permite para datos sin signo un máximo de +32,
767 (FFFFH) y con signo +16, 383 (7FFFH). Tenemos:
Al dividir una palabra cuádruple entre una palabra doble, el dividendo esta en el par
EDX:EAX y el divisor esta en una palabra doble en memoria o en otro registro. Después
de la división, el residuo esta en el EDX y el cociente en el AEX.
En los ejemplos siguientes, de DIV, los divisores están en un registro, que determina el
tipo de operación:
BYTE1 DB ?
WORD1 DW ?
DWORD1 DD ?
...
DIVISOR DIVIDENDO COCIENTE RESIDUO
2.1.4 Ajustes.
Sintaxis: CBW
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Copia el bit 7 del registro AL en todos los bits del registro AH, es decir, expande el signo
de AL a AX como paso previo a una operación de 16 bits.
Sintaxis: CWD
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Expande el signo del registro AX sobre el registro DX, copiando el bit más significativo de
AH en todo DX.
2.1.5 Comparación.
CMP (Comparación).
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
Resta origen de destino sin retornar ningún resultado. Los operandos quedan inalterados,
paro los indicadores pueden ser consultados mediante instrucciones de bifurcación
condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma
dimensión.
Ejemplo:
CMP BX, MEM_PAL
CMP CH, CL
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
Compara dos cadenas restando al origen el destino. Ninguno de los operandos se alteran,
pero los indicadores resultan afectados. La cadena origen se direcciona con registro SI
sobre el segmento de datos DS y la cadena destino se direcciona con el registro DI sobre
el segmento extra ES. Los registros DI y SI se autoincrementan o autodecrementan según
el valor del indicador DF (véanse CLD y STD) en una o dos unidades, dependiendo de si
se trabaja con bytes o con palabras. Cadena origen y cadena destino son dos operandos
redundantes que sólo indican el tipo del dato (byte o palabra) a comparar, es más cómodo
colocar CMPSB o CMPSW para indicar bytes/palabras. Si se indica un registro de
segmento, éste sustituirá en la cadena origen al DS ordinario.
Ejemplo:
LEA SI, ORIGEN
LEA DI, DESTINO
CMPSB
.MODEL SMALL
.CODE
ORG 100H
BEGIN: JMP SHORT MAIN
;-------------------------------------------------------------------------------------
NOM1 DB 'Assemblers' ;Elementos de datos
NOM2 DB 'Assemblers'
NOM3 DB 10 DUP (' ')
;-------------------------------------------------------------------------------------
G20:
MOV CX, 10 ;Iniciar para 10 bytes
LEA DI, NOM3
LEA SI, NOM2
REPE CMPSB ;Compare NOM2:NOM3
JE G30 ;Igual, salir
MOV BL, 02 ;No es igual, fijar BL
G30:
MOV AX, 4C00H ;Salir a DOS
INT 21H
MAIN ENDP
END BEGIN
2 .2 SALTOS.
2.2.1 Incondicionales.
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
DIR DD 0F000E987H
CALL DWORD PTR DIR
JMP (Salto).
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
dos pasadas colocan allí donde es posible un salto corto, para economizar
memoria, sin que el programador tenga que ocuparse de poner short. Si el salto
de dos bytes, que permite desplazamientos de 64 Kb en la memoria sigue siendo
insuficiente, se puede indicar con far que es largo (salto a otro segmento).
Ejemplos:
JMP ETIQUETA
JMP FAR PTR ETIQUETA
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
.MODEL SMALL
.CODE
ORG 100H
MAIN PROC NEAR
MOV AX,01 ;Iniciación de AX,
MOV BX,01 ;BX y
MOV CX,01 ;CX a 01
A20:
ADD AX, 01 ;Sumar 01 a AX
ADD BX, AX ;Sumar AX a BX
SHL CX, 1 ;Multiplicar por dos a CX
JMP A20 ;Saltar a la etiqueta A20
MAIN ENDP
END MAIN
2.2.2 Condicionales.
LOOP (bucle).
Ejemplo:
MOV CX,10
BUCLE: .......
.......
LOOP BUCLE
.MODEL SMALL
.CODE
ORG 100H
MAIN PROC NEAR
MOV AX,01 ;Iniciación de AX,
MOV BX,01 ;BX y
MOV CX,01 ;CX a 01
MOV CX,10 ;Iniciar
A20: ;Número de iteraciones
ADD AX, 01 ;Sumar 01 a AX
ADD BX, AX ;Sumar AX a BX
SHL DX, 1 ;Multiplicar por dos a DX
LOOP A20 ;Iterar si es diferente de cero
MOV AX, 4C00H ;Salida a DOS
MAIN ENDP
END MAIN
AND (y lógico).
Indicadores: OF DF IF TF SF ZF AF PF CF
0 - - - x x ? x 0
Ejemplos:
AND AX, BX
AND BL, BYTE PTR ES:[SI+10H]
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Realiza el complemento a uno del operando destino, invirtiendo cada uno de sus bits. Los
indicadores no resultan afectados.
Ejemplo:
NOT AX
OR (O lógico).
Indicadores: OF DF IF TF SF ZF AF PF CF
0 - - - x x ? x 0
Realiza una operación O lógico a nivel de bits entre los dos operandos,
almacenándose después el resultado en el operando destino.
Ejemplo:
OR AX, BX
Realiza una operación Y lógica entre los dos operandos pero sin almacenar el resultado.
Los indicadores son afectados con la operación.
Ejemplo:
TEST AL,BH
XOR (O exclusivo).
Indicadores: OF DF IF TF SF ZF AF PF CF
0 - - - x x ? x 0
Ejemplo:
XOR DI, AX
2.5 DESPLAZAMIENTOS.
2.5.1 Lineal.
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x ? x x
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x ? x x
Desplaza a la derecha los bits del operando destino el número de bits especificado en el
segundo operando. Los bits de la izquierda se rellenan con el bit de signo del primer
operando. Si el número de bits a desplazar es 1 se puede especificar directamente, si es
mayor se especifica a través de CL.
Ejemplos:
SAR AX, CL
SAR BP, 1
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x ? x x
Desplaza a la derecha los bits del operando destino el número de los bits especificados
en el segundo operando. Los bits de la izquierda se llena con cero. Si el número de bits a
desplazar es 1 se puede especificar directamente en el caso en que no ocurra se pone el
valor en CL:
Ejemplos:
SHR AX, CL
SHR CL, 1
2.5.2 Circular.
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - - - - - x
Rotar a la izquierda los bits del operando destino junto con el indicador de acarreo CF el
número de bits especificado en el segundo operando. Si el número de bits a desplazar es
1, se puede especificar directamente, en caso contrario el valor debe cargarse en CL y
especificar CL como segundo operando. No es conveniente que CL sea mayor de 7, en
bytes; ó 15, en palabras.
Ejemplos:
RCL AX, 1
RCL AL, CL
RCL DI, 1
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - - - - - x
Rotar a la derecha los bits del operando destino junto con el indicador de acarreo CF el
número de bits especificado en el segundo operando. Si el número de bits es 1 se puede
especificar directamente; en caso contrario su valor debe cargarse en CL y especificar CL
como segundo operando:
Ejemplos:
RCR BX, CL
RCR BX, 1
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - - - - - x
Rota a la izquierda los bits del operando destino el número de bits especificado en el
segundo operando, que puede ser 1 ó CL previamente cargado con el valor del número
de veces.
Ejemplos:
ROL DX, CL
ROL AH, 1
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - - - - - x
Rota a la derecha los bits del operando destino el número de bits especificado en el
segundo operando. Si el número de bits es 1 se puede poner directamente, en caso
contrario debe ponerse a través de CL.
Ejemplos:
ROR CL, 1
ROR AX, CL
Sintaxis: NOP
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Ejemplo:
ESC 21, AX
Sintaxis: HLT
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Sintaxis: LOCK
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
WAIT (Espera).
Sintaxis: WAIT
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Provoca la espera del procesador hasta que se detecta una señal en la patilla TEST.
Ocurre, por ejemplo, cuando el coprocesador ha terminado una operación e indica su
finalización. Suele preceder a ESC para sincronizar las acciones del procesador y
coprocesador.
2.6.1 Banderas.
Sintaxis: LAHF
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Carga los bits 7, 6, 4, 2 y 0 del registro AH con el contenido de los indicadores SF,
ZF, AF, PF Y CF respectivamente. El contenido de los demás bits queda sin
definir.
Sintaxis: SAHF
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - x x x x x
Sintaxis: CLC
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - 0
Sintaxis: CLD
Indicadores: OF DF IF TF SF ZF AF PF CF
- 0 - - - - - - -
Sintaxis: CLI
Indicadores: OF DF IF TF SF ZF AF PF CF
- - 0 - - - - - -
Sintaxis: CMC
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - x
Sintaxis: STC
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - 1
Sintaxis: STD
Indicadores: OF DF IF TF SF ZF AF PF CF
- 1 - - - - - - -
Sintaxis: STI
Indicadores: OF DF IF TF SF ZF AF PF CF
- - 1 - - - - - -
INT (Interrupción).
Indicadores: OF DF IF TF SF ZF AF PF CF
- - 0 0 - - - - -
Ejemplo:
INT 21H
Sintaxis: INTO
Indicadores: OF DF IF TF SF ZF AF PF CF
- - 0 0 - - - - -
Sintaxis: IRET
Indicadores: OF DF IF TF SF ZF AF PF CF
x x x x x x x x x
Devuelve el control a la dirección de retorno salvada en la pila por una interrupción previa
y restaura los indicadores que también se introdujeron en la pila. En total, se sacan las 3
palabras que fueron colocadas en la pila cuando se produjo la interrupción.
2.6.2 Cadenas.
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
Compara dos cadenas restando al origen el destino. Ninguno de los operandos se alteran,
pero los indicadores resultan afectados. La cadena origen se direcciona con registro SI
sobre el segmento de datos DS y la cadena destino se direcciona con el registro DI sobre
el segmento extra ES. Los registros DI y SI se autoincrementan o autodecrementan según
el valor del indicador DF (véanse CLD y STD) en una o dos unidades, dependiendo de si
se trabaja con bytes o con palabras. Cadena origen y cadena destino son dos operandos
redundantes que sólo indican el tipo del dato (byte o palabra) a comparar, es más cómodo
colocar CMPSB o CMPSW para indicar bytes/palabras. Si se indica un registro de
segmento, éste sustituirá en la cadena origen al DS ordinario.
Ejemplo:
LEA SI, ORIGEN
LEA DI, DESTINO
CMPSB
Ejemplo:
CLD
LEA SI, ORIGEN
LODSB
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Transfiere un byte o una palabra de la cadena origen direccionada por DS:SI a la cadena
destino direccionada por ES:DI, incrementando o decrementando a continuación los
registros SI y DI según el valor de DF (véanse CLD y STD) en una o dos unidades,
dependiendo de si se trabaja con bytes o con palabras. Cadena origen y cadena destino
son dos operandos redundantes que sólo indican el tipo del dato (byte o palabra) a
comparar, es más cómodo colocar MOVSB o MOVSW para indicar bytes/palabras. Si se
indica un registro de segmento, éste sustituirá en la cadena origen al DS ordinario.
Ejemplo:
LEA SI, ORIGEN
LEA DI, DESTINO
MOVSW
Indicadores: OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
Ejemplo:
LEA DI, DESTINO
MOV AL, 50
SCASB
Ejemplo:
LEA DI, DESTINO
MOV AX, 1991
STOSW
REP/REPE/REPZ/REPNE/REPNZ (Repetir).
Ejemplos:
1) Buscar el byte 69 entre las 200 primeras posiciones de tabla (se supone tabla en el
segmento ES):
2) Rellenar de ceros 5000 bytes de una tabla colocada en datos (se supone datos en
el segmento ES):