Ensamblador
Ensamblador
Ensamblador
UNIDAD II
ELEMENTOS DEL
LENGUAJE
2.1 INSTRUCCIONES LINEALES.
2.1.1
2.1.2
2.1.3
2.1.4
2.1.5
2.2
SALTOS.
2.2.1
2.2.2
2.3
Movimientos.
Pila.
Matemticos.
Ajustes.
Comparacin.
Incondicionales.
Condicionales.
TIPOS DE CICLOS.
Lineal.
Circular.
Banderas.
Cadenas.
77
Lenguaje Ensamblador
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
78
Lenguaje Ensamblador
MOV hacia un registro de segmento, las interrupciones quedan inhibidas hasta despus
de ejecutarse la siguiente instruccin (8086/88 de 1983 y procesadores posteriores).
Ejemplos:
MOV
MOV
MOV
DS, AX
BX, ES:[SI]
SI, OFFSET DATO
XCHG (intercambiar).
Sintaxis:
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
BL, CH
MEM_PAL, BX
Las restricciones que presenta esta operacin es que no se pueden efectuar intercambios
directamente entre posiciones de memoria ni tampoco entre registros de segmento.
XLAT (traduccin).
Sintaxis:
XLAT tabla
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
79
Lenguaje Ensamblador
La instruccin XLAT tabla carga en el registro AL el contenido de la posicin [BX][AL], en
donde el registro BX ha de apuntar al comienzo de una tabla. Dicho de otra manera, AL
hace de ndice de la tabla y de almacn destino del contenido de la tabla.
Por ejemplo, el siguiente programa:
DATOS SEGMENT
TABLA DB 2, 3, 5, 8, 16, 23
DATOS ENDS
CODIGO SEGMENT
MOVE BX, OFFSET TABLA ;Inicializa BX con la direccin donde comienza la tabla
MOVE AL, 5
XLAT TABLA
CODIGO ENDS
hace que al final el contenido de AL sea 16 ya que es el quinto elemento de la tabla y AL
antes de XLAT TABLA contena el valor 5.
Otro ejemplo:
MOV
MOV
XLAT
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - -
80
Lenguaje Ensamblador
LEA
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
DD
12345678H
SI, PUNT
IN acumulador, puerto
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
81
Lenguaje Ensamblador
Transfiere datos desde el puerto indicado hasta el registro AL o AX, dependiendo de la
longitud byte o palabra respectivamente. El puerto puede especificarse mediante una
constante (0 a 255) o a travs del valor contenido en DX (0 a 65535).
Ejemplo:
IN
IN
AX, 0FH
AL, DX
OUT (salida).
Sintaxis:
Indicadores:
12H, AX
DX, AL
82
Lenguaje Ensamblador
2.1.2 Pila.
POP (Extraer de la pila).
Sintaxis:
POP destino
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
instruccin POP CS, poco til, no funciona correctamente en los 286 y superiores.
Ejemplos:
POP
POP
AX
PEPE
PUSH origen
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
CS
POPF
Indicadores:
OF DF IF TF SF ZF AF PF CF
x x x x x x x x x
PUSHF
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
83
Lenguaje Ensamblador
2.1.3 Matemticos.
S U M A S.
AAA (Ajuste ASCII para la suma).
Sintaxis:
AAA
Indicadores:
OF DF IF TF SF ZF AF PF CF
? - - - ? ? x ? x
AL, BL
Indicadores:
OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
AX, BX
ADD (suma).
Sintaxis:
Indicadores:
OF DF IF TF SF ZF AF PF CF
x - - - x x x x x
84
Lenguaje Ensamblador
Suma los operandos origen y destino almacenando el resultado en el operando destino.
Se activa el acarreo si se desborda el registro destino durante la suma.
Ejemplos:
ADD AX, BX
ADD CL, DH
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 nmero mayor que 9, el indicador AF se pone a 1 y se suma 6
a AL. De igual forma, si los cuatro bits ms significativos de AL tras la operacin anterior
son un nmero mayor que 9, el indicador CF se pone a 1 y se suma 60h a AL.
Ejemplo:
ADD
DAA
AL, CL
INC (Incrementar).
Sintaxis:
INC destino
Indicadores:
OF DF IF TF SF ZF AF PF CF
x - - - x x x x
-
AL
ES: [DI]
SS: [BP+4]
WORD PTR CS: [BX+DI+7]
85
Lenguaje Ensamblador
R E S T A S.
AAS (Ajuste ASCII para la resta).
Sintaxis:
AAS
Indicadores:
OF DF IF TF SF ZF AF PF CF
? - - - ? ? x ? x
AL, BL
CMP (Comparacin).
Sintaxis:
Indicadores:
OF DF IF TF SF ZF AF PF CF
x
- - - x x x x x
Resta origen de destino sin retornar ningn resultado. Los operandos quedan inalterados,
paro los indicadores pueden ser consultados mediante instrucciones de bifurcacin
condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma
dimensin.
Ejemplo:
CMP
CMP
BX, MEM_PAL
CH, CL
DAS
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - x x x x x
86
Lenguaje Ensamblador
AF es 1, a AL se le resta 6, AF se pone a 1. Si el nibble mas significativo es mayor que 9
CF est a 1, entonces se resta 60h a AL y se activa despus CF.
Ejemplo:
SUB
DAS
AL, BL
DEC (Decrementar).
Sintaxis:
DEC destino
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. Obsrvese
que esta instruccin no modifica el bit de acarreo (CF) y no es posible detectar un
desbordamiento por este procedimiento (utilcese ZF).
Ejemplo:
DEC
DEC
AX
MEM_BYTE
NEG (Negacin).
Sintaxis:
NEG destino
Indicadores:
OF DF IF TF SF ZF AF PF CF
x - - x x x x x
AL
OF DF IF TF SF ZF AF PF CF
x - - x x x x x
87
Lenguaje Ensamblador
de ms de 16 bits, en varios pasos, considerando lo que nos llevamos (el acarreo) de la
resta anterior.
Ejemplo:
SBB
SBB
AX, AX
CH, DH
SUB (Resta).
Sintaxis:
Indicadores:
OF DF IF TF SF ZF AF PF CF
x
- - - x x x x x
AL, BL
DX, DX
M U L T I P L I C A C I O N E S.
AAM
Indicadores:
OF DF IF TF SF ZF AF PF CF
? - - - x x ? x ?
BL
88
Lenguaje Ensamblador
IMUL (multiplicacin entera con signo).
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
BX
CH
Indicadores:
OF DF IF TF SF ZF AF PF CF
x - - - ? ? ? ? x
Desbordamientos.
Este alerta con los desbordamientos en las operaciones aritmticas. Ya que un byte solo
permite el uso de un bit de signo y siete de datos (desde -128 hasta +127), una operacin
aritmtica 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.
89
Lenguaje Ensamblador
esta en el registro AX. La operacin ignora y borra cualquier informacin que pueda estar
en el AH.
90
Lenguaje Ensamblador
INSTRUCCION
MULTIPLICADOR
MUL CL
MUL BX
MUL EBX
byte
palabra
palabra doble
MULTIPLICANDO
AL
AX
EAX
PRODUCTO
AX
DX:AX
EDX:EAX
DB
DW
DD
?
?
?
MULTIPLICADOR
MULTIPLIANDO
PRODUCTO
BYTE1
WORD1
DWORD1
AL
AX
EAX
AX
DX:AX
EDX:EAX
MUL BYTE1
MUL WORD1
MUL DWORD1
DIVISIONES.
AAD
Indicadores:
OF DF IF TF SF ZF AF PF CF
?
- - - x x ? x ?
Indicadores:
OF DF IF TF SF ZF AF PF CF
?
- - - ? ? ? ? ?
91
Lenguaje Ensamblador
Divide, sin considerar el signo, un nmero contenido en el acumulador y su extensin (AH,
AL si el operando es de tipo byte o DX, AX si el operando es palabra) entre el operando
fuente. El cociente se guarda en AL o AX y el resto en AH o DX segn el operando sea
byte o palabra respectivamente. DX o AH deben ser cero antes de la operacin. Cuando
el cociente es mayor que el resultado mximo que puede almacenar, cociente y resto
quedan indefinidos producindose una interrupcin 0. En caso de que las partes ms
significativas del cociente tengan un valor distinto de cero se activan los indicadores CF y
OF.
Ejemplo:
DIV
DIV
BL
MEM_PAL
Indicadores:
OF DF IF TF SF ZF AF PF CF
?
- - - ? ? ?
? ?
BL
BX
Las operaciones de divisin bsicas son byte entre byte, palabra entre palabra y palabras
dobles entre palabra dobles.
Palabra entre palabra
92
Lenguaje Ensamblador
Palabra doble entre palabra.
Para esta operacin, el dividendo esta en el par DX:AX y el divisor es una palabra en
memoria o en otro registro. Despus de la divisin, el residuo esta en el DX y el cociente
esta en el AX. El cociente de una palabra permite para datos sin signo un mximo de +32,
767 (FFFFH) y con signo +16, 383 (7FFFH). Tenemos:
En los ejemplos siguientes, de DIV, los divisores estn en un registro, que determina el
tipo de operacin:
OPERACION
DIV CL
DIV CX
DIV EBX
DIVISOR
byte
palabra
palabra doble
DIVIDENDO
AX
DX:AX
EDX:EAX
COCIENTE
AL
AX
EAX
RESIDUO
AH
DX
EDX
COCIENTE
DIV BYTE1
BYTE1
DIV WORD1
WORD1
DIV DWORD1 DWORD1
AX
DX:AX
EDX:EAX
RESIDUO
AL
AX
EAX
AH
DX
EDX
93
Lenguaje Ensamblador
Ejemplo de programa con instrucciones aritmticas.
TITLE
94
Lenguaje Ensamblador
2.1.4 Ajustes.
CBW (Conversin de byte en palabra).
Sintaxis:
Indicadores:
CBW
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 operacin de 16 bits.
CWD
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - -
Expande el signo del registro AX sobre el registro DX, copiando el bit ms significativo de
AH en todo DX.
95
Lenguaje Ensamblador
2.1.5 Comparacin.
CMP (Comparacin).
Sintaxis:
Indicadores:
OF DF IF TF SF ZF AF PF CF
x
- - - x x x x x
Resta origen de destino sin retornar ningn resultado. Los operandos quedan inalterados,
paro los indicadores pueden ser consultados mediante instrucciones de bifurcacin
condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma
dimensin.
Ejemplo:
CMP
CMP
BX, MEM_PAL
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 segn
el valor del indicador DF (vanse 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 slo indican el tipo del dato (byte o palabra) a comparar, es ms cmodo
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
96
Lenguaje Ensamblador
A continuacin se muestra la codificacin del uso del CMPS y sus derivaciones:
TITLE
SMALL
.CODE
ORG
100H
BEGIN: JMP
SHORT MAIN
;------------------------------------------------------------------------------------NOM1 DB
'Assemblers' ;Elementos de datos
NOM2 DB
'Assemblers'
NOM3 DB
10 DUP (' ')
;------------------------------------------------------------------------------------MAIN
PROC
NEAR
CLD ;Izquierda a derecha
MOV
CX, 10
LEA
DI, NOM2
LEA
SI, NOM1
REPE
CMPSB
JNE
G20
MOV
BH,01
;Procedimiento principal
;Iniciar para 10 bytes
;Compare NOM1:NOM2
;No es igual, saltarlo
;Igual, fijar BH
G20:
MOV
LEA
LEA
REPE
JE
MOV
CX, 10
DI, NOM3
SI, NOM2
CMPSB
G30
BL, 02
MOV
INT
MAIN ENDP
END
AX, 4C00H
21H
G30:
;Salir a DOS
BEGIN
97
Lenguaje Ensamblador
2 .2
SALTOS.
2.2.1 Incondicionales.
CALL (Llamada a subrutina).
Sintaxis:
CALL destino
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - -
PROC1
DIR
CALL
DD
0F000E987H
DWORD PTR DIR
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
98
Lenguaje Ensamblador
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
JMP
ETIQUETA
FAR PTR ETIQUETA
.MODEL
SMALL
.CODE
MAIN
ORG
PROC
MOV
MOV
MOV
100H
NEAR
AX,01
BX,01
CX,01
ADD
ADD
SHL
JMP
ENDP
END
AX, 01
BX, AX
CX, 1
A20
;Iniciacin de AX,
;BX y
;CX a 01
A20:
MAIN
;Sumar 01 a AX
;Sumar AX a BX
;Multiplicar por dos a CX
;Saltar a la etiqueta A20
MAIN
99
Lenguaje Ensamblador
2.2.2 Condicionales.
Las siguientes instrucciones son de transferencia condicional de control a la
instruccin que se encuentra en la posicin IP+desplazamiento (desplazamiento
comprendido entre -128 y +127) si se cumple la condicin. Algunas condiciones se
pueden denotar de varias maneras. Todos los saltos son cortos y si no alcanza
hay que aparselas como sea. En negrita se realzan las condiciones ms
empleadas. Donde interviene SF se consideran con signo los operandos
implicados en la ltima comparacin u operacin aritmetico-lgica, y se indican en
la tabla como '' (-128 a +127 -32768 a +32767); en los dems casos, indicados
como '+', se consideran sin signo (0 a 255 0 a 65535):
JA/JNBE
JAE/JNB
JB/JNAE/JC
JBE/JNA
JCXZ
JE/JZ
JG/JNLE
JGE/JNL
JL/JNGE
Salto si CX=0.
JLE/JNG
JNC
JNE/JNZ
JNO
JNP/JPO
JNS
JO
JP/JPE
JS
100
Lenguaje Ensamblador
LOOP desplazamiento
OF DF IF TF SF ZF AF PF CF
- - - - - - -
LOOPE/LOOPZ
TITLE
.MODEL
SMALL
.CODE
MAIN
ORG
PROC
MOV
MOV
MOV
MOV
100H
NEAR
AX,01
BX,01
CX,01
CX,10
ADD
ADD
SHL
LOOP
MOV
ENDP
END
AX, 01
BX, AX
DX, 1
A20
AX, 4C00H
A20:
MAIN
;Iniciacin de AX,
;BX y
;CX a 01
;Iniciar
;Nmero de iteraciones
;Sumar 01 a AX
;Sumar AX a BX
;Multiplicar por dos a DX
;Iterar si es diferente de cero
;Salida a DOS
MAIN
101
Lenguaje Ensamblador
Indicadores:
OF DF IF TF SF ZF AF PF CF
0 - - - x x ? x 0
AX, BX
BL, BYTE PTR ES:[SI+10H]
NOT destino
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 lgico).
Sintaxis:
OR destino, origen
Indicadores:
OF DF IF TF SF ZF AF PF CF
0 - - - x x ? x 0
Realiza una operacin O lgico a nivel de bits entre los dos operandos,
almacenndose despus el resultado en el operando destino.
Ejemplo:
OR
AX, BX
102
Lenguaje Ensamblador
TEST (Comparacin lgica).
Sintaxis:
Indicadores:
Realiza una operacin Y lgica entre los dos operandos pero sin almacenar el resultado.
Los indicadores son afectados con la operacin.
Ejemplo:
TEST
AL,BH
XOR (O exclusivo).
Sintaxis:
Indicadores:
DI, AX
103
Lenguaje Ensamblador
2.5 DESPLAZAMIENTOS.
2.5.1 Lineal.
SAL/SHL (Desplazamiento aritmtico a la izquierda).
Sintaxis:
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 nmero de bits especificado en el
segundo operando. Los bits de la izquierda se rellenan con el bit de signo del primer
operando. Si el nmero de bits a desplazar es 1 se puede especificar directamente, si es
mayor se especifica a travs de CL.
Ejemplos:
SAR
SAR
AX, CL
BP, 1
Indicadores:
OF DF IF TF SF ZF AF PF CF
x
- - - x x ? x x
104
Lenguaje Ensamblador
Desplaza a la derecha los bits del operando destino el nmero de los bits especificados
en el segundo operando. Los bits de la izquierda se llena con cero. Si el nmero 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
SHR
AX, CL
CL, 1
105
Lenguaje Ensamblador
2.5.2 Circular.
RCL (Rotacin a la izquierda con acarreo).
Sintaxis:
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
nmero de bits especificado en el segundo operando. Si el nmero 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
RCL
RCL
AX, 1
AL, CL
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
nmero de bits especificado en el segundo operando. Si el nmero 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
RCR
BX, CL
BX, 1
106
Lenguaje Ensamblador
ROL (Rotacin a la izquierda).
Sintaxis:
Indicadores:
OF DF IF TF SF ZF AF PF CF
x - - - - - - x
Rota a la izquierda los bits del operando destino el nmero de bits especificado en el
segundo operando, que puede ser 1 CL previamente cargado con el valor del nmero
de veces.
Ejemplos:
ROL
ROL
DX, CL
AH, 1
Indicadores:
OF DF IF TF SF ZF AF PF CF
x - - - - - x
Rota a la derecha los bits del operando destino el nmero de bits especificado en el
segundo operando. Si el nmero de bits es 1 se puede poner directamente, en caso
contrario debe ponerse a travs de CL.
Ejemplos:
ROR
ROR
CL, 1
AX, CL
107
Lenguaje Ensamblador
NOP
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - -
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
21, AX
HLT
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - -
108
Lenguaje Ensamblador
LOCK (Bloquea los buses).
Sintaxis:
LOCK
Indicadores:
OF DF IF TF SF ZF AF PF CF
-
WAIT
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - -
Provoca la espera del procesador hasta que se detecta una seal en la patilla TEST.
Ocurre, por ejemplo, cuando el coprocesador ha terminado una operacin e indica su
finalizacin. Suele preceder a ESC para sincronizar las acciones del procesador y
coprocesador.
109
Lenguaje Ensamblador
2.6.1 Banderas.
LAHF (Carga AH con los indicadores).
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 dems bits queda sin
definir.
SAHF (copia AH en los indicadores)
Sintaxis:
SAHF
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - x x x x x
CLC
OF DF IF TF SF ZF AF PF CF
- - - - - 0
CLD
OF DF IF TF SF ZF AF PF CF
- 0 - - - - - -
110
Lenguaje Ensamblador
CLI (Baja indicador de interrupcin).
Sintaxis:
CLI
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - 0 - - - - -
CMC
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - x
STC
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - 1
STD
Indicadores:
OF DF IF TF SF ZF AF PF CF
- 1 - - - - - -
111
Lenguaje Ensamblador
STI (Pone a uno el indicador de interrupcin).
Sintaxis:
STI
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - 1 - - - - -
INT (Interrupcin).
Sintaxis:
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - 0 0 - - - -
21H
INTO
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - 0 0 - - -
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 direccin de retorno salvada en la pila por una interrupcin previa
y restaura los indicadores que tambin se introdujeron en la pila. En total, se sacan las 3
palabras que fueron colocadas en la pila cuando se produjo la interrupcin.
112
Lenguaje Ensamblador
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 segn
el valor del indicador DF (vanse 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 slo indican el tipo del dato (byte o palabra) a comparar, es ms cmodo
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
LODS
cadena_origen
LODSB (bytes)
LODSW (palabras)
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - - Copia en AL o AX una cadena de longitud byte o palabra direccionada sobre el segmento
de datos (DS) con el registro SI. Tras la transferencia, SI se incrementa o decrementa
segn el indicador DF (vanse CLD y STD) en una o dos unidades, segn se estn
manejando bytes o palabras. Cadena_origen es un operando redundante que slo indica
el tipo del dato (byte o palabra) a cargar, es ms cmodo colocar LODSB o LODSW para
indicar bytes/palabras.
Ejemplo:
CLD
LEA SI, ORIGEN
LODSB
113
Lenguaje Ensamblador
MOVS/MOVSB/MOVSW (Mover cadena).
Sintaxis:
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 continuacin los
registros SI y DI segn el valor de DF (vanse 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 slo indican el tipo del dato (byte o palabra) a
comparar, es ms cmodo 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
SCAS
cadena_destino
SCASB (bytes)
SCASW (palabras)
Indicadores:
OF DF IF TF SF ZF AF PF CF
x
- - - x x x x x
114
Lenguaje Ensamblador
STOS/STOSB/STOSW (Almacena cadena).
Sintaxis:
Indicadores:
STOS
cadena_destino
STOSB (bytes)
STOSW (palabras)
OF DF IF TF SF ZF AF PF CF
- - - - - - -
REP/REPE/REPZ/REPNE/REPNZ (Repetir).
REP
repetir operacin de cadena
REPE/REPZ
repetir operacin de cadena si igual/si cero
REPNE/REPNZ
repetir operacin de cadena si no igual (si no 0)
Estas instrucciones se pueden colocar como prefijo de otra instruccin de manejo de
cadenas, con objeto de que la misma se repita un nmero determinado de veces
incondicionalmente o hasta que se verifique alguna condicin. El nmero de veces se
indica en CX. Por sentido comn slo deben utilizarse las siguientes combinaciones:
Prefijo
-------------------REP
REPE/REPZ
REPNE/REPNZ
Funcin
------------------------------------------Repetir CX veces
Repetir CX veces mientras ZF=1
Repetir CX veces mientras ZF=0
Instrucciones
-----------------MOVS, STOS
CMPS, SCAS
CMPS, SCAS
Ejemplos:
1) Buscar el byte 69 entre las 200 primeras posiciones de tabla (se supone tabla en el
segmento ES):
LEA
MOV
MOV
DI, tabla
CX, 200
AL, 69
CLD
REPNE
JE
SCASB
ENCONTRADO
115
Lenguaje Ensamblador
2) Rellenar de ceros 5000 bytes de una tabla colocada en datos (se supone datos en
el segmento ES):
LEA
MOV
MOV
CLD
REP
DI, DATOS
AX, 0
CX, 2500
STOSW
CX,0B800h
DS,CX
DI,buffer
SI,0
CX,2000
MOVSW
; segmento de pantalla
; en DS
;destino en ES:DI
; copiar desde DS:0
; 2000 palabras
; hacia adelante
; copiar CX palabras
116
Lenguaje Ensamblador
RESUMEN ALFABTICO DE LAS INSTRUCCIONES Y BANDERINES.
Nota: en el efecto de las instrucciones sobre el registro de estado se utilizar la siguiente
notacin:
- bit no modificado
? desconocido o indefinido
x modificado segn el resultado de la operacin
1 puesto siempre a 1
0 puesto siempre a 0
Instruccin
----------------
Sintaxis
---------------------
AAA
AAD
AAM
AAS
ADC dst,fnt
ADD dst,fnt
AND dst,fnt
CALL dsp
CBW
CLC
CLD
CLI
CMC
CMP dst,fnt
CMPS/CMPSB
CMPSW cdst,cfnt
CWD
DAA
DAS
DEC dst
DIV fnt
ESC opcode,fnt
HLT
IDIV fnt
IMUL fnt
IN acum,port
INC dst
INT interrup
INTO
IRET
Jcc (JA, JBE...)
JMP
JCXZ dsp
LAHF
LDS dst,fnt
LEA dst,fnt
LES dst,fnt
LOCK
LODS/LODSB/
LODSW cfnt
AAA
AAD
AAM
AAS
ADC
ADD
AND
CALL
CBW
CLC
CLD
CLI
CMC
CMP
dst,fnt
dst,fnt
dst,fnt
dsp
dst,fnt
CMPS
CWD
DAA
DAS
DEC
DIV
ESC
HLT
IDIV
IMUL
IN
INC
INT
INTO
IRET
Jcc
JMP
JCXZ
LAHF
LDS
LEA
LES
LOCK
cdst,cfnt
LODS
mem
dst
dst
opcode,fnt
fnt
fnt
acum,port
dst
interrup
dsp
dsp
dsp
dst,fnt
dst,fnt
dst,fnt
x
-
0
0
x
-
0
0
x
-
x
x
x
x
?
?
?
x
x
-
x
x
x
x
?
?
?
x
x
-
x
x
x
x
?
?
?
x
x
-
x
x
x
x
?
?
?
x
x
-
x
x
x
?
?
x
x
-
117
Lenguaje Ensamblador
Instruccin
----------------
Sintaxis
---------------------
LOOP
LOOPcc (LOOPE...)
MOV dst,fnt
MOVS/MOVSB/
MOVSW cdst,cfnt
MUL fnt
NEG dst
NOP
NOT dst
OR dst,fnt
OUT port,acum
POP dst
POPF
PUSH dst
PUSHF
RCL dst,cnt
RCR dst,cnt
REP/REPE/REPZ/
REPNE/REPNZ
RET [val]
RETF [val]
ROL dst,cnt
ROR dst,cnt
SAHF
SAL/SHL dst,cnt
SAR dst,cnt
SBB dst,fnt
SCAS/SCASB/
SCASW cdst
SHR dst,cnt
STC
STD
STI
STOS/STOSB/
STOSW cdst
SUB dst,fnt
TEST dst,fnt
WAIT
XCHG dst,fnt
XLAT tfnt
XOR dst,fnt
LOOP
dsp
LOOPcc dsp
MOV
dst,fnt
MOVS
MUL
NEG
NOP
NOT
OR
OUT
POP
POPF
PUSH
PUSHF
RCL
RCR
x
x
0
x
x
x
x
-
x
-
x
-
?
x
x
x
-
?
x
x
x
-
?
x
?
x
-
?
x
x
x
-
x
x
0
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
?
?
x
x
x
x
x
x
x
x
x
x
x
REP
RET
RETF
ROL
ROR
SAHF
SAL
SAR
SBB
cdst,cfnt
fnt
fnt
dst
dst,fnt
port,acum
dst
dst
dst,cnt
dst,cnt
[val]
[val]
dst,cnt
dst,cnt
dst,cnt
dst,cnt
dst,fnt
SCAS
SHR
STC
STD
STI
cdst
dst,cnt
x
x
-
1
-
x
x
-
x
x
-
x
?
-
x
x
-
x
x
1
-
STOS
SUB
TEST
WAIT
XCHG
XLAT
XOR
cdst
dst,fnt
dst,fnt
x
0
0
x
x
x
x
x
x
x
?
?
x
x
x
x
0
0
dst,fnt
tfnt
dst,fnt
118