Instrucciones Assembler
Instrucciones Assembler
Instrucciones Assembler
Curso
Profesor
:
:
Instrucciones Aritmticas: ADD, ADC, SUB, SBB, MUL, IMUL, DIV, IDIV, INC, DEC
* ADD: Realiza la suma de dos operandos identificndolos como origen y destino, quedando el
resultado de la suma en el operando destino (ADD destino, origen). Los dos
operandos deben ser del mismo tipo.
Ejemplo:
ADD ax, bx
ADD si, di
ADD [0], ax
ADD ah, [bx]
ADD byte ptr[di-2], 2
MOV ebx, 43981
ADD eax, ebx
* ADC: Se utiliza para realizar una suma de 32 bits con registros de 16 bits. La suma se
realizara igual, pero operando sobre 32 bits. En realidad, podemos descomponer
una suma de 32 bits en dos sumas de 16 bits. Primero, deberamos sumar los 16 bits
de menor peso de cada operando, almacenando los 16 bits resultantes como
palabras baja del resultado. Despus, deberamos sumar los 16 bits de mayor peso
de cada operando, pero adems deberamos sumar el acarreo del ltimo bit de la
palabras de menor peso. As, llevamos efectivamente el acarreo del bit 15 de los
operandos al bit 16 (esto se realiza utilizando el flag de acarreo CF). As, en el
siguiente ejemplo, se le sumara a el valor de 32 bits contenido en DXAX, el valor de
32 bits contenido en CXBX.
cx bx
+
dx ax
dx ax
ax=ax+bx
si cf=1 (si hay acarreo), dx=dx+cx+1
sino dx=dx+cx
Ejemplo:
ADD ax, bx ; Suma los 16 bits ms bajos, dejando el acarreo(si se produce) en CF
; (Flag de Acarreo) preparado para sumrselo a los 16 bits ms altos.
ADC dx, cx ; Suma los 16 bits ms alto, y a ese resultado se le suma el acarreo (si existe)
producido por la suma de bx + ax. El resultado de la suma queda en ax (la parte baja) y en
dx (la parte alta).
Nota: La utilizacin de el Flag de acarreo (CF) puede producir a veces algn problema. Si
fuese as, una solucin sera que, despus de ejecutar alguna operacin que
utilice este flag, ejecutar la instruccin CLC (Borra la bandera de acarreo (CF) sin
afectar a ninguna otra bandera).
0
1
0
1
0
0
0
1
Ejemplo:
AND ax, bx ; AND lgico entre AX y BX. El resultado queda en AX.
AND es:[0], dx ; Lo mismo pero con posiciones de memoria.
AND di, es:[si]
AND byte ptr[9], 3 ; Lo mismo pero con valores inmediatos.
* OR: Operacin "o lgico exclusivo" a nivel entre los dos operandos. El resultado se almacena
en el destino.
Formato OR destino, fuente.
0 0-0
0 1-1
1 0-1
1 1-1
Ejemplo:
OR al, ah
; Las mismas operaciones que con AND pero utilizando el OR.
OR [di], ch
OR cl, [bp+4]
0
1
0
1
0
1
1
0
Ejemplo:
XOR ax, ax ; El XOR entre dos bits con el mismo valor es siempre 0,
; independientemente del valor previo de AX (AX=0).
; Las ventajas de hacerlo as son dos: la ejecucin de XOR reg, reg es ms
; rpida que la de MOV reg, o que la de MOV ax,0 , y la codificacin de la ; primera
ocupa menos bytes que la segunda; Esta tcnica no puede utilizar ; se para poner a
cero los registros de segmento.
XOR byte ptr[55aah], 4
XOR al, 00aah
* XCHG: Intercambia el contenido entre dos operandos. No pueden utilizarse registros de
segmento como operandos.
Ejemplo:
XCHG si, di
Instrucciones de Salto.
Vimos que en el funcionamiento de un microprocesador se reduce bsicamente a los
siguientes pasos:
Recogida de la siguiente instruccin de la direccin CS:IP
Incremento de IP en el nmero de bytes que componen la instruccin.
Ejecucin de la instruccin.
CS.
ETIQUETA1:
.
JMP continuar
ETIQUETA2:
.
JMP continuar
.
CONTINUAR:
Nota: Para los siguiente saltos, vamos a tener en cuenta significados de palabras inglesas
que nos van a ayudar a definir el tipo de salto a realizar:
(Equal=igual, Not=no, Greater=mayor, Less=menor, Above=superior, Below=inferior,
Carry=acarreo, Zero=cero, Overflow=desbordamiento, Sign=signo, Parity=paridad)
* JA: (Salto si superior). Es equivalente a JNBE (Salto si no inferior ni igual). El formato es: JA
etiqueta si tanto el flag de acarreo CF como el flag de cero ZF est a cero (CF=0,
ZF=0). Si CF=1 o ZF=1 no se transfiere el control. No se considera el signo.
Ejemplo:
CMP ax, bx ; Comparar AX con BX.
JA etiqueta ; Saltar (Bifurcar) a ETIQUETA si AX>BX
. ; (sin considerar signo).
.
ETIQUETA:
* JAE: (Salto si superior o igual). Es equivalente a JNB (Salto si no inferior). El formato es: JAE
etiqueta. Salta a la etiqueta si el flag de acarreo es cero (CF=0). No se considera el
signo.
Ejemplo:
ETIQUETA:
CMP ax, bx
JAE etiqueta
.
.
* JB: (Salto si inferior). Es equivalente a JNAE (Salto si no superior ni igual) y a JC (Salto sin
acarreo). El formato es: JB etiqueta. Salta a la etiqueta si el flag de acarreo es uno
(CF=1). No se considera el signo.
Ejemplo:
CMP ax, bx
JB etiqueta
.
.
ETIQUETA:
* JBE: (Salto si inferior o igual). Es equivalente a JNA (Salto si no superior). El formato es: JBE
etiqueta. Salta a la etiqueta si el flag de acarreo es igual a 1 o el flag de cero es
igual a uno (CF=1 y ZF=1). Si CF=0 y ZF=0 no hay salto. No se considera el signo.
Ejemplo:
CMP ax, bx
JBE etiqueta
.
.
ETIQUETA:
* JE: (Salto si igual). Es equivalente a JZ (Salto si cero). El formato es: JE etiqueta. Salta a la
etiqueta si el flag de cero es igual a uno (ZF=1). Se considera nmero con signo y sin
signo.
Ejemplo:
CMP ax, bx
JE etiqueta1
CMP ax, bx
JZ etiqueta2
; AX=AX-BX
; Bifurca a ETIQUETA2 si AX es cero.
* JG: (Salto si mayor). Es equivalente a JNLE (Salto si no menor ni igual). El formato es: JG
etiqueta. Salta a la etiqueta si el flag de cero es igual a cero y el flag de desbordamiento contiene el mismo valor que el flag se signo (ZF=0 y SF=OF). Si ZF=1 o
SF<>OF, no hay salto. Se considera el signo.
Ejemplo:
ETIQUETA:
CMP ax, bx
JG etiqueta
.
.
* JGE: (Salto si mayor o igual). Es equivalente a JNL (Salto si no menor). El formato es: JGE
etiqueta. Salta a la etiqueta si el flag de desbordamiento contiene el mismo valor
que el flag de signo (SF=OF). Se considera el signo.
Ejemplo:
CMP ax, bx
JGE etiqueta
.
ETIQUETA:
* JLE: (Salto si menor o igual). Es equivalente a JNG (Salto si no mayor). El formato es: JLE
etiqueta. Salta a la etiqueta si el flag de cero est a uno o el flag de desborda miento
y el de signo contiene valores distintos (ZF=1 o SF distinto de OF). Si ZF=0 y SF=OF
no se produce el salto. Se considera el signo.
Ejemplo:
CMP ax, bx
JLE etiqueta
.
.
ETIQUETA:
ADD ax, bx
JO etiqueta
.
ETIQUETA:
; AX=AX+BX
; Bifurca a ETIQUETA si hay desbordamiento
; (Overflow).
* JNO: (Salto si no desbordamiento). El formato es: JNO etiqueta. Salta a la etiqueta si el flag de
desbordamiento est a cero (OF=0).
Ejemplo:
ADD al, bl
; AL=AL+BL
JNO etiqueta
; Bifurca a ETIQUETA si no hay desbordamiento
.
; (No overflow).
.
ETIQUETA:
* JS: (Salto si signo). El formato es: JS etiqueta. Salta a la etiqueta si el flag de signo est a uno
(SF=1).
Ejemplo:
SUB ax, bx
JS etiqueta
.
.
ETIQUETA:
; AX=AX-BX
; Bifurca a ETIQUETA si signo, es decir, AX < 0
; (en este caso, si AX es menor que BX).
* JNS: (Salto si no signo / si el signo en positivo). El formato es: JNS etiqueta. Salta a la
etiqueta si el flag de signo est a cero (SF=0).
Ejemplo:
SUB ax, bx ; AX=AX-BX
JNS etiqueta ; Bifurca a ETIQUETA si no signo, es decir, AX > o = que BX
.
; (en este caso, si AX es mayor o igual que BX).
.
ETIQUETA:
* JP: (Salto si paridad). Es equivalente a JPE (salto sin paridad par). El formato es: JP etiqueta.
Salta a la etiqueta si el flag de paridad est a uno (PF=1).
Ejemplo:
AND ax, bx
; AX=AX AND BX
JP etiqueta
; Bifurca a ETIQUETA si paridad par, es decir
.
; si el nmero de "unos (1)" que hay en AX es par.
.
ETIQUETA:
* JNP: (Salto si no paridad). Es equivalente a JPO (salto sin paridad impar). El formato es: JNP
etiqueta. Salta a la etiqueta si el flag de paridad est a cero PF=0).
Ejemplo:
AND ax, bx
; AX=AX AND BX
JNP etiqueta
; Bifurca a ETIQUETA si paridad impar, es decir
. ; si el nmero de "unos (1)" que hay en AX es impar.
.
ETIQUETA:
* LOOP: Esta instruccin permite realizar "bucles" utilizando el registro CX como contador (CX
en un contador que va decrementndose). Un bucle es un conjunto de
instrucciones que se ejecutan una serie de veces. Esta instruccin equivale al par:
DEC CX // JNZ etiqueta.
El formato es: LOOP etiqueta.
Ejemplo:
LOOP etiqueta
; CX=CX-1 y bifurca a ETIQUETA si CX es distinto a cero.
* LOOPE: Esta instruccin al igual que LOOP, permite realizar "bucles" utilizando el registro CX
como contador (CX en un contador que va decrementndose) pero adems el
flag de cero debe estar a uno (ZF=1). Es equivalente a LOOPZ (Bucle si cero).
Esta instruccin equivale al par: JNE FIN // LOOP OTRO. El formato es: LOOPE
etiqueta.
Ejemplo:
* LOOPNE: Esta instruccin al igual que LOOP, permite realizar "bucles" utilizando el registro
CX como contador (CX en un contador que va decrementndose) pero adems
el flag de cero debe estar a cero (ZF=0). Es equivalente a LOOPNZ (Bucle si no
cero). Esta instruccin equivale al par: JE FIN // LOOP OTRO.
El formato es: LOOPNE etiqueta.
Ejemplo:
10
; Rotar 3 bits
; AL = 0101 1110b, CF=0 (Flag de acarreo=0)
; AL = 1111 0001b, CF=0
Procedimiento:
Cuenta (CL)
Antes
Despus
; Rotar 3 bits
; AL = 0101 1110b, CF=0 (Flag de acarreo=0)
; AL = 1000 1011b, CF=1
Procedimiento:
Cuenta (CL)
Antes
Despus
11
Procedimiento:
Cuenta (CL)
Antes
Despus
* ROL:(Rotar a la izquierda).
El formato es: ROL operando, contador. Rota a la izquierda los bits del operando
de tal forma que el bits del extremo izquierdo del operando destino para al bit
extremo derecho de dicho operando y al mismo tiempo para el bit de acarreo
(CF). Si el nmero a desplazar es 1, se puede especificar directamente (Por
ejemplo: ROL AL, 1). Si es mayor que 1, su valor debe cargarse en CL y
especificar CL como segundo operando.
Ejemplo:
MOV cl, 2
RCR al, cl
; Rotar 2 bits
; AL = 1100 1100b, CF=0 (Flag de acarreo=0)
; AL = 0011 0011b, CF=1
Procedimiento:
Cuenta (CL)
Antes
Despus
; Desplazar 2 bits
; AL = 1100 1100b, CF=0 (Flag de acarreo=0)
; AL = 0011 0000b, CF=1
Procedimiento:
Cuenta (CL)
Antes
Despus
12
MOV cl, 2
SAR al, cl
; Desplazar 2 bits
; AL = 1100 1100b, CF=0 (Flag de acarreo=0)
; AL = 1111 0011b, CF=0
Procedimiento:
Cuenta (CL)
Antes
Despus
MOV cl, 2
SHR al, cl
; Desplazar 2 bits
; AL = 0011 0011b, CF=0 (Flag de acarreo=0)
; AL = 0000 1100b, CF=1
Procedimiento:
Cuenta (CL)
Antes
Despus
La Pila.
La estructura de una PILA es similar a un montn de libros apilados: los elementos se van
ordenando cada uno detrs del ltimo en llegar (es decir, los libros se van apilando cada uno
encima del anterio), pero al sacarlos de la estructura se empieza por el ltimo en llegar,
acabando por el primero (al retirar los libros se comienza por el superior, y se acaba por el que
queda abajo del todo).
13
POP dx
POP cx
POP bx
POP ax
14
DF
-
IF
-
TF
-
SF
-
ZF
-
AF
-
PF
-
CF
-
SF
-
ZF
-
AF
-
PF
-
CF
-
SF
-
ZF
-
AF
-
PF
-
CF
-
15
16