Documentos de Académico
Documentos de Profesional
Documentos de Cultura
EL LENGUAJE ENSAMBLADOR
EL LENGUAJE ENSAMBLADOR ES UNA VARIANTE, LEGIBLE PARA EL
SER HUMANO, DEL LENGUAJE DE MAQUINA QUE USAN LAS
COMPUTADORAS PARA EJECUTAR PROGRAMAS. AL MISMO TIEMPO ES LA
MEJOR FORMA QUE SE TIENE PARA COMINICARSE CON LA PC Y CON EL
LENGUAJE DE PROGRAMACION QUE UTILICE.
SI ANTES DE ENTRAR AL ESTUDIO DEL HARDWARE SE ANALIZA LO QUE ES
EL ENSAMBLADOR, SE TENDRA UN PANORAMA MAS AMPLIO DE CMO
FUNCIONA LA PC. ESTE LENGUAJE PROPORCIONA LA FACILIDAD Y LAS
HERRAMIENTAS NECESARIAS PARA TOMAR EL CONTROL DE TODO LO QUE
LA PC PUEDE REALIZAR FISICAMENTE.
RAZN
VENTAJA
HACIENDO
MY
DIFICIL
SU
LENGUAJE
FUENTE
OBJETO
EJECUTABLE (.EXE)
V. BASIC
27 Bytes
651 Bytes
12,814 Bytes
V.FOX
22 Bytes
572 Bytes
158,178 Bytes
ENSAMBLADOR
162 Bytes
169 Bytes
543 Bytes
LA CANTIDAD DE BYTES DE LOS ARCHIVOS EJECUTABLES SIEMPRE ES MAYOR QUE LA DE LOS PROGRAMAS
"FUENTE". OBSERVESE CMO EN EL CASO DEL ENSAMBLADOR NO CRECE DEMASIADO.
Programa : =============================================================
.mode1 small
;Define el modelo de memoria
.data
.mens db hola que tal !.$
;la cadena que se desplegara
.stack
;Define el area de la pila (stack)
.code
;Comienza el cdigo
.EMP:
;Etiqueta el comienzo
mov ax, @data
;Permite acceso a datos
mov ds,ax
;a travs de ds
mov dx, offset mens
;Prepara para desplegar
mov ah,9
;Invoca la funcin 9 de
int 21h
;la int 21 para desplegar
mov ah,4ch
;Invoca la funcin 4ch de
int 21h
;la int 21 para terminar
end EMP
;cierra etiqueta de comienzo
=====================================================================
ENTRADA
CONTROL
ARITMETICA Y LOGICA
MEMORIA
SALIDA
SUBSITEMA DE
ARITMETICA
CPU
(SUMA, RESTA,
MULTIPLICACION, DIVISION,
AND, OR, OR-EXCLUSIVO,
ETC.)
SUBSITEMA DE
ENTRADA
(TECLADO, MOUSE,
DISCO, JOYSTICK.)
SUBSITEMA DE
CONTROL
(COORDINA TODO)
SUBSITEMA DE
MEMORIA
(HASTA 1 MB DE RAM Y/O
ROM)
SUBSITEMA DE
SALIDA
(PANTALLA,
IMPRESORA, PLOTTER,
DISCO, ETC.)
MEMORIA
EL PROCESADOR ES CAPZ DE DIRECCIONAR 1 MB DE MEMORA A UN
TIEMPO ( I MB ES 220 1,048,576 LOCALIDADES DE ALMACENAMIENTO CADA
UNA DE 8 BITS DE LONGITUD) . EL PRIMER BYTE DE MEMORIA EST EN LA
DIRECCION 0 Y EL LTIMO EN LA DIRECCIN 0FFFFF QUE SE ENCUENTRA
EN NOTACIN HEXADECIMAL, O SEA 1,048,575 BASE 10.
REGISTROS
EL PROCESADOR OFRECE UNOS RPIDOS ELEMENTOS
ALMACENAMIENTO EN UN CHIP, CONOCIDOS COMO REGISTROS.
DE
1
2
3
4
DESCRIPCIN
EL REGISTRO DE BANDERAS
EL REGISTRO DE BANDERA DE 16 BITS CONTIENE TODA LA
INFORMACION PERTINENTE ACERCA DEL ESTADO DEL PROCESADOR Y DEL
RESULTADO DE LAS RECIENTES INSTRUCCIONES.
10
Estado
DESACTIVADA
ACTIVADA
Overflow (O)
Direction (D)
Interrupt (I)
Sign (S)
Zero (Z)
NV
OV
UP
DN
DI
EI
PL
NG
NZ
ZR
Auxiliary (A)
Parity (P)
Carry (C)
NA
AC
PO
PE
NC
CY
Overflow
Direction
Interrupts
Sign
Zero
Auxiliary Carry
Parity
Carry
NV = no hay desbordamiento
OV = S lo hay
UP = hacia adelante
DN = hacia atrs
DI = desactivadas
EI = activadas
PL = positivo
NG = negativo
NZ = no es cero
ZR = s lo es
NA = no hay acarreo auxiliar
AC = hay acarreo auxiliar
PO = paridad non
PE = paridad par
NC = no hay acarreo
CY = s lo hay
11
AF Llevar auxiliar = 1, indica que hubo llevar del nibble (4 bits) 0 al nibble 1. O
un pedir prstamo del nibble alto al nibble bajo.
12
OS REGISTROS DE PROPSITO
GENERAL
MOV AX,5
MOV DX,9
ADD AX,DX
t
EL REGISTRO AX
13
MOV AH,7
MOV AL,AH
INC AL
EL REGISTRO BX
MOV
MOV
MOV
MOV
AX,200
DS,AX
BX,9
AL, [BX]
EL REGISTRO CX
EL REGISTRO CX ESPECIALMENTE ES UN CONTADOR. EN EL
SIGUIENTE EJEMPLO SE DESEA REPETIR UN BLOQUE DE INSTRUCCIONES 10
VECES, ESTO SE LOGRA CON :
MOV
CX,10
INICIO_DEL_CICLO:
<<INSTRUCCIONES A REPETIR>>
SUB CX,1
JNZ INICIO_DEL_CICLO
14
MOV CX,10
INICIO_DEL_CICLO :
<<INSTRUCCIONES A REPETIR>>
LOOP INICIO_DEL_CICLO
EL REGISTRO DX
EL REGISTRO DX ESTA RELACIONADO CON LA DIVISIN Y
MULTIPLICACIN; CUNADO SE DIVIDE UN DIVIDENDO DE 32 BITS POR UN
DIVISOR DE 16 BITS, LOS 16 BITS SUPERIORES DEL DIVIDENDO DEBEN SER
PUESTOS EN DX; DESPUES DE LA DIVISIN, EL RESIDUO DE ESTA ES
ALMACENADO EN DX (LOS 16 BITS BAJOS DEL DIVIDENDO DEBEN SER
PUESTOS EN AX) Y EL COCIENTE ES GUARDADO EN AX.
MOV
MOV
MOV
DIV
DX,0012
AX,3456
BX,100
BX
15
EL REGISTRO SI
AX,0015
DS,AX
SI,20
AL, [SI]
AN
MEJOR,
INSTRUCCIONES
DE
CADENA
PUEDEN
SER
REALIZADAS
AUTOMATICAMENTE
REPITIENDO
ESTAS
ACCIONES
CUALQUIER NMERO DE VECES, DE TAL MANERA QUE, UNAS SIMPLES
INSTRUCCIONES PUEDEN REALIZAR CIENTOS DE ACCIONES.
16
EL REGISTRO DI
EL REGISTRO DI ES MUY PARECIDO AL REGISTRO SI EN LO QUE SE
REFIERE A QUE PUEDE SER USADO COMO UN APUNTADOR DE MEMORIA Y
ADEMAS TIENE PROPIEDADES ESPECIALES CUANDO ES USADO CON LAS
POTENTES INSTRUCCIONES DE CADENA, POR EJEMPLO :
MOV
MOV
MOV
ADD
AX,0
DS,AX
DI,1024
BL,[DI]
EL REGISTRO BP
AL IGUAL QUE BX, SI Y DI, EL REGISTRO BP PUEDE SER USADO COMO
UN APUNTADOR DE MEMORIA, PERO CON UNA DIFERENCIA, MIENTRAS QUE
BX, SI Y DI NORMALMENTE ACTUAN COMO APUNTADORES DE MEMORIA
RELATIVOS AL REGISTRO DE SEGMENTO DS, BP APUNTA RELATIVO A SS (EL
REGISTRO DE SEGMENTO DE PILA), LA PILA RESIDE EN EL SEGMENTO
APUNTADO POR SS (STACK SEGMENT).
POR OTRO LADO, LOS DATOS NORMALMENTE RESIDEN EN EL SEGMENTO
APUNTADO POR DS (DATA SEGMENT); BX, SI Y DI USUALMENTE APUNTAN
AL SEGMENTO DE DATOS, NO ES UNA FORMA EFICIENTE USAR BX, SI O DI
PARA APUNTAR A PARAMETROS PASADOS A LA PILA PORQUE LA PILA
NORMALMENTE ESTA EN UN SEGMENTO DIFERENTE, BP SOLUCIONA ESTE
PROBLEMA DANDO DIRECCION DENTRO DEL SEGMENTO DE PILA, POR
EJEMPLO :
PUSH BP
MOV BP,SP
MOV AX,[BP+4]
17
EL REGISTRO SP
18
MOV AX,1
PUSH AX
MOV BX,2
PUSH BX
POP AX
POP BX
19
20
OS REGISTROS DE SEGMENTO
LOS SEGMENTOS Y
DESPLAZAMIENTOS SON
COMBINADOS COMO SIGUE :
EL VALOR DEL SEGMENTO ES
DESVIADO 4 BITS A LA
IZQUIERDA (O MULTIPLICADO
POR 16) Y DESPUS SE LE
SUMA EL DESPLAZAMIENTO.
21
MOV
MOV
MOV
MOV
AX,1000h
DS,AX
SI,201 h
DL,[SI]
22
. MODEL SMALL
. DATA
VAR1 DW 0
.
.
. CODE
MOV AX, @DATA
MOV DS, AX
.
.
END
EL REGISTRO CS
EL REGISTRO CS APUNTA AL INICIO DE LOS 64 KB DE MEMORIA
(BLOCK), SEGMENTO DE CODIGO EN EL CUAL RESIDE LA SIGUIENTE
INSTRUCCION QUE SERA EJECUTADA Y QUE SE ENCUENTRA EN EL
DESPLAZAMIENTO ESPECIFICADO POR IP, ESTO ES, EN LA DIRECCION
SEGMENTO:DESPLAZAMIENTO CS:IP.
EL REGISTRO CS PUEDE SER CAMBIADO POR UN NUMERO DE
INSTRUCIONES INCLUYENDO CIERTOS SALTOS, LLAMADAS Y RETORNOS.
23
EL REGISTRO DS
EL REGISTRO DS APUNTA AL INICIO DEL SEGMENTO DE DATOS,
CUAL ES UN BLOCK DE 64 KB. NORMALMENTE LOS DESPLAZAMIENTOS
MEMORIA INVOLUCRAN A BX, SI O DI OPERANDO RELATIVOS A DS .
SEGMENTO DE DATOS ES BASICAMENTE LO QUE SU NOMBRE INDICA,
SEGMENTO EN EL CUAL RESIDE EL JUEGO DE DATOS EN CURSO.
EL
DE
EL
EL
EL REGISTRO ES
EL REGISTRO ES APUNTA AL INICIO DEL BOLCK DE MEMORIA
CONOCIDO COMO EL SEGMENTO EXTRA, COMO SU NOMBRE IMPLICA, EL
SEGMENTO EXTRA NO ESTA DEDICADO A ALGUN PROPOSITO, PERO ESTA
DISPONIBLE PARA LAS NECESIDADES QUE SE PRESENTEN, ALGUNAS VECES,
ESTE SEGMENTO ES USADO PARA HACER UN BLOCK ADICIONAL DE 64 KB
DISPONIBLE PARA ALMACENAMIENTO DE DATOS, PERO EL ACCESO A ESTE
ES MENOS EFICIENTE QUE EL ACCESO AL SEGMENTO DE DATOS.
DONDE FUNCIONA REALMENTE EL SEGMENTO EXTRA ES CUANDO SE
USAN LAS INSTRUCCIONES DE CADENAS, TODAS ESTAS INSTRUCCIONES
QUE ESCRIBEN A LA MEMORIA USAN ES:DI COMO LA DIRECCION DE
MEMORIA; ESTO QUIERE DECIR QUE ES EXTREMADAMENTE UTIL COMO EL
SEGMENTO DE DESTINO PARA BLOQUES COPIADOS, COMPARACION DE
CADENAS, BUSQUEDAS EN MEMORIA Y BORRADO DE BLOQUES DE
MEMORIA.
EL REGISTRO SS
EL REGISTRO SS APUNTA AL INICIO DEL SEGMENTO DE PILA, LAS
INSTRUCCIONES COMO : PUSHES, POPS, CALLS Y RETURNS, TRABAJAN CON
ESTE SEGMENTO PORQUE SP ES SOLO CAPAZ DE DIRECCIONAR MEMORIA
EN ESTE SEGMENTO. COMO YA SE HA DICHO ANTES, EL REGISTRO BP
TAMBIEN OPERA RELATIVO AL SEGMENTO DE PILA, ESTO PERMITE QUE BP
SEA USADO PARA DIRECCIONAR PARAMETROS Y VARIABLES QUE ESTAN
ALMACENADOS EN LA PILA.
24
ODOS DE DIRECCIONAMIENTO
CS * 16
Direccin de 20 bits
IP
Bus de
direccin
Del sistema
25
La instruccin del CPU especifica cules registros internos se usan para generar
el offset.
Se tienen siete modos de direccionamiento que son:
INMEDIATO
DE REGISTRO
DIRECTO
DIRECCIONAMIENTO
DE REGISTRO INDIRECTO
RELATIVO A LA BASE
INDEXADO DIRECTO
BASE INDEXADO
Direccionamiento Inmediato
El operando fuente aparece en la instruccin. Un ejemplo, es el que mueve un valor
constante a un registro interno.
MOV AX, 568
Direccionamiento de Registro
Indica que el operando a ser usado est contenido en uno de los registros internos de
propsito general del CPU. En el caso de los registros AX, BX, CX o DX los registros
pueden ser de 8 a 16 bits
26
Ejemplos:
; AX BX
; AL BL
MOV AX, BX
MOV AL, BL
Direccionamiento Directo
Especifica en la instruccin la localidad de memoria que contiene al operando. En
este tipo de direccionamiento, se forma una direccin de 20 bits.
Ejemplo:
MOV CX, COUNT
DS * 16
COUNT = CONSTANTE
+
DIRECCION DEL SISTEMA DE 20 BITS
Este es el segmento por omisin que se usa. Sin embargo, cualquiera de los 4
segmentos puede usarse. Esto se efecta especificando el registro apropiado en la
instruccin.
Por ejemplo, suponiendo que se desea usar el registro ES en lugar del DS:
MOV CX, ES: COUNT
27
El valor de 16 bits contenido en el registro SI debe ser el offset usado para calcular la
direccin de 20 bits.
Otra vez, debe usarse un registro de segmento para generar la direccin final. El
valor de 16 bits en SI se combina con el segmento apropiado para generar la
direccin.
28
29
PERACIONES ARITMTICAS
BSICAS
O
SUMAS
LA INSTRUCCIN ADD
SUMA EL OPERANDO FUENTE AL DESTINO Y DEJA EL RESULTADO EN EL
DESTINO.
ADD destino,fuente
POR EJEMPLO, LA INSTRUCCIN ADD DX,5 SUMAR AL REGISTRO DX EL
OPERANDO INMEDIATO 5 Y DEJAR EL RESULTADO EN EL REGISTRO DX. LA
INSTRUCCIN PUEDE REALIZAR OPERACIONES DE SUMA ENTRE REGISTROS
Y DATOS INMEDIATOS, ENTRE REGISTROS Y LOCALIDADES DE MEMORIA O
ENTRE REGISTRO Y REGISTRO. OTRO EJEMPLO ES:
MOV DX,5
MOV CX,6
ADD DX,CX
30
LA INSTRUCCIN ADC
SUMA EL OPERANDO FUENTE AL DESTINO MS EL POSIBLE ACARREO DE LA
OPERACIN ANTERIOR Y DEJA EL RESULTADO EN EL OPERANDO DESTINO.
ADC destino,fuente
CUANDO DESEE OPERAR SOBRE CANTIDADES GRANDES (QUE NECESITEN
MAS DE 16 BITS DE ALMACENAMIENTO EN EL RESULTADO), ES MUY UTIL
USAR LA INSTRUCCIN ADC O SUMA CON ACARREO. DICHA INSTRUCCIN
REALIZA LA SUMA Y AUTOMTICAMENTE TOMA EN CUENTA EL ACARREO;
GENERALMEMNTE USA 32 BITS PARA SUS OPERACIONES (LAS
OPERACIONES SE REALIZAN SOBRE EL REGISTRO PAR DX:AX). EL
PROCESO ES COMO SIGUE:
11101100
01100000 (5,500,000)
------------PB1------------EC
60
B = 00000000
00110110 11101110
10000000 (3,600,000)
------------PA2------------ -------------PB2------------00
36
EE
80
31
11101100 01100000
ADD
11101110 10000000
-------------------------------11011010 11100000
EC 60
ADD
EE 80
--------------DA E0
(LA BANDERA DE ACARREO SERA 1)
00000000 01010011
ADC
00000000 00110110
-------------------------------00000000 10001010
00 53
ADC
00 36
-----------00 8A
32
LA INSTRUCCIN INC
UNA DE LAS OPERACIONES DE SUMA MS USADA ES LA DE INCREMENTAR
EN UNO CUALQUIER REGISTRO O LOCALIDAD DE MEMORIA. PARA ESTE
PROPSITO SIRVE LA INSTRUCCIN INC (USA UN SOLO OPERANDO Y LO
INCREMENTA EN UNO). INC AX REALIZARA LA OPERACIN DE AX = AX +1.
ADVIERTA QUE SE AHORRA EL USO DE LA INSTRUCCIN ADD AX,1, PUES
INC ES MS RPIDA EN EJECUCIN Y OCUPA UN BYTE, MIENTRAS QUE ADD
AX,1 OCUPA 3 BYTES.
RESTAS
EXISTEN TRES INSTRUCIONES QUE SE PUEDEN USAR EN LAS RESTAS; DOS
DE ELLAS FUNCIONAN CON DOS OPERANDOS Y UNA SLO CON UNO.
DICHAS INSTRUCCIONES SON:
DEC (DECREMENTO).
LA INSTRUCCIN SUB
RESTA AL OPERANDO DE DESTINO EL OPERANDO FUENTE Y DEJA EL
RESULTADO EN EL DESTINO.
SUB destino,fuente
POR EJEMPLO, SUB AX,DX LE RESTA AL REGISTRO AX EL CONTENIDO DEL
REGISTRO DX Y DEJA EL RESULTADO EN AX.
33
LA INSTRUCCIN SBB
LE RESTA AL OPERANDO DE DESTINO EL OPERANDO FUENTE, INCLUYENDO
EL ACARREO.
SBB destino,fuente
PARA ESTA INSTRUCIN SE PUEDE APLICAR EL MISMO ALGORITMO
SEALADO EN LA SUMA PARA TRABAJAR CON CANTIDADES DE 32 BITS. LO
NICO QUE CAMBIA ES EL ORDEN DE OPERACIN SOBRE LAS PALABRAS.
EN LUGAR DE TENER PA1 + PB1 SE TENDRA PA1 - PB1; EN LUGAR DE TENER
PA2 + PB2 SE TENDRA PA2 - PB2, Y EN LUGAR DE USAR LA INSTRUCCIN
ADC SE USARA SBB, RESTA CON ACARREO.
EJEMPLO:
MOV AX, EC60
SUB AX, EE80
LA INSTRUCCIN DEC
LA INSTRUCCIN DEC SE UTILIZA PARA DECREMENTAR UN OPERANDO EN
UNA UNIDAD, DEC AX REALIZARA LA OPERACIN DE AX = AX - 1.
MULTIPLICACIONES
SE TIENEN DOS INSTRUCCIONES PARA MULTIPLICAR VALORES, ESTAS SON:
34
LA INSTRUCCIN MUL
EXISTEN DOS FROMAS DE MULTIPLICAR, MULTIPLICACIN DE 8 BITS Y
MULTIPLICACION DE 16 BITS.
C:\DEBUG
-A 100
28B7:0100 MOV AX, FFFF
28B7:0103 MOV CX, FFFF
28B7:0106 MUL CX
28B7:0108 INT 20
28B7:010A
-G 108
;pone 65535 en AX
;pone 65535 en CX
;multiplica las dos cantidades y deja el resultado
;en el registro par DX:AX
35
LA INSTRUCCIN IMUL
LA INSTRUCCION IMUL PERMITE LA MULTIPLICACION ENTRE DOS
CANTIDADES DE 8 0 16 BITS CON SIGNO (SI EL BIT MAS SIGNIFICATIVO DEL
BYTE O PALABRA ES 1, ENTONCES LA CANTIDAD SE CONSIDERA
NEGATIVA). EL SIGUIENTE ES UN EJEMPLO DONDE SE INVOLUCRAN LAS
DOS INSTRUCCIONES MUL e IMUL.
C:\DEBUG
-A 100
28B7:0100
28B7:0102
28B7:0104
28B7:0106
28B7:0108
28B7:010A
28B7:010C
-G 104
MOV AL,-1
MOV CL,6
MUL CL
MOV AL,-1
IMUL CL
INT 20
36
-G 106
AX=05FA BX=0000 CX=0006 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=28B7 ES=28B7 CS=28B7 CS=28B7 IP=0106 OV UP EI PL NZ AC PE CY
28B7:0106 B0FF
MOV AL,FF
DIVISIONES
SE TIENEN DOS INSTRUCCIONES PARA DIVIDIR VALORES, ESTAS SON:
DIV
IDIV
37
LA INSTRUCCIN DIV
EXISTEN DOS FROMAS DE DIVISIN, DIVISIN DE 8 BITS Y DIVISIN DE 16
BITS.
AX
AH
EJEMPLO:
C:\DEBUG
-A 100
250E:0100
250E:0103
250E:0105
250E:0108
250E:0109
MOV
MOV
DIV
INT
AX,00FF
BL,8
BL
20
-G 108
AX=071F BX=0008 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=250E ES=250E SS=250E CS=250E IP=0107 NV UP EI PL NZ AC PO NC
250E:0107 CD20 INT 20
38
DX:AX
DX
EJEMPLO:
C:\DEBUG
-A100
250E:0100
250E:0103
250E:0106
250E:0108
250E:010A
MOV
MOV
DIV
INT
AX,FFFF
BX,2
BX
20
-G108
AX=7FFF BX=0002 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000
DS=250E ES=250E SS=250E CS=250E IP=0108 NV UP EI PL NZ AC PO NC
250E:0108 CD20 INT 20
LA INSTRUCCIN IDIV
ESTA INSTRUCCIN DIVIDE, CONSIDERANDO EL SIGNO, EL REGISTRO AX O
EL REGISTRO PAR DX:AX POR EL OPERANDO ORIGEN. EL RESULTADO SE
ALMACENA EN AL O AX, SEGN EL OPERANDO SEA DE UN BYTE O DE UNA
PALABRA. EL RESIDUO SE ALMACENA EN EL REGISTRO AH O DX.
39
EJEMPLO:
C:\DEBUG
-A 100
250E:0100
250E:0103
250E:0105
250E:0108
250E:0109
MOV
MOV
IDIV
INT
AX,FFED
BL,2
BL
20
; dividendo = -19
; divisor = 2
-G 108
AX=01F7 BX=0008 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=250E ES=250E SS=250E CS=250E IP=0107 NV UP EI PL NZ AC PO NC
250E:0107 CD20 INT 20
40
rotacin a la izquierda
rotacin a la derecha
rotacin con acarreo a la izquierda
rotacin con acarreo a la derecha
CLC
STC
borrar acarreo
poner acarreo a 1
SAL/SHL realiza desplazamiento a la izquierda del primer operando tantos bits como
indique el segundo operando, introduciendo un 0 y guardando el bit que sale en el bit CF el
registro de estado.
CF
SAL/SHL mem, CL
SAR mem, CL
41
CF
SHR mem, CL
RCL realiza la rotacin a la izquierda de los bits del operando a travs del bit CF (acarreo)
del registro de estado.
CF
RCL mem, CL
Afecta a los bit OF, CF del registro de estado.
RCR realiza la rotacin a la derecha de los bits de operando a travs del bit CF del registro
de estado.
CF
42
RCR mem, CL
ROL realiza la rotacin a la izquierda de los bits del operando, ignorando el bit CF del
registro de estado, aunque en CF se almacena el bit que se rota.
CF
ROL mem, CL
CF
ROL mem, CL
43
Las instrucciones SHL/SAL y SAR se suelen usar para hacer multiplicaciones y divisiones,
respectivamente, por nmeros potencia de dos (2, 4, 8,16, 32, 64 y 128), de manera ms
eficiente que las instrucciones MUL y DIV.
Ejemplo:
MOV AX, 40h
MOV CL, 2
SHL AX, CL
; es equivalente y ms eficiente que:
MOV
MOV
MOV
MUL
AX, 40h
DX, 00h
BX, 04h
BX
44
CICLOS
Las instrucciones de CICLOS se usan para realizar estructuras repetitivas, y utilizan el
registro CX como contador.
LOOP
Esta instruccin hace que el programa salte a la direccin especificada (salto dentro del
segmento), mientras que CX sea distinto de 0 y decrementa CX en 1 en cada iteracin.
LOOP salto
Ejemplo:
MOV CX, 100
COMIENZO:
LOOP COMIENZO
;
;
;
;
45
ORG 100H
EMPIEZA:
JMP PROGPRIN
DB
PROGPRIN:
..
..
END EMPIEZA
46
..
..
JMP SHORT ETIQUETA
..
..
ETIQUETA:
47
2-
JAE O JNB- Salta si est arriba o es igual o salta si no est abajo (jump if above or
equal o jump if not below). El salto se efecta si CF=0.
3-
4-
JBE O JNA- Salta si est abajo o si es igual o salta si no est arriba (jump if below
or equal o jump if not above). El salto se efecta si CF=1 o ZF=1.
5-
JE O JZ- Salta si es igual o salta si es cero (jump if equal o jump if zero). El salto
se efecta si ZF=1 (tambin se aplica a comparaciones de enteros con signo).
6-
JNE O JNZ- Salta si no es igual o salta si no es cero (jump if not equal o jump if not
zero). El salto se efecta si ZF=0 (tambin se aplica a comparaciones de enteros
con signo).
48
2-
3-
4-
2-
JNC- Salta si no hay acarreo (jump if not carry). El salto se efecta si CF=0.
3-
4-
JNP O JPO- salta si no hay paridad o salta si la paridad es non. El salto se efecta si
pf=0
5-
JNS- salta si el signo esta apagado (jump if not sign). El salto se efecta si sf=0.
6-
7-
JP O JPE- Salta si hay paridad o salta si la paridad es par (jump if parity o jump if
parity even). El salto se efecta si PF=1.
8-
JS- Salta si el signo esta prendido (jump if sign set). El salto se efecta si SF=1.
49
Un punto adicional que vale la pena mencionar en cuanto a las comparaciones con
signo, es que son necesarias y van de acuerdo con la interpretacin que se le quiera dar a
los bytes o palabras del programa. por ejemplo, suponga que tiene un byte cuyo valor es
11111111 en binario y que desea compararlo con otro cuyo valor es 00000000, "es
11111111 mayor que 00000000 ?", si y no, eso depende de la interpretacin que se le
quiera dar. si trabaja con nmeros enteros sin signo, s lo ser, pues 255 es mayor que 0,
por el contrario, si tiene signo entonces ser menor puesto que -1 es siempre menor que
cero.
Lo anterior lleva a seleccionar las instrucciones de comparacin y de salto de acuerdo con
la interpretacin que se les d a los bytes o palabras. As mismo, es muy importante
advertir que los saltos condicionales se encuentran limitados al rango de -128 a +127
bytes como mxima distancia, ya sea hacia adelante o hacia atrs. si desea efectuar un
salto a mayores distancias es necesario crear una condicin mixta entre saltos
condicionales y no condicionales.
50
ESTILO DE PROGRAMACIN
Un programa en lenguaje ensamblador es una serie de sentencias ejecutables que le dicen al
ensamblador que operaciones tiene que realizar. Esta serie de sentencias, a menudo, se
denominan cdigo fuente. Como en cualquier otro lenguaje, el cdigo fuente del lenguaje
ensamblador tiene una sintaxis predefinida.
Cada sentencia de lenguaje ensamblador est compuesta de cuatro campos:
Campo nombre
Campo operacin
Campo operando
Campo comentario.
Sin embargo, ciertas instrucciones del ensamblador no utilizan todos los campos. El campo
comentario existe para expresar propsitos o documentacin de programacin interna y es
opcional.
CAMPO NOMBRE
El campo del nombre, algunas veces denominado el campo rotulo, asigna un nombre
simblico a la direccin de comienzo de memoria real de una instruccin y elimina la
necesidad de seguir la pista de direcciones de las instrucciones. Esto es especialmente til
al generar cdigo reubicable.
Al utilizar una referencia simblica, el programador permite al enlazador (linker)
seleccionar en qu sitio de memoria ser cargado el programa en lenguaje ensamblador.
Todas las referencias a instrucciones pueden entonces variar automticamente con la
colocacin del cdigo. Aunque a cualquier instruccin se le puede dar un nombre, este
campo esta habitualmente reservado para aquellas instrucciones que sern referenciadas en
las definiciones de datos, constantes, segmentos, lazos, bifurcaciones y llamadas a
subrutinas.
Un nombre debe comenzar con un caracter alfabtico y puede contener hasta 31
caracteres, incluyendo:
-todas las letras de la a a la z.
-dgitos numricos del 0 al 9.
-los smbolos especiales siguientes: - $ . ? @ %
Debe tenerse precaucin al seleccionar un nombre, no se puede utilizar un nombre que
coincida con una palabra reservada o directivo del ensamblador. Si el nombre incluye un
punto (.) , entonces el punto debe ser el primer caracter.
51
VARIABLES
Un nombre de variable representa una posicin de memoria que es accesible por programa;
y el contenido de esta posicin de memoria puede cambiar durante la ejecucin. Las
definiciones de variables incluyen informacin sobre la direccin de posiciones de
memoria, tipos de datos y tamao. Las variables pueden ser utilizadas como operando en
formas simple, indexada o estructurada.
RTULOS
Los nombres aplicados a instrucciones ejecutables en los programas de aplicacin son
referenciados como cdigo relativo. Un nombre, o rotulo en este caso, tiene tres atributos:
1. direccin de segmento,
2. desplazamiento de segmento y
3. descriptor de accesibilidad near o far.
La CPU puede direccionar un rotulo particular de dos formas:
Primera forma:
Si el rotulo que se est referenciando esta en el mismo segmento del cdigo, entonces
solamente se necesita el desplazamiento de segmento para localizar la orden, en este caso,
podramos decir que el tipo del rotulo era near. Para definir un rtulo como near,
inmediatamente despus del rotulo se colocan dos puntos (:) o la pseudo-op near puede ser
usada:
ciclo:
Los dos puntos (:), como se muestra, indican al ensamblador que esta es una instruccin
referenciada en el mismo segmento de cdigo.
En este ejemplo, el rtulo est explcitamente definido como near al usar el rotulo de la
pseudo-op.
Segunda forma:
Para direccionar un rtulo requiere la direccin del segmento y la direccin del
desplazamiento. Este es el caso en que la sentencia del ensamblador a referenciar no est en
el mismo segmento de cdigo, en este caso, el rotulo se define como far.
codigo
label
far
52
En el ejemplo mostrado, la pseudo-op "label" fue utilizada con el atributo far. Los
atributos far pueden ser tambin utilizados para rotular equate y procedure y sentencias
external, como se ve en los siguientes ejemplos:
diez
imprime
extrn
equ
far
proc
far
randm: far
10
CONSTANTES
Los nombres tambin pueden ser dados a posiciones de memoria que contienen valores
inicializados que no cambian durante la ejecucin del programa, estos valores inicializados
se denominan constantes, las constantes pueden ser de ocho tipos.
BINARIA: Las constantes binarias contienen una serie de ceros (0) y unos (1) y estn
seguidos por una letra b. por ejemplo:
NUMERO EQU 00001000B
DECIMAL: Las constantes decimales contienen una serie de dgitos del 0 al 9 y estn
opcionalmente seguidas por la letra d. una serie de dgitos se considera como un nmero
decimal a menos que cambie la base, ejemplo:
LUGAR EQU 40D
32H
OFFH
En este ejemplo, el 0 fue aadido para indicar al ensamblador que ffH era un nmero
hexadecimal, no un rtulo o nombre de variable.
OCTAL: Las constantes octales contienen los dgitos del 0 al 7 seguidos por la letra o o q,
por ejemplo:
CANTIDAD EQU 6O 6Q
53
`B`
"J WILLIAMS"
PUNTO FLOTANTE: Este tipo de dato representa valores en notacin cientfica decimal
y no est soportado por el small assembler de IBM . por ejemplo:
SENO DD O.322E-1
REAL HEXADECIMAL: Esta es una constante que contiene los dgitos del 0 al 9 y las
letras de la a a la f, seguidas por la letra r. igual que las constantes hexadecimales, el primer
caracter debe ser uno de los dgitos del 0 al 9. La constante debe contener un nmero total
de dgitos que igualen a 8, 16 o 20, a menos que el primer dgito sea un 0, en este caso, el
nmero total de dgitos debe ser uno mayor (9,17 21). Este tipo de dato tampoco est
soportado por el small assembler de IBM. por ejemplo:
NUMERO_DE_HORAS
DD OFAB12345R
En el primer ejemplo, scradd equ [bp + 16], el nombre scradd puede ser sustituido en lugar
de la expresin ndice [bp + 16]. Igualmente, -basnum- se le puede reasignar un nuevo
valor mientras el programa estaba en ejecucin.
CAMPO OPERACIN
El campo de operacin contiene un nemotcnico para una instruccin real del
microprocesador, el nemotcnico es una "ayuda de memoria" de dos a seis caracteres. En
lugar de ser un valor binario o hexadecimal para una instruccin mquina, el nemotcnico
es una abreviatura en ingls, el nemotcnico de operacin hace el cdigo ms fcil de leer y
comprender y es solamente una tabla de conversin interna del valor binario de cdigo
mquina real. Una operacin o nemotcnico puede representar una instruccin mquina,
macroinstruccin o pseudo-operacin, por ejemplo:
INICIAL: MOV AX,19H
54
MACRO
SERVICIO__ID
CAMPO OPERANDO
El campo de operandos contiene la posicin o posiciones donde estn los datos que van a
ser manipulados por la instruccin, la instruccin puede requerir uno o dos operandos, si
hay dos operandos, stos estn separados por una coma (,).
Cuando una operacin requiere dos operandos, el primer operando se denomina operando
destino y el segundo se denomina operando fuente. Operaciones de transferencia de datos,
registros, almacenamiento inmediato y almacenamiento de memoria son ejemplos de
instrucciones que requieren dos operandos, por ejemplo:
MOV
AX,8
Este es un ejemplo de operando inmediato. Aqu, el dato a ser manipulado se incluye como
operando fuente y se desplaza al registro AX, u operando destino.
CAMPO COMENTARIO
El campo comentario es el ltimo de los cuatro campos y puede ser uno de los ms tiles.
El campo comentario se utiliza para documentar internamente el cdigo fuente del
ensamblador y son tiles slo al listar el cdigo fuente. Si un comentario se incluye con una
instruccin de operacin, entonces debe estar separado del ltimo campo por al menos un
espacio en blanco y comenzar con un punto y coma (;), un comentario debe ser utilizado
para describir aquellas lneas de cdigo fuente que no son comprensibles inmediatamente.
por ejemplo:
MOV AH,45H
55
ALMACENAMIENTO
Un programa es simplemente una secuencia de bytes (visto desde el punto de vista del
procesador), al igual que el rea de datos que maneja, y dichos bytes se encuentran
ubicados en alguna parte de la memoria. El procesador no hace distinciones entre un
nmero entero y una cadena de caracteres, simplemente los trata como localidades de
memoria. Por otro lado, el ensamblador permite distinguir entre formatos y cantidad de
bytes por almacenar, se puede solicitar el almacenamiento como se indica:
DB
DW
DD
DF, DP
DQ
DT
1 byte
2 bytes = una palabra
4 bytes = una doble palabra
6 bytes = una palabra de puntero lejano (386)
8 bytes = una cudruple palabra
10 bytes