You are on page 1of 58

INSTITUTO TECNOLOGICO DE CHILPANCINGO

INGENIERIA EN SISTEMAS COMPUTACIONALES




LENGUAJE DE INTERFAZ

ELABORO: Ninci Victoria Serrano Reyes
PROFESOR: Rogelio Fernando Hernndez Miranda












Chilpancingo, Gro., noviembre de 2013





UNIDAD I






INTRODUCCIN AL LENGUAJE ENSAMBLADOR

1.1 Importancia de la programacin en lenguaje ensamblador.
1.2 El procesador y sus registros internos
1.3 La memoria principal (RAM)
1.4 El concepto de interrupciones
1.5 Llamadas a servicios del sistema
1.6 Modos de direccionamiento
1.7 Proceso de ensamblado y ligado
1.8 Desplegado de mensajes en el monitor
















1.1 IMPORTANCIA DE LA PROGRAMACIN EN LENGUAJE ENSAMBLADOR.
El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para
escribir programas informticos, y constituye la representacin ms directa
del cdigo mquina especfico para cada arquitectura de
microprocesador.
La importancia del lenguaje ensamblador radica principalmente que se
trabaja directamente con el microprocesador; por lo cual se debe de
conocer el funcionamiento interno de este, tiene la ventaja de que en l se
puede realizar cualquier tipo de programas que en los lenguajes de alto
nivel no lo pueden realizar. Otro punto sera que los programas en
ensamblador ocupan menos espacio en memoria.
Ventajas
1. Como trabaja directamente con el microprocesador al ejecutar
un programa, pues como este lenguaje es el ms cercano a la mquina la
computadora lo procesa ms rpido.
2. Eficiencia de tamao. Un programa en ensamblador no ocupa
mucho espacio en memoria porque no tiene que cargar libreras y dems
como son los lenguajes de alto nivel
3. Flexibilidad .- Es flexible porque todo lo que puede hacerse con una
mquina, puede hacerse en el lenguaje ensamblador de esta mquina;
los lenguajes de alto nivel tienen en una u otra forma limitantes para
explotar al mximo los recursos de la mquina. O sea que en lenguaje
ensamblador se pueden hacer tareas especficas que en un lenguaje de
alto nivel no se pueden llevar acabo porque tienen ciertas limitantes que
no se lo permite.
Desventajas
Tiempo de programacin .- Como es un lenguaje de bajo nivel requiere
ms instrucciones para realizar el mismo proceso, en comparacin con un
lenguaje de alto nivel. Por otro lado, requiere de ms cuidado por parte
del programador, pues es propenso a que los errores de lgica se reflejen
ms fuertemente en la ejecucin.
Programas fuente grandes .- Por las mismas razones que aumenta
el tiempo, crecen los programas fuentes; simplemente requerimos ms
instrucciones primitivas para describir procesos equivalentes. Esto es una
desventaja porque dificulta el mantenimiento de los programas, y
nuevamente reduce la productividad de los programadores.
Peligro de afectar recursos inesperadamente .- Que todo error que
podamos cometer, o todo riesgo que podamos tener, podemos afectar los
recursos de la mquina, programar en este lenguaje lo ms comn que
pueda pasar es que la mquina se bloquee o se reinicialice. Porque con
este lenguaje es perfectamente posible (y sencillo) realizar secuencias de
instrucciones invlidas, que normalmente no aparecen al usar un lenguaje
de alto nivel.
Falta de portabilidad.- Porque para cada mquina existe un lenguaje
ensamblador; por ello, evidentemente no es una seleccin apropiada de
lenguaje cuando deseamos codificar en una mquina y luego llevar los
programas a otros sistemas operativos o modelos de computadoras.
BIBLIOGRAFIA:
www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r78731.DOCX

1.2 EL PROCESADOR Y SUS REGISTROS INTERNOS
























BIBLIOGRAFIA:
Programacin Avanzada en Lenguaje Ensamblador, Ramn Medina
1.3 LA MEMORIA PRINCIPAL (RAM)


BIBLIOGRAFIA:
Lenguaje Ensamblador y programacin para IBM PC y compatibles, Peter Abel,
Tercera Edicin.
1.4 EL CONCEPTO DE INTERRUPCIONES
Ya que un procesador no puede procesar simultneamente varios trozos de
informacin (procesa un trozo de informacin por vez), un programa que est
siendo ejecutado puede, gracias al pedido de interrupcin, ser
momentneamente suspendido mientras se produce una interrupcin. El
programa interrumpido puede continuar ejecutndose luego. Existen 256
direcciones de interrupcin diferentes.
Una interrupcin se convierte en una interrupcin de hardware cuando es
solicitada por uno de los compone
ntes de hardware del equipo. En efecto, existen varios perifricos en un equipo.
Estos perifricos necesitan generalmente utilizar los recursos del sistema aunque
slo sea para comunicarse con el sistema mismo.
Cuando un perifrico desea acceder a un recurso, enva un pedido de
interrupcin al procesador para llamar su atencin. Los perifricos cuentan con un
nmero de interrupcin que se denomina IRQ (Peticiones de Interrupcin. Es
como si cada perifrico tirara de un "hilo" que est atado a una campana para
sealarle al equipo que desea que le preste atencin.
Este "hilo" es, de hecho, una lnea fsica que conecta cada ranura de expansin
as como cada interfaz E/S a la placa madre. Para una ranura ISA de 8 bits, por
ejemplo, hay 8 lneas IRQ que unen ranuras ISA de 8 bits a la placa madre (IRQ0 a
IRQ7). Estos IRQ estn controlados por un "controlador de interrupcin" que se
encarga de cederle la palabra al IRQ que posee la mayor prioridad.
Al aparecer las ranuras de 16 bits, se agregaron IRQ 8 a 15. En consecuencia, fue
necesario agregar un segundo controlador de interrupcin. Los dos grupos de
interrupciones estn unidos por IRQ 2 el cual se conecta (o "produce una
cascada") a IRQ9. En cierto modo, esta cascada "inserta" IRQ 8 a 15 entre IRQ1 y
3:

Dado que la prioridad va del IRQ inferior al superior y que se insertan IRQ 8 a 15
entre IRQ 1 y 3, el orden de prioridad es el siguiente:
0 > 1 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 3 > 4 > 5 > 6 > 7
BIBLIOGRAFIA:

1.5 LLAMADAS A SERVICIOS DEL SISTEMA
Las llamadas son peticiones a ejecucin de rutinas y proporcionan la interfaz
entre el sistema operativo y un programa en ejecucin. Estas llamadas son
instrucciones de lenguaje ensamblador y se presentan en los manuales que
emplean los programadores de este lenguaje.
Las llamadas al sistema para ejecucin y el control de programas, usualmente
incluyen un conjunto completo de los servicios accesibles por la va del lenguajes
de rdenes, tales como: RUN, EXECUTE, ABORT y planificacin relacionada con el
tiempo, adems los usuarios con las llamadas del sistema pueden suspender,
establecer o cambiar atributos del tiempo de ejecucin de uno o ms programas.
Las llamadas del sistema para el gestor de recursos, proporcionan servicios para la
asignacin, reserva y reclamacin de los recursos del sistema. Por ejemplo, existen
llamadas del sistema para extender o reducir la cantidad de memoria poseda
por el programa que es llama. Las llamadas del sistema pueden asignar o reservar
otros tipos de objetos del sistema y despus destruir o devolver su custodia al
sistema operativo.
Las llamadas al sistema se pueden agrupar en cinco categoras:
1. Control de proceso (Crear, cargar, ejecutar un proceso, obtener y
establecer atributos, esperar un suceso, liberar memoria, abortar y terminar
proceso).
2. Manipulacin de archivos (Crear, abrir, leer, obtener y establecer atributos,
cerrar y eliminar archivos).
3. Manipulacin de perifricos (Solicitar, escribir, leer, obtener y establecer
atributos, liberar perifrico).
4. Manipulacin de la informacin (Obtener fecha y hora, establecer fecha y
hora, obtener y establecer datos del sistema, obtener y establecer
atributos).
5. Comunicaciones (Crear conexin, enviar mensajes, recibir mensajes,
transferir informacin del estado y eliminar conexin.
BIBLIOGRAFIA:
www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r87219.PPTX
1.6 MODOS DE DIRECCIONAMIENTO




BIBLIOGRAFIA:
Programacin Avanzada en Lenguaje Ensamblador, Ramn Medina
1.7 PROCESO DE ENSAMBLADO Y LIGADO















BIBLIOGRAFIA:
http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r87222.PDF
1.8 DESPLEGADO DE MENSAJES EN EL MONITOR
Empezamos con escribir el mensaje que queremos desplegar esto de hace
de la siguiente forma.
mov ah, 09h
lea cx, mensaje
int 21h
* En la primera instruccin (mov ah,09h) es lo que nos permite desplegar el
mensaje.
*en la segunda instruccin(lea cx, mensaje) es el que manda a llamar el
mensaje en este caso el mensaje se llama "mensaje" por eso despus de la
coma le puse mensaje este nombre puede variar, debe recordar que al
final del mensaje usted tiene que poner el smbolo $ para que el programa
vea que es el final del mensaje.
*en la ltima instruccin (int 21h) llama al BIOS.

"aclaro el mensaje tiene que ser del mismo nombre que le pusiste al
principio de lo contrario marcara un error y no se desplegara el mensaje
(datas segment mensaje db "mi nombre es$" datas ends) este es un
ejemplo de cmo declarar un mensaje, el mensaje es lo que est escrito
entre comillas y termina con $"
El siguiente cdigo es para posicionar el curso el cualquier parte de la
pantalla, para que puedas empezara a escribir desde donde t le pongas
a tu programa.
Para realizar esto se deber ingresar este conjunto de instrucciones.

mov ah,02h
mov dh,03h
mov dl,0ch
int 10h

* En la primera instruccin (mov ah,02h) es lo que nos permite mover el
cursor.
*la segunda instruccin (mov dh,03h) es la direccin de la fila, en este caso
yo estoy posicionando el cursor en la fila 3 (hexadecimal).
*en la tercera instruccin (mov dl,0ch) es la direccin de la columna, en
esta caso tambin yo estoy posicionando el cursor en la columna 12 solo
que esta en hexadecimal.
*y por ultimo mandamos a llamar al BIOS.

El siguiente cdigo nos permitir leer un carcter con eco.
Leer un carcter con eco quiere decir que al leer el carcter, este lo
mostrara y lo podemos hacer con el siguiente cdigo.
mov ah,01h

int 21h
*La primera instruccin (mov ah,01h) es lo que nos permite leer el carcter
con eco, cabe destacar que yo estoy utilizando esta funcin(01h) pero hay
otros tambin.
*En el ltimo solo mandamos a llamar el BIOS y listo.
Este cdigo nos permitir leer un carcter sin eco.
Leer un carcter sin eco quiere decir que al pulsar un carcter esta no se
mostrara hasta que hagamos un mtodo para desplegar el carcter.

mov ah,07h
int 21h
*En la primera instruccin (mov ah,07h) nos permite leer el carcter sin eco,
al igual que el cdigo anterior aqu tambin hay otras funciones ms.
* Y por ltimo mandamos a llamar al BIOS.
"Este cdigo puede ser til, cuando queramos que nuestro programa
acepte solo algunos caracteres en especfico".

Cdigo para desplegar un solo carcter.
Algunas veces queremos imprimir cualquier carcter y para lograr eso el
siguiente cdigo no ser de utilidad.
mov ah,0eh
mov al, '@'
int 10h
* En la primera instruccin (mov ah,0eh) es la funcin para poder imprimir
un carcter.
*En la segunda instruccin (mov al, '@') es lo que nos permite imprimir el
carcter en este caso el carcter es @ y se almacena en ' al ' en este
cdigo le puse el arroba pero tambien esto puede variar, por ejemplo
para imprimir un carcter del cdigo ASCII solo puedes poner el numero en
hexadecimal equivalente al cdigo pero solo se quitan los apostrofes( ' ' )
es solamente el puro numero pero no olvides que si pones ay directamente
el carcter es son apostrofes.
* Por ultimo mandamos a llamar al BIOS con la interrupcin 21 (int 21h).

Los siguientes cdigos son para empilar y desempolvar (push) y (pop)
Al hablar de empilar me refiero a ingresar un dato o registro en una pila (un
espacio para guardar elementos) y desempilar es quitar el dato de alguna
pila y para ello utilizaremos los siguientes cdigos.
push ax
* Con esta instruccin podemos empilar el registro ax, es decir guardar el
contenido del registro, tambin se pueden empilar los dems registros (bx,
cx, dx)
pop ax
* Con esta instruccin desempilamos el registro ax, es decir quitamos el
contenido del registro ax de la pila.

nota: "en las pilas, los datos que se ingresan al principio se desempilan al
ltimo y los que se empilan al ltimo de empilan al principio".

Cdigo para obtener la fecha del sistema.
A veces necesitamos obtener la fecha del sistema es por eso que tambin
pongo el cdigo para realizar esto.
mov ah,02h
int 21h

*En la primera instruccin (mov ah,02h) es para pedir la fecha del sistema y
se almacenan en los siguientes registros al=dia (en donde 0 equivale a
domingo) , cx= ao(que se muestra en hexadecimal), dh=mes(que se
muestra del 01 al 12), dl=dia (que se muestra de 01 al 31).
* Y por ltimo mandamos a llamar al BIOS para finalizar.

Cdigo para obtener la hora del sistema.
Este es el cdigo que se utiliza para obtener la hora del sistema.

mov ah,2ch
int 21h

*En la primera instruccin (mov ah,2ch) es para pedir la hora del sistema y
se guarda en los siguientes registros ch=hora, cl=minutos, dh=segundos
y cl=centsimas de segundo
*Por ultimo mandamos a llamar al BIOS




UNIDAD II








PROGRAMACIN BSICA
2.1 Ensamblador (y ligador) a utilizar
2.2 Ciclos numricos
2.3 Captura bsica de cadenas
2.4 Comparacin y prueba
2.5 Saltos
2.6 Ciclos condicionales
2.7 Incremento y decremento
2.8 Captura de cadenas con formato
2.9 Instrucciones aritmticas
2.10 Manipulacin de la pila
2.11 Obtencin de cadena con representacin decimal
2.12 Instrucciones lgicas
2.13 Desplazamiento y rotacin
2.14 Obtencin de una cadena con la representacin hexadecimal
2.15 Captura y almacenamiento de datos numricos
2.16 Operaciones bsicas sobre archivos de disco









2.1 ENSAMBLADOR (Y LIGADOR) A UTILIZAR

Bibliografa:
Lenguaje Ensamblador y programacin para IBM PC y compatibles, Peter Abel,
Tercera Edicin.
2.2 CICLOS NUMRICOS
El lenguaje ensamblador cuenta con una instruccin muy poderosa que
permite la programacin de ciclos _nitos, la instruccin LOOP. Esta
instruccin trabaja en forma conjunta con el registro contador CX. El
formato general de esta instruccin es:
Mov CX,Numero_Veces
Etiqueta:
Instrucciones a realizar
Loop Etiqueta

La instruccin Loop ejecuta las instrucciones que se encuentran entre la
Etiqueta: y Loop Etiqueta el numero de veces que indique el campo
No_Veces. Por ejemplo, el siguiente grupo de instrucciones incrementa en
1 el registro AX, esto lo repite 100 veces.
Mov CX,100 ;100 veces
repetir: Nombre de la etiqueta
Inc AX ;AX = AX + 1
Loop repetir Regresa a la etiqueta y compara el ciclo

La instruccin Loop decrementa el registro CX en cada iteracin y se
detiene cuando CX es igual a cero.

Bibliografa:
http://es.scribd.com/doc/132044216/Unidad-2

2.3 CAPTURA BSICA DE CADENAS
En este ejemplo simplemente capturamos una cadena en un vector y la
imprimimos cuantas veces quiera el usuario, en este
programa aprendemos a usar vectores en MASM.

Los vectores se pueden declarar de cualquier tipo de dato que una
variable cualquiera solo que se especifica la longitud del vector y con que
tipo de dato inicia al crearse para ello se utiliza la palabra reservada dup.

Ejemplo de declaracion de un vector:
vector db 100 dup('$')

En este caso declaramos un vector de tipo db con una longitud de 100
posiciones y la iniciamos con cadena vacia ('$').

Para manejar las posiciones de los vectores se utilizan los registros SI y DI.

Ejemplo del programa usuando un vector para almacenar una cadena
digitada por el usuario.

.model small
.stack 64
.data
inicio db 'Repetir Texto..',10,13,'$'
ingresar db 10,13,'Ingresa tu nombre', 10,13,'$'
nombre db 'Su nombre es: $'
repetir db 10,13,'Quiere repetir s/n?',10,13,'$'
;Declaracion del vector
vtext db 100 dup('$')

.code
mov ax,@data
MOV DS,AX
lea dx,inicio
mov ah,09
int 21h

lea dx,ingresar
mov ah,09
int 21h

;Iniciamos nuestro conteo de si en la posicion 0.
mov si,00h
leer:
mov ax,0000
mov ah,01h
int 21h
;Guardamos el valor tecleado por el usuario en la posicion si del vector.
mov vtext[si],al
inc si ;Incrementamos nuestro contador
cmp al,0dh ;Se repite el ingreso de datos hasta que se teclee un Enter.
ja leer
jb leer
lea dx,nombre
mov ah,09
int 21h

ver:
mov dx,offset vtext ;Imprime el contenido del vector con la misma
instruccin de una cadena
mov ah,09h
int 21h
lea dx,repetir ;imprime si quiere ver de nuevo el texto escrito.
mov ah,09
int 21h
mov ah,01h
int 21h
cmp al,73h ;Si la tecla presiona es una s se repite la impresin del
vector.
je ver

salir:
mov ah,4ch
int 21h

end


2.4 COMPARACIN Y PRUEBA
Las instrucciones CMP (comparacin) y TEST (comprobacin) realizan
sendas operaciones aritmticas de las que no se guarda el resultado
obtenido sino que nicamente se modifican los bits de estado.
La instruccin CMP recibe dos operandos. El primero de ellos puede ser de
tipo constante, registro u operando en memoria. El segundo puede ser
nicamente de tipo registro u operando en memoria. La instruccin no
permite que ambos operandos estn en memoria. Al ejecutar esta
instruccin se resta el primer operando del segundo. El valor resultante no
se almacena en lugar alguno, pero s se modifican los bits de estado del
procesador.
Considrese el cdigo mostrado en el ejemplo 5.5. La instruccin de
comparacin modifica los bits de estado para que la instruccin de salto
los interprete y decida si debe saltar o continuar ejecutando la instruccin
ADD.
Ejemplo 5.5. Instruccin de comparacin antes de salto condicional
CMP $0, %eax # Se calcula %eax - 0
JE destino
ADD %eax, %ebx

La instruccin JE produce un salto cuando el bit de estado ZF tiene el
valor 1. Este bit, a su vez se pone a uno si los operandos de la instruccin
CMP son iguales. Por tanto, la instruccin JE, cuando va a continuacin
de una instruccin de comparacin, se puede interpretar como salto si los
operandos (de la instruccin anterior) son iguales.
En la mayora de las instrucciones de salto condicional detalladas en
la seccin 5.4.5, las ltimas letras del nombre hacen referencia a la
condicin que se comprueba cuando se ejecutan a continuacin de una
instruccin de comparacin. Por ejemplo, la instruccin JLE produce un
salto cuando los bits de condicin cumplen ZF= 1 o SF!=OF. Si esta
instruccin va precedida de una instruccin de comparacin, ZF es igual a
1 si los dos operandos son iguales. Si SF es diferente a OF la resta ha
producido un bit de signo, y el bit de desbordamiento con valores
diferentes. Esta situacin se produce si el segundo operando es menor que
el primero, de ah el sufijo LE(del ingls less or equal) en la instruccin de
salto. La tabla 5.11 muestra las combinaciones obtenidas del bit de
desbordamiento y la resta para el caso de enteros representados con 2
bits.
Tabla 5.11. Resta y bit de desbordamiento de dos enteros de 2 bits
OF, A-B
B
(-2) 10 (-1) 11 (0) 00 (1) 01
A
(-2) 10 0, 00 0, 11 0, 10 1, 01
(-1) 11 0, 01 0, 00 0, 11 0, 10
(0) 00 1, 10 0, 01 0, 00 0, 11
(1) 01 1, 11 1, 10 0, 01 0, 00

El bit de signo y el de desbordamiento tienen valores diferentes
nicamente en el caso en que el primer operando de la resta es menor
que el segundo. Por tanto, la instruccin JLEsi se ejecuta a continuacin
de una instruccin CMP se garantiza que el salto se lleva a cabo si el
segundo operando es menor que el primero.
Las instrucciones de salto cuya condicin puede interpretarse con
respecto a la instruccin de comparacin que le precede son las que en la
descripcin mostrada en la tabla tabla 5.10 incluyen una comparacin.
Aunque estas instrucciones no deben ir necesariamente precedidas por
una instruccin de comparacin porque la condicin se evala con
respecto a los bits de estado, generalmente se utilizan acompaadas de
stas.
Para interpretar el comportamiento de una instruccin de comparacin
seguida de una de salto condicional se puede utilizar la siguiente regla
mnemotcnica:
Salto condicional precedido de comparacin
Dada la siguiente secuencia de dos instrucciones en ensamblador:
CMP B, A
Jcond
Donde A y Bson cualquier operando ycondes cualquiera de las
condiciones posibles, el salto se lleva a cabo si se cumpleA cond B.
Por ejemplo, si la instruccin CMP $4, %eax va seguida del salto
condicional JL destino, el procesador saltar a destino si %eax < 4.
La tabla 5.12 muestra posibles secuencias de instrucciones de
comparacin y salto condicional.
Tabla 5.12. Secuencias de instrucciones de comparacin y salto
condicional
Cdigo Comentario
inicio: inc
%eax
cmp
$128, %eax
jae
final
...
jmp
inicio
final: mov
$'A, %cl
...
El salto a final se produce si el registro %eax contiene un valor
mayor o igual a 128. La condicin del salto es para operandos
sin signo, es decir, el resultado de la comparacin se interpreta
como si los operandos fuesen nmeros naturales.
cmp
El salto amenor se produce si el registro%eaxes menor o igual
Cdigo Comentario
$12, %eax
jle
menor
mov
$10, %eax

....
jmp
final
menor: mov
$100, %eax
...
final: inc
%ebx
que 12. La condicin del salto es para operandos con signo
(nmeros enteros).

La posibilidad de saltar a una posicin de cdigo dependiendo de una
condicin est presente en la mayora de lenguajes de programacin de
alto nivel. Por ejemplo, en el lenguaje Java, la construccin if () {} else {} se
implementa a nivel de ensamblador basado en instruccin de salto
condicional.
La instruccin de comprobacin TEST es similar a la de comparacin,
tambin consta de dos operandos, el segundo de ellos puede ser
nicamente de tipo registro o memoria y no se permite que ambos sean de
tipo memoria. La diferencia con CMP es que se realiza una conjuncin bit
a bit de ambos operandos. El resultado de esta conjuncin tampoco se
almacena, pero s modifica los bits de estado OF, CF(ambos se ponen a
cero), SF, ZF y PF.
La tabla 5.13 muestra posibles secuencias de instrucciones de
comprobacin y salto condicional.
Tabla 5.13. Secuencias de instrucciones de comprobacin y salto
condicional
Cdigo Comentario
testl
$0x0080,
contador
jz
ignora
....
ignora: incl
%ebx
El salto a ignora se produce si el operando de 32 bits
almacenado en memoria a partir de la posicin contador
tiene su octavo bit igual a cero. Esta instruccin precisa el
sufijo de tamao.
test
0xFF00FF00, %eax
jnz pl
....
jmp
final
pl: mov %eax
...
El salto a pl se produce si alguno de los bits en las
posiciones 8 a 15 o 24 a 31 del registro %eax es igual a uno.
Bibliografa:
http://ocw.uc3m.es/ingenieria-telematica/arquitectura-
deordenadores/lecturas/html/isa.html#isa:sec:comparetest

2.5 SALTOS
El procesador ejecuta una instruccin tras otra de forma secuencial a no
ser que dicho flujo de ejecucin se modifique. Las instrucciones de salto
sirven para que el procesador, en lugar de ejecutar la siguiente instruccin,
pase a ejecutar otra en un lugar que se denomina destino del salto.
La instruccin de saltoJMP(del ingls jump) tiene un nico operando que
representa el lugar en el que el procesador debe continuar ejecutando. Al
llegar a esta instruccin, el procesador no realiza operacin alguna y
simplemente pasa a ejecutar la instruccin en el lugar especificado como
destino del salto. El nico registro, por tanto, que se modifica es el contador
de programa.
A la instruccin JMP se le denomina tambin de salto incondicional por
contraposicin a las instrucciones de salto en las que el procesador puede
saltar o no al destino dependiendo de una condicin.
La arquitectura IA-32 dispone de 32 instrucciones de salto condicional.
Todas ellas comienzan por la letra J seguida de una abreviatura de la
condicin que determina si el salto se lleva a cabo o no. Al ejecutar esta
instruccin el procesador consulta esta condicin, si es cierta continua
ejecutando la instruccin en la direccin destino del salto. Si la condicin
es falsa, la instruccin no tiene efecto alguno sobre el procesador y se
ejecuta la siguiente instruccin.
Las condiciones en las que se basa la decisin de saltar dependen de los
valores de los bits de estado CF, ZF, OF , SF y PF. La tabla 5.10 muestra
para cada instruccin los valores de estos bits para los que se salta a la
instruccin destino.
Tabla 5.10. Instrucciones de salto condicional
Instrucci
n
Condici
n
Descripcin
Instrucci
n
Condici
n
Descripcin
JA mem
JNBE
mem
CF= 0
yZF= 0
Salto si mayor,
salto si no
menor o igual
(sin signo)
JBE mem
JNA mem
CF= 1
ZF= 1
Salto si menor
o igual, salto si
no mayor (sin
signo)
JAE mem
JNB mem
CF= 0
Salto si mayor
o igual, salto si
no menor (sin
signo)
JB mem
JNAE
mem
CF= 1
Salto si menor,
salto si no
mayor o igual
(sin signo)
JE mem ZF= 1
Salto si igual,
JNE mem ZF= 0
Salto si
Instrucci
n
Condici
n
Descripcin
Instrucci
n
Condici
n
Descripcin
JZ mem salto si cero. JNZ mem diferente, salto
si no cero.
JG mem
JNLE
mem
ZF= 0
ySF=OF
Salto si mayor,
si no menor o
igual (con
signo)
JLE mem
JNG
mem
ZF= 1
SF!=OF
Salto si menor
o igual, si no
mayor (con
signo)
JGE mem
JNL mem
SF=OF
Salto si mayor
o igual, si no
menor (con
signo)
JL mem
JNGE
mem
SF!=OF
Salto si menor,
si no mayor o
igual (con
signo)
JC mem CF= 1
Salto si
acarreo es uno
JNC mem CF= 0
Salto si
acarreo es
cero
JCXZ
mem
%cx= 0
Salto si
registro%cxes
cero.
JECXZ
mem
%ecx= 0
Salto si
registro%ecxes
cero.
JO mem OF= 1
Salto si el bit
de
desbordamien
to es uno.
JNO
mem
OF= 0
Salto si el bit
de
desbordamien
to es cero.
JPO mem
JNP mem
PF= 0
Salto si
paridad impar,
si no paridad.
JPE mem
JP mem
PF= 1
Salto si
paridad par, si
paridad.
JS mem SF= 1
Salto si
positivo.
JNS mem SF= 0
Salto si
negativo.


En la tabla se incluyen instrucciones con diferente nombre e idntica
condicin. Estos sinnimos son a nivel de lenguaje ensamblador, es decir,
las diferentes instrucciones tienen una codificacin idntica y por tanto
corresponden con la misma instruccin mquina del procesador.
La utilidad de estas instrucciones se debe entender en el contexto del flujo
normal de ejecucin de un programa. El resto de instrucciones realizan
diferentes operaciones sobre los datos, y a la vez modifican los bits de la
palabra de estado. Las instrucciones de salto se utilizan despus de haber
modificado estos bits y para poder tener dos posibles caminos de
ejecucin.
El ejemplo 5.4 muestra una porcin de cdigo ensamblador muestra un
posible uso de las instrucciones de salto.
Ejemplo 5.4. Uso de saltos condicionales
MOV $100, %ecx
dest2: DEC %ecx
JZ dest1
ADD %ecx, %eax
JMP dest2
La instruccin DEC %ecx decrementa el valor del registro %ecx y modifica
los bits de la palabra de estado. La instruccin JZ provoca un salto si ZF= 1.
Como consecuencia, la instruccin ADD %ecx, %eax se ejecuta un total
de 100 veces.
Las instrucciones de salto condicional son tiles siempre y cuando los
valores de los bits de estado hayan sido previamente producidos por
instrucciones anteriores, como por ejemplo, operaciones aritmticas. Pero
en algunos casos, la ejecucin de un salto condicional requiere que se
realice una operacin aritmtica y no se almacene su resultado, sino
simplemente que se realice una comparacin. Por ejemplo, si se necesita
saltar slo si un nmero es igual a cero, en lugar de ejecutar una instruccin
ADD, SUB, INC o DEC para que se modifique el bit ZF slo se necesita
comprobar si tal nmero es cero y modificar los bits de estado. Para este
cometido el procesador dispone de las instrucciones de comparacin y
comprobacin.
Bibliografa:
http://ocw.uc3m.es/ingenieria-telematica/arquitectura-
deordenadores/lecturas/html/isa.html#isa:sec:comparetest

2.6 CICLOS CONDICIONALES
Existen dos tipos de instrucciones de salto: las instrucciones de salto
condicional y las de salto incondicional.
Las instrucciones de salto condicional, revisan si ha ocurrido alguna
situacin para poder transferir el control del programa a otra seccin, por
ejemplo:

CMP AX,0 JEotro
:::::::::::
:::::::::::
otro :
::::::::::
::::::::::
End

En este ejemplo, la instruccin JE (Salta si es igual) revisa si la prueba
implcita en la instruccin anterior result positiva, es decir, si la
comparacin de AX con 0 fue cierta. En caso de que AX sea igual a 0, JE
trans_ere el control del programa a las instrucciones que se encuentran
despus de la etiqueta "otro". En caso contrario ejecuta las instrucciones
siguientes a JE.

La siguiente es una lista de las instrucciones de salto condicional y su
descripcin:

JA o JNBE: Salta si est arriba o salta si no est por debajo o si no es igual
(jump if above or jump if not below or equal). El salto se efecta si la
bandera de CF=0 o si la bandera ZF=0.
JAE o JNB: Salta si est arriba o es igual o salta si no est por debajo (jump if
above or equal or jump if not below). El salto se efecta si CF=0.
JB o JNAE: Salta si est por debajo o salta si no est por arriba o es igual
(jump if below or jump if not above or equal). El salto se efecta si CF=1.
JBE o JNA: Salta si est por debajo o es igual o salta si no est por arriba
(jump if below or equal or jump if not above). El salto se efecta si CF=1 o
ZF=1.
JE o JZ: Salta si es igual o salta si es cero (jump if equal or jump if zero).El
salto se efecta si ZF=1.
JNE o JNZ: Salta si no es igual o salta si no es cero (jump if not equal or jump
if not zero). El salto se efecta si ZF=0.
JG o JNLE: Salta si es mayor o salta si no es menor o igual (jump if greater or
jump if not less or equal). El salto se efecta si ZF=0 u OF=SF.
JGE o JNL: Salta si es mayor o igual o salta si no es menor (jump if greater or
equal or jump if not less). El salto se efecta si SF=OF.

2.7 INCREMENTO Y DECREMENTO
Las instrucciones INC y DEC permiten incrementar los contenidos de los
registros.
Ejemplos:
INC AX ;AX=AX+1
INC VAR1 ;VAR1=VAR1+1
DEC AX ;AX=AX-1
DEC VAR1 ;VAR1=VAR1-1 y de las variables almacenadas en memoria.
Bibliografa:
www.scribd.com/doc/132044216/Unidad-2
2.9 INSTRUCCIONES ARITMTICAS
Las operaciones en aritmtica binaria a entera permiten a la CPU realizar
clculos con nmeros enteros positivos y negativos con una representacin
en complemento a 2.
NEG operando: cambia el signo del operando. Equivaldra al NOT del
nmero y le sumara 1.
ADD destino, fuente: destino = destino + fuente.
ADC destino, fuente: destino = destino + fuente + carry (acarreo).
SUB destino, fuente: destino = destino - fuente.
SBB destino, fuente: destino = destino - (fuente + acarreo).
MUL operando: multiplica sin considerar el signo. Multiplica el acumulador
{AL} o {AX} por el operando fuente. Si el operando fuente es de tipo byte,
el resultado se almacena en AX y si es de tipo palabra el resultado se
almacena en AX la parte inferior y en DX la palabra superior.
Si tipo fuente = byte:
AX = AL * fuente (multiplicacin sin signo)
Si tipo fuente = palabra:
DX, AX = AX * fuente (multiplicacin sin signo)
Si mitad superior (CF: acarreo) del resultado = 0
En CC CF = 1
IMUL operando: multiplica considerando el signo.
DIV operando: divide sin considerar el signo, un nmero contenido en el
acumulador entre el operando fuente. El cociente se almacena en el
acumulador. El resto se almacena en la extensin del acumulador. Si la
extensin de AX ser DX (que ocurrir cuando sea de tipo palabra), la
operacin y la extensin de AL ser AH.

IDIV operando: igual que el DIV pero considerando el signo.
CBW: pasa de byte a palabra el contenido del acumulador.
CWD: pasa de palabra a doble palabra el contenido del acumulador.
INC destino: incrementa el destino.
DEC destino: decrementa el destino.
Bibliografa:
http://www.uhu.es/tomas.mateo/ac2/manual%20ensamblador%20UHU.pdf

2.10 MANIPULACIN DE LA PILA
Todo programa escrito en el lenguaje ensamblador del 8086 requiere de
una pila. La pila se emplea para almacenar temporalmente direcciones y
datos. En los programas hechos para el microprocesador 8086, una pila es
un arreglo de palabras. El tamao de la pila lo establece el programador
mediante la directiva stack en el cdigo de inicio de un programa. Tal
como se estudi en el tema 3, la directiva stack cuya sintaxis es:
stack tamPila
Crea una pila para el programa de tamao tampila. El cargador del
programa inicializa en forma automtica el registro de segmento de pila SS
a la direccin del segmento en que se cre la pila y el registro apuntador
de pila SP al valor de tamPila. La figura 6.1 muestra el estado inicial de la
pila de un programa al ser cargado a memoria para su ejecucin (la pila
se encuentra vaca).

Note que el registro apuntador de pila SP apunta a la palabra que est
pasando el final de la pila. La pila difiere de los otros segmentos en la
manera en que almacena los datos: empieza en la localidad ms alta (la
que tiene la direccin dada por SS:tamPila-2) y almacena los datos hacia
las localidades ms bajas de la pila (hacia SS:0000).



Instrucciones para el manejo de la pila

El ensamblador del 8086 posee un conjunto de instrucciones especiales
para insertar y extraer datos en la pila:

push fuente

Transfiere el valor dado por fuente a la pila del programa.
Sintaxis:

push regW|memW

Donde regW puede ser cualquiera de los registros de propsito general o
de segmento.

La instruccin push transfiere una palabra a la pila del programa. La
instruccin push primero decrementa el valor del registro apuntador de pila
SP en dos. A continuacin copia el valor especificado por su operando a
la localidad cuya direccin est dada por SS:SP. Note que esto hace que
la pila crezca hacia las direcciones ms pequeas de memoria.

La instruccin push no afecta a las banderas.

pop destino

Extrae un valor del tope de la pila del programa y lo almacena en destino.

Sintaxis:

pop regW|memW

Donde regW puede ser cualquiera de los registros de propsito general o
de segmento excepto el registro de segmento de cdigo CS, que no est
permitido. La instruccin pop extrae una palabra de la localidad cuya
direccin est dada por SS:SP (el tope de la pila del programa) y lo
almacena en la localidad especificada por el operando. A continuacin
incrementa el valor del registro apuntador de pila SP en dos.

La instruccin pop no afecta a las banderas.

En la figura 6.2 se muestran los estados de la pila despus de insertar los
valores de los registros AX y BX mediante la instruccin push y en la figura
6.3 se muestran los estados de la pila despus de extraer esos valores de la
pila mediante la instruccin pop al ejecutar el siguiente fragmento de
cdigo:

mov ax, 0123h
mov bx, 4567h
push ax
push bx
pop bx
pop ax

Note en la figura 6.3a que al extraer el valor 4567h de la pila, ste no se
elimina fsicamente de la pila. Sin embargo no hay una garanta de que
ese valor permanezca en la pila. Si en ese momento insertamos un nuevo
valor en la pila, ste se escribir en la localidad SS:tamPila-4
sobrescribiendo el valor de 4567h.

pushf

Transfiere el registro de banderas a la pila del programa.

Sintaxis:

pushf

La instruccin pushf transfiere el contenido del registro de banderas a la
pila del programa de la misma manera en la que opera la instruccin push.

La instruccin pushf no afecta a las banderas.




popf

Extrae un valor del tope de la pila del programa y lo almacena en registro
de banderas.

Sintaxis:

popf

La instruccin popf extrae una palabra del tope de la pila y la inserta en el
registro de banderas de la misma manera en que trabaja la instruccin
pop. Normalmente se hace esto para extraer el estado de las banderas
almacenado previamente por una instruccin pushf, o para fijar las
banderas a nuevos valores.

La instruccin popf afecta todas las banderas
Bibliografa:
http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r90594.PDF

2.11 OBTENCIN DE CADENA CON REPRESENTACIN DECIMAL
En las computadoras el formato natural para la aritmtica es el binario.
La representacin del nmero decimal 1; 527 en los tres formatos
decimales:
. ASCII 31 35 32 37 (cuatro bytes)
. BCD desempaquetado 01 05 02 07 (cuatro bytes)
. BCD empaquetado 15 27 (dos bytes)
El procesador realiza aritmtica en valores ASCII y BCD un dgito a la vez.
Ya que los datos son ingresados desde un teclado signi_can que estn en
formato ASCII, la representacin en memoria de un nmero decimal
ingresado tal como 1234 es 31323334H. Pero realizar aritmtica sobre tal
nmero implica un tratamiento especial. Las instrucciones AAA y AAS
realizan aritmtica de manera directa sobre nmeros ASCCI.

2.12 INSTRUCCIONES LGICAS
Se usan para realizar operaciones a nivel de bits.
NOT operando: cambia los bits 1 por 0 y viceversa y devuelve el resultado
en el mismo operando.
AL = F2h AL 1111 0010
NOT AL; NOT AL 0000 1101 = Odh

OR destino, fuente: operacin o lgico inclusivo. El resultado se
almacena en destino.
AX = FEDCh= 1111 1110 1101 1100
BX = 1234 h = 0001 0010 0011 0100
OR AX, BX 1111 1110 1111 1100 = FEFC h

AND destino, fuente: la operacin Y lgica entre 2 operandos, el
resultado se deja en destino.
AX = FEDC h 1111 1110 1101 1100
BX = 1234 h 0001 0010 0011 0100
ADD AX, BX 0001 0010 0001 0100 = 1214 h

XOR destino, fuente: la operacin o lgico exclusiva; el resultado se deja
en destino.
AX = FEDC h 1111 1110 1101 1100
BX = 1234 h 0001 0010 0011 0100
XOR AX, BX 1110 1100 1110 1000 = ECE8 h

Bibliografa:
http://www.uhu.es/tomas.mateo/ac2/manual%20ensamblador%20UHU.pdf

2.13 DESPLAZAMIENTO Y ROTACIN
INSTRUCCIONES DE DESPLAZAMIENTO O CORRIMIENTO DE BITS.
Las instrucciones de corrimiento, que son parte de la capacidad lgica de
la computadora, pueden realizar las siguientes acciones:
1. Hacer referencia a un registro o direccin de memoria.
2. Recorre bits a la izquierda o a la derecha.
3. Recorre hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una
palabra doble.
4. Corrimiento lgico (sin signo) o aritmtico (con signo).

El segundo operando contiene el valor del corrimiento, que es una
constante (un valor inmediato) o una referencia al registro CL. Para los
procesadores 8088/8086, la constante inmediata solo puede ser 1; un valor
de corrimiento mayor que 1 debe estar contenido en el registro CL.
Procesadores posteriores permiten constantes de corrimiento inmediato
hasta 31.
El formato general para el corrimiento es
| [etiqueta:] | Corrim. | {registro/memoria},
{CL/inmediato} |

DESPLAZAMIENTO O CORRIMIENTO DE BITS HACIA LA DERECHA.
Los corrimientos hacia la derecha (SHR y SAR) mueven los bits hacia la
derecha en el registro designado. El bit recorrido fuera del registro mete la
bandera de acarreo. Las instrucciones de corrimiento a la derecha
estipulan datos lgicos (sin signo) o aritmticos (con signo):

Las siguientes instrucciones relacionadas ilustran SHR y datos con signo:

INSTRUCCION COMENTARIO
MOV CL, 03
MOV AL, 10110111B ; AL = 10110111
SHR AL, 01 ; AL = 01011011 Un corrimiento a la derecha
SHR AL, CL ; AL = 00001011 Tres corrimientos adicionales a la
derecha

El primer SHR desplaza el contenido de AL un bit hacia la derecha. El bit de
mas a la derecha es enviado a la bandera de acarreo, y el bit de mas a la
izquierda se llena con un cero. El segundo SHR desplaza tres bits ms a AL.
La bandera de acarreo contiene de manera sucesiva 1, 1 y 0; adems, tres
bits 0 son colocados a la izquierda del AL.
SAR se difiere de SHR en un punto importante: SAR utiliza el bit de signo
para llenar el bit vacante de ms a la izquierda. De esta manera, los
valores positivos y negativos retienen sus signos. Las siguientes instrucciones
relacionadas ilustran SAR y datos con signo en los que el signo es un bit 1:
En especial, los corrimientos a la derecha son tiles para (dividir entre 2)
obtener mitades de valores y son mucho ms rpidas que utilizar una
operacin de divisin. Al terminar una operacin de corrimiento, puede
utilizar la instruccin JC (Salta si hay acarreo) para examinar el bit
desplazado a la bandera de acarreo.
DESPLAZAMIENTO O CORRIMIENTO DE BITS A LA IZQUIERDA.
Los corrimientos hacia la izquierda (SHL y SAL) mueven los bits a la
izquierda, en el registro designado. SHL y SAL son idnticos en su operacin.
El bit desplazado fuera del registro ingresa a la bandera de acarreo. Las
instrucciones de corrimiento hacia la izquierda estipulan datos lgicos (sin
signo) y aritmticos (con signo):
SHL: Desplazamiento lgico a la izquierda SAL: Desplazamiento
aritmtico a la izquierda

Las siguientes instrucciones relacionadas ilustran SHL para datos sin signo:
INSTRUCCION COMENTARIO
MOV CL, 03
MOV AL, 10110111B ; AL = 10110111
SHL AL, 01 ; AL = 01101110 Un corrimiento a la izquierda
SHL AL, CL ; AL = 01110000 Tres corrimientos mas

El primer SHL desplaza el contenido de AL un bit hacia la izquierda. El bit de
ms a la izquierda ahora se encuentra en la bandera de acarreo, y el
ltimo bit de la derecha del AL se llena con cero. El segundo SHL desplaza
tres bits ms a AL. La bandera de acarreo contiene en forma sucesiva 0, 1
y 1, y se llena con tres ceros a la derecha del AL.
Los corrimientos a la izquierda llenan con cero el bit de mas a la derecha.
Como resultado de esto, SHL y SAL don idnticos. Los corrimientos a la
izquierda en especial son tiles para duplicar valores y son mucho ms
rpidos que usar una operacin de multiplicacin.
Al terminar una operacin de corrimiento, puede utilizar la instruccin JC
(Salta si hay acarreo) para examinar el bit que ingreso a la bandera de
acarreo.
ROTACION DE BITS (DESPLAZAMIENTO CIRCULAR)
Las instrucciones de rotacin, que son parte de la capacidad lgica de la
computadora, pueden realizar las siguientes acciones:
1. Hacer referencia a un byte o a una palabra.
2. Hacer referencia a un registro o a memoria.
3. Realizar rotacin a la derecha o a la izquierda. El bit que es desplazado
fuera llena el espacio vacante en la memoria o registro y tambin se copia
en la bandera de acarreo.
4. Realizar rotacin hasta 8 bits en un byte, 16 bits en una palabra y 32 bits
en una palabra doble.
5. Realizar rotacin lgica (sin signo) o aritmtica (con signo).

El segundo operando contiene un valor de rotacin, el cual es una
constante (un valor inmediato) o una referencia al registro CL. Para los
procesadores 8088/8086, la constante inmediata solo puede ser 1; un valor
de rotacin mayor que 1 debe estar contenido en el registro CL.
Procesadores posteriores permiten constantes inmediatas hasta el 31. El
formato general para la rotacin es:
| [etiqueta:] | Rotacin | {registro/memoria},
{CL/inmediato} |


ROTACIN A LA DERECHA DE BITS
Las rotaciones a la derecha (ROR y RCR) desplazan a la derecha los bits en
el registro designado. Las instrucciones de rotacin a la derecha estipulan
datos lgicos (sin signo) o aritmticos (con signo):


Las siguientes instrucciones relacionadas ilustran ROR:
INSTRUCCION COMENTARIO
MOV CL, 03
MOV BH, 10110111B ; BH = 10110111
ROR BH, 01 ; BH = 11011011 Una rotacin a la derecha
ROR BH, CL ; BH = 00001011 Tres rotaciones a la derecha

El primer ROR desplaza el bit de ms a la derecha del BH a la posicin
vacante de ms a la izquierda. La segunda y tercera operaciones ROR
realizan la rotacin de los tres bits de mas a la derecha.
RCR provoca que la bandera de acarreo participe en la rotacin. Cada
bit que se desplaza fuera de la derecha se mueve al CF y el bit del CF se
mueve a la posicin vacante de la izquierda.
ROTACIN A LA IZQUIERDA DE BITS
Las rotaciones a la izquierda (ROL y RCL) desplazan a la izquierda los bits
del registro designado. Las instrucciones de rotacin a la izquierda
estipulan datos lgicos (sin signo) y aritmticos (con signo):


Las siguientes instrucciones relacionadas ilustran ROL:
INSTRUCCION COMENTARIO
MOV CL, 03
MOV BL, 10110111B ; BL = 10110111
SHR BL, 01 ; BL = 11011011 Una rotacin a la izquierda
SHR BL, CL ; BL = 00001011 Tres rotaciones a la izquierda
El primer ROL desplaza el bit de ms a la izquierda del BL a la posicin
vacante de ms a la derecha. La segunda y tercera operaciones ROL
realizan la rotacin de los tres bits de ms a la izquierda.
De manera similar a RCR, RCL tambin provoca que la bandera de
acarreo participe en la rotacin. Cada bit que se desplaza fuera por la
izquierda se mueve al CF, y el bit del CF se mueve a la posicin vacante de
la derecha.
Puede usar la instruccin JC (salta si hay acarreo) para comprobar el bit
rotado hacia la CF en el extremo de una operacin de rotacin.
Bibliografa:
http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r90594.PDF

2.14 OBTENCIN DE UNA CADENA CON LA REPRESENTACIN HEXADECIMAL
Procedimiento para leer cadenas.
PUBLIC LeeCadena
PROC LeeCadena
and cl,cl ;Es CL = 0 ?
jz @@99 ;si, sale
push ax ;Salva registros usados.
push bx
push dx
push si
mov [Buffer.maxlon],cl ;Pone byte de largo mximo
mov ah,0ah ;Entrada de cadenas con DOS
mov dx,offset Buffer.maxlon ;DS:DX apunta a la estructura
int 21h ;DOS captura la cadena
xor bh,bh ;Parte alta de BX a cero
mov bl,[Buffer.cadlon] ;BX = nmero de caracteres en el Buffer
mov [bx + Buffer.carac],ASCnulo ;Cambia RC a ASCII nulo (0)
mov si,offset Buffer.carac ;Apunta al buffer con SI
call CopiaCad ;Copia cadena al buffer del ;usuario
pop si ;Repone registros
pop dx bx ax

@@99:

ret ;Regresa a programa fuente

ENDP LeeCadena

Mediante este procedimiento se introducir el nmero a convertir.

Utilizaremos la interrupcin 21H, servicio 0AH para introducir caracteres por
el teclado y para capturar la cadena oprimimos RETURN.

Bibliografa:
http://www.itescam.edu.mx
2.15 CAPTURA Y ALMACENAMIENTO DE DATOS NUMRICOS
Un procesador (llamados indistintamente as, "microprocesadores" o incluso
simplemente "micros") contiene en su interior pequeos dispositivos que
pueden almacenar nmeros de cierta cantidad de bits, denominados
registros. Ah guardar la informacin que vaya a manejar temporalmente,
para luego, si procede, guardarla en memoria, en el disco duro, o donde
sea. En el caso de los 80x86 los registros bsicos son de 16 bits, por lo que en
uno de estos registros podemos escribir cualquier nmero desde el 0 hasta
el 2^N - 1, es decir, desde 0000000000000000b hasta 1111111111111111b.
Sin embargo, siguiendo este razonamiento, slo hemos determinado cmo
representar nmeros enteros positivos. Qu pasa con nmeros como -184
o incluso 3.141592?
-Aritmtica de enteros
Vamos a ver cmo operar con nmeros en binario para entender la
importancia del sistema de representacin que se emplee. La suma/resta
de enteros positivos en binario es idntica a cuando empleamos
representacin decimal, pero con unas regla mucho ms sencillas:
0+0=0
0+1=1
1+0=1
1+1=0 y me llevo 1

0-0=0
0-1=1 y me llevo 1
1-0=1
1-1=0
Por ejemplo, sumando/restando 10101 + 110:
llevadas:

1

1 1 1


1 0 1 0 1

1 0 1 0 1
SUMA +

1 1 0 RESTA -

1 1 0

- - - - -

- - - - -

1 1 0 1 1

0 1 1 1 1
Las "llevadas" se conocen como bits de acarreo o, en ingls, de carry.
Si representamos nmeros con un mximo nmero de bits, puede darse el
caso de que al sumarlos, el resultado no quepa. Con cuatro bits
1111+1=10000, dando un resultado de 5 bits. Como slo nos podemos
quedar con los cuatro ltimos, el carry se pierde. En un ordenador el carry
se almacena en un sitio aparte para indicar que nos llevbamos una pero
no hubo dnde meterla, y el resultado que se almacena es, en este caso,
0000. Salvo que se diga lo contrario, si el resultado de una operacin no
cabe en el registro que lo contiene, se trunca al nmero de bits que toque.
Un modo de representar tanto nmeros negativos como positivos, sera
reservar un bit (el de mayor peso, por ejemplo) para indicar positivo o
negativo. Una posible representacin de +13 y -13 con registros de ocho
bits:
00001101 +13
10001101 -13
Para sumar dos nmeros miraramos los bits de signo; si son los dos
negativos o positivos los sumamos y dejamos el bit de signo como est, y si
hay uno negativo y otro positivo, los restamos, dejando el bit de signo del
mayor. Si quisiramos restarlos haramos algo parecido, pero considerando
de manera distinta los signos. Cmo primer mtodo no est mal, pero es
mejorable. Saber si un nmero es negativo o positivo es tan sencillo como
mirar el primer bit, pero hay que tener en cuenta que esas comparaciones
y operaciones las tiene que hacer un sistema electrnico, por lo que
cuanto ms directo sea todo mejor. Adems, tenemos dos posibles
representaciones para el cero, +0 y -0, lo cual desperdicia una
combinacin de bits y, lo que es peor, obliga a mirar dos veces antes de
saber si el resultado es 0. Una manera muy usada de comprobar si un
nmero es igual a otro es restarlos; si la resta da cero, es que eran iguales. Si
hemos programado un poco por ah sabremos que una comparacin de
este tipo es terriblemente frecuente, as que el mtodo no es del todo
convincente en este aspecto.
La representacin en complemento a dos cambia el signo a un nmero de
la siguiente manera: invierte todos los bits, y suma uno. Con nuestro querido
+13 como 00001101b, hacemos lo siguiente: al invertir los bits tenemos
11110010b, y si sumamos 1, 11110011b. Ya est, -13 en complemento a dos
es 11110011.
Molaba ms cambiar el signo modificando un bit, es cierto, pero veamos la
ventaja. Qu pasa cuando sumamos +13 y -13, sin tener en cuenta signos
ni ms milongas?
00001101
11110011
--------
00000000
Efectivamente, cero. Para sumar nmeros en complemento a dos no hace
falta comprobar el signo. Y si uno quiere restar, no tiene ms que cambiar
el signo del nmero que va restando (inviertiendo los bits y sumando uno), y
sumarlos. Fcil, no? Lo bueno es que con este mtodo podemos hacer
que el primer bit siga significando el signo, por lo que no hace falta
mayores comprobaciones para saber si un nmero es positivo o negativo.
Si seguimos con ocho bits tenemos que los nmeros ms altos/bajos que se
pueden representar son 0111111b (127) y 10000000 (-128) En general, para
N bits, podremos almacenar cualquier nmero entre 2^(N-1) - 1 y -2^(N-1).
Es un buen momento para introducir el concepto
de overflow (desbordamiento, aunque no tan comn en espaol) Cuando
al operar con dos nmeros el resultado excede el rango de
representacin, se dice que ha habido overflow. Esto es sutilmente
diferente a lo que suceda con el carry. No es que "nos llevemos una", es
que el resultado ha producido un cambio de signo. Por ejemplo, la suma
de 10010010 + 10010010, si consideramos ambos nmeros con su signo (-
110d + -110d), nos da como resultado 00100100, 36d. Ahora el resultado ya
no es negativo, porque hemos "dado la vuelta al contador", al exceder -
128 en la operacin. Los procesadores tambin incluyen un indicador que
se activa con estas situaciones, pero es tarea del programador comprobar
los indicadores, y saber en todo momento si trabajamos dentro del rango
correcto.
Una ventaja adicional del complemento a dos es que operamos
indistintamente con nmeros con signo o sin l, es decir, si queremos
podemos utilizar todos los bits para representar nmeros positivos
exclusivamente (de 0 a 2^N - 1), haciendo exactamente las mismas
operaciones. El que un nmero sea entero positivo o entero con signo
depende nicamente de la interpretacin que haga el programador del
registro; tendr que comprobar, si fuera necesario, los bits de overflow y
carry para operar correctamente segn sus intereses.
Las multiplicaciones/divisiones se pueden descomponer en una retahla de
sumas y restas, por lo que no merece la pena ahondar demasiado;
responden a consideraciones similares, salvo que el producto de N bits por
N bits da, en general, 2N bits, y que ahora s que habr que especificar si la
operacin va a ser entre nmeros con o sin signo.
-Nmeros reales
La forma ms simple de representacin de nmeros reales es sin duda la
de punto fijo (o coma fija, segn digas usar una cosa u otra para separar
las cifras). La idea consiste en plantar un punto entre los bits, y ya est.
Ejemplo:
1110.0111b
El peso de las cifras a la izquierda del punto son las mismas que para
enteros, mientras que a la derecha el peso sigue disminuyendo en
potencias de dos.. pero negativas.
1110.0111b = 1*2^3 + 1*2^2 + 1*2^1 + 0*2^0 + 0*2^(-1) + 1*2^(-2) + 1*^2(-3)
+1*2^(-4)
Como 2^(-N) = 1/(2^N) tenemos que los pesos son 0.5, 0.25, 0.125 etc
1110.0111b = 8 + 4 + 2 + 0 + 0 + 0.25 + 0.125 + 0.0625 = 14.4375
que no es ms que coger el nmero 11100111b, pasarlo a decimal, y
dividirlo entre 2^P, siendo P el nmero de cifras a la derecha del punto. Se
opera exactamente igual que con enteros (podemos dejar un bit de signo
si nos apetece, haciendo complemento a dos), siempre que los dos
operandos tengan no slo el mismo nmero de bits, sino el punto en el
mismo sitio. Podemos seguir usando nuestra calculadora de enteros para
manejar reales si decidimos usar este mtodo.
Algunos dispositivos de clculo, especialmente de procesado de seal,
usan este sistema por su sencillez y velocidad. La "pega" es la precisin.
Ahora no slo tenemos que intentar "no pasarnos" del nmero de bits por
exceso, sino que las potencias negativas limitan nuestra precisin "por
abajo". Un nmero como 1/3 (0.3333 etc) podemos intentar expresarlo en
los 8 bits de arriba, pero nos encontraremos con que el nmero de
potencias dos negativas necesarias para hacerlo nos sobrepasan
ampliamente (infinitas).
0000.0101 es lo mejor que podemos aproximar, y sin embargo tenemos un
nmero tan feo como 0.3125 El problema no es tanto el error como el error
relativo. Cometer un error de aproximadamente 0.02 puede no ser grave si
el nmero es 14 (0.02 arriba o abajo no se nota tanto), pero si se trata de
0.3333.., s.
Los nmeros en punto flotante (o coma flotante) amortiguan este
problema complicando un poco (un mucho) las operaciones. Parecer
muy muy engorroso, pero es lo que se usa mayormente en ordenadores,
as que algo bueno tendr.
Vamos con un primer intento con anestesia, para no marear demasiado.
Digamos que de los 8 bits de antes (que, de todos modos, son muy
poquitos; lo normal en nmeros reales es 32,64,80..) dedicamos 2 a decir
cunto se desplaza el punto, y los 6 restantes a almacenar el nmero
propiamente.
Un nmero tal que 11011110 que representase a un nmero real estara en
realidad compuesto por 1.10111 y 10, o sea, 3.4375 y 2; el dos indica
posiciones desplazadas (potencias de 2), as que el nmero en cuestin
sera 3.4375 * 2^2 = 13.75 Podramos an as representar un nmero tan
pequeo como 0.03125, 0.03125*2^0, con "0.00001 00", o sea, 00000100
Hemos ampliado el margen de representacin por arriba y por abajo, a
costa de perder precisin relativa, es cierto, pero hacindola ms o menos
constante en todo el rango, porque cada nmero se puede escribir con 6
cifras binarias ya est el punto un poco ms a la izquierda o a la derecha.
La parte que representa las cifras propiamente se denomina mantisa, y en
este caso los dos bits separados forman el exponente.
El estndar IEEE 754 describe cmo almacenar nmeros en punto flotante
de manera un poco ms profesional que todo esto. Para 32 bits se dedican
8 para el exponente, 23 para la mantisa y 1 para el signo. Se trabaja slo
con nmeros positivos y bit de signo aparte porque dada la complejidad
de las operaciones con nmeros reales, no hay ninguna ventaja
importante en usar cualquier otra cosa. En este formato el exponente se
calcula de modo que la mantisa quede alineada con un uno a la
izquierda de todo, y este primer uno no se almacena. El exponente
adems se guarda en "exceso 127", que consiste en restarle 127 al nmero
almacenado: si la parte del exponente fuese 11011111b = 223d, al restarle
127 tendramos el exponente que representa, 96. Vamos con un ejemplo:
signo exponente mantisa
1 0111 0101 101 0101 0110 1110 1110 0011
El bit de signo es 1, as que tenemos un nmero negativo. La mantisa es
1.10101010110111011100011, porque el primer '1' se sobreentiende siempre,
ya que al almacenar el nmero se alter el exponente para alinearlo as; el
valor decimal de este nmero es "1.66744649410248". El exponente es
01110101b = 117d, es decir, -10 porque en exceso 127 se le resta esta
cantidad. El nmero representado es -1.66744649410248*2^-10 = -
0.0016283657169 ms o menos (suponiendo que no me haya confundido).
Las operaciones con nmeros en punto flotante son mucho ms
complejas. Exigen comprobar signos, exponentes, alinear las mantisas,
operar, normalizar (esto es, desplazar la mantisa / modificar el exponente
para que quede alineada con ese primer "1" asomando).. Sin embargo
existen circuitos especficos dentro de los procesadores para realizar estos
tejemanejes, e incluso para calcular races cuadradas, funciones
trigonomtricas... Lo que sucede es que son bastante ms lentos, como era
de esperar, que los clculos con enteros, por lo que se separan unas y otras
operaciones segn el tipo de datos que vayamos a manejar. El estndar
mencionado admite nmeros especiales como +infinito, -infinito y NaN (Not
a Number), con los que es posible operar. Por ejemplo,
infinito+infinito=infinito, mientras que infinito-infinito es una indeterminacin,
y por tanto, NaN.
-Codificacin BCD
BCD viene de Binary Code Digit, o dgito en cdigo binario, y es una
manera alternativa de codificar nmeros. Consiste en algo tan simple
como dividir el nmero en sus dgitos decimales, y guardar cada uno en 4
bits. Por ejemplo, el nmero 1492 se almacenara en como mnimo 16 bits,
resultando el nmero 1492h, o 0001 0100 1001 0010b (separo las cifras
binarias de 4 en 4 para que se vea mejor). As, sin ms, se desperdicia un
poco de espacio ya que no tienen cabida los seis nibbles 1010, 1011, 1100,
1101, 1110, y 1111 (el nmero ms grande representable as en 16 bits es
9999), por lo que a veces se emplean estas combinaciones extra para el
signo, un punto, una coma, etc.
La ventaja de este modo de almacenar nmeros es que la conversin a
decimal es inmediata (cada grupo de 4 bits tiene una correspondencia),
mientras que si nos limitsemos a guardar el nmero que representa
almacenado en binario el procedimiento sera ms costoso. Con la
potencia de cmputo de que se dispone ahora, y dado que las
conversiones slo son necesarias para representar la informacin final para
que la lea un humano, puede parecer de escasa utilidad, pero en
dispositivos en los que estas operaciones son tan frecuentes como
cualquier otra, compensa especializar determinados circuitos a su
manipulacin. Algunas posibles aplicaciones podran ser terminales "tontos"
de banca, o calculadoras. Un caso claro de esta ltima podran ser
algunas calculadoras HP basadas en el microprocesador Saturn que tiene
un modo de funcionamiento completamente en BCD. De hecho los
nmeros reales los almacena en BCD en 64 bits, formando 16 dgitos: uno
para el signo, 12 para la mantisa, y 3 para el exponente. El BCD no ser, sin
embargo, la representacin ms habitual.
Existen dos tipos de formatos BCD: el conocido como empaquetado, con 2
dgitos en cada byte (que, recordemos, es con frecuencia la mnima
unidad "prctica" en un procesador), y desempaquetado, con un dgito
por byte (dejando siempre los 4 bits superiores a cero).
-Texto, sonido, imgenes
Queda ver cmo se manejan en un sistema digital otros datos de uso
frecuente. Generalmente la unidad mnima de almacenamiento es el byte,
y por ello la codificacin ms habitual para texto asigna un byte a cada
carcter considerado til, hasta formar una tabla de 256 correspondencias
byte-carcter. Los que determinaron semejante lista de utilidad fueron,
como casi siempre, americanos, en lo que se conocen como cdigos
ASCII. Como dejaron fuera del tintero algunos caracteres extranjeros, ees,
tildes variopintas, etc, surgieron numerosas variantes. Realmente los
primeros 128 caracteres (los formados con los siete bits menos significativos,
y el octavo bit a cero) son comunes a todas ellas, mientras que los 128
siguientes forman los caracteres ASCII extendidos, que son los que incluyen
las peculiaridades.
Si alguien tiene una ligera nocin de lo que hacen los chinos, rabes o
japoneses, se dar cuenta de que con 256 caracteres no hacen nada ni
por el forro. A fin de hacer un nico cdigo universal surgi el UNICODE,
que es con el que deberan almacenarse todos los textos, aunque por
desgracia no sea as. Sin embargo tiene una implantacin cada vez
mayor, aunque a un paso un poco lento. Si bien tiene unas pequeas
reglas que no hacen la correspondencia directa cdigo -> carcter, se
podra decir grosso modo que cada carcter se representa con 2 bytes, y
no uno, dando lugar a, en principio, 65536 caracteres distintos, dentro de
los cuales, por supuesto, se incluye la tablita ASCII.
El sonido se produce cuando una tensin variable con el tiempo llega a un
altavoz, convirtiendo esas variaciones de tensin en variaciones de presin
en el aire que rodea a la membrana. Para almacenar audio se toman
muestras peridicas del valor de dicha tensin (cuando se graba sucede al
revs; son las variaciones de presin sobre el micrfono las que producen
el voltaje mencionado), guardando ese valor. La precisin con que se
grabe el sonido depende del nmero de muestras que se tomen por
segundo (tpicamente 8000, 22050 44100) y de los bits que se empleen
para cada muestra (con frecuencia 8 16). De este modo, para grabar 1
minuto de audio a 44100 muestras por segundo, en estreo (dos canales), y
16 bits, necesitaremos 60*44100*2*16 bits, es decir, 10 megabytes
aproximadamente. Existen formatos de audio que toman esas muestras y
las comprimen aplicando un determinado algoritmo que, a costa de
perjudicar ms o menos la calidad, reducen el espacio ocupado. Un
archivo ".wav" corresponde, generalmente, a un simple muestreo del
audio, mientras que uno ".mp3" es un formato comprimido.
Para las imgenes lo que hacen es muestrear en una cuadrcula (cada
cuadrado, un pxel) las componentes de rojo, verde y azul del color, y
asignarles un valor. Un archivo ".bmp" por ejemplo puede asignar 3 bytes a
cada pxel, 256 niveles para cada color. Se dice entonces que la calidad
de la imagen es de 24 bits. Una imagen de 800 pxels de ancho por 600 de
alto ocupara 800*600*24 bits, casi 1.4 megas. De nuevo surgen los formatos
comprimidos como ".gif",".png",".jpg".. que hace que las imgenes ocupen
mucho menos espacio.
Bibliografa:
http://www.rinconsolidario.org/eps/asm8086/CAP0.html#SISNUM
2.16 OPERACIONES BSICAS SOBRE ARCHIVOS DE DISCO
Existen dos formas de trabajar con archivos, la primera es por medio de
bloques de control de archivos o "FCB" y la segunda es por medio de
canales de comunicacin, tambien conocidos como "handles".
La primera forma de manejo de archivos se viene utilizando desde el
sistema operativo CPM, antecesor del DOS, por lo mismo asegura cierta
compatibilidad con archivos muy antiguos tanto del CMP como de la
versin 1.0 del DOS, adems este mtodo nos permite tener un nmero
ilimitado de archivos abiertos al mismo tiempo. Si se quiere crear un
volumen para el disco la nica forma de lograrlo es utilizando este mtodo.
An considerando las ventajas del FCB el uso de los canales de
comunicacin es mucho ms sencillo y nos permite un mejor manejo de
errores, adems, por ser ms novedoso es muy probable que los archivos
as creados se mantengan compatibles a travs de versiones posteriores
del sistema operativo.
Para una mayor facilidad en las explicaciones posteriores me referir a el
mtodo de bloques de control de archivos como FCBs y al mtodo de
canales de comunicacin como handles.
Introduccin
Existen dos tipos de FCB, el normal, cuya longitud es de 37 bytes y el
extendido de 44 bytes. En este tutorial unicamente se tratar el primer tipo,
as que de ahora en adelante cuando me refiera a un FCB realmente estoy
hablando de un FCB de 37 bytes.
El FCB se compone de informacin dada por el programador y por
informacin que toma directamente del sistema operativo. Cuando se
utilizan este tipo de archivos unicamente es posible trabajar en el directorio
actual ya que los FCB no proveen apoyo para el uso de la organizacin
por directorios del DOS.
El FCB est formado por los siguientes campos:

POSICION LONGITUD SIGNIFICADO
00H 1 Byte Drive
01H 8 Bytes Nombre del archivo
09H 3 Bytes Extensin
0CH 2 Bytes Nmero de bloque
0EH 2 Bytes Tamao del registro
10H 4 Bytes Tamao del archivo
14H 2 Bytes Fecha de creacin
16H 2 Bytes Hora de creacin
18H 8 Bytes Reservados
20H 1 Byte Registro actual
21H 4 Bytes Regsitro aleatorio
Para seleccionar el drive de trabajo se sigue el siguiente formato: drive A =
1; drive B = 2; etc. Si se utiliza 0 se tomar como opcin el drive que se est
utilizando en ese momento.
El nombre del archivo debe estar justificado a la izquierda y en caso de ser
necesario se debern rellenar los bytes sobrantes con espacios, la
extensin del archivo se coloca de la misma forma.
El bloque actual y el registro actual le dicen a la computadora que registro
ser accesado en operaciones de lectura o escritura. Un bloque es un
grupo de 128 registros. El primer bloque del archivo es el bloque 0. El primer
registro es el registro 0, por lo tanto el ltimo registro del primer bloque sera
127, ya que la numeracin inici con 0 y el bloque puede contener 128
registros en total.
Abrir archivos
Para abrir un archivo FCB se utiliza la interrupcin 21H, funcin 0FH. La
unidad, el nombre y extensin del archivo deben ser inicializados antes de
abrirlo.
El registro DX debe apuntar al bloque. Si al llamar a la interrupcin sta
regresa valor de FFH en el registro AH es que el archivo no se encontr, si
todo sali bien se devolvera un valor de 0.
Si se abre el archivo DOS inicializa el bloque actual a 0, el tamao del
registro a 128 bytes y el tamao del mismo y su fecha se llenan con los
datos encontrados en el directorio.
Crear un archivo nuevo
Para la creacin de archivos se utiliza la interrupcin 21H funcin 16H .
DX debe apuntar a una estructura de control cuyos requisitos son que al
menos se encuentre definida la unidad lgica, el nombre y la extensin del
archivo.
En caso de existir algun problema se devolver el valor FFH en AL, de lo
contrario este registro contendr el valor de 0.
Escritura secuencial
Antes de que podamos realizar escrituras al disco es necesario definir el
rea de transferencia de datos utilizando para tal fin la funcin 1AH de la
interrupcin 21H.
La funcin 1AH no regresa ningn estado del disco ni de la operacin, pero
la funcin 15H, que es la que usaremos para escribir al disco, si lo hace en
el registro AL, si ste es igual a cero no hubo error y se actualizan los
campos del registro actual y bloque.
Lectura secuencial
Antes que nada debemos definir el rea de transferencia de archivos o
DTA.
Para leer secuencialmente utilizamos la funcin 14H de la int 21H.
El registro a ser leido es el que se encuentra definido por el bloque y el
registro actual. El registro AL regresa el estado de la operacin, si AL
contiene el valor de 1 o 3 es que hemos llegado al final del archivo. Un
resultado de 2 significa que el FCB est mal estructurado.
En caso de no existir error AL contendr el valor de 0 y los campos bloque
actual y registro actual son actualizados.
Lectura y escritura aleatoria
La funcin 21H y la funcin 22H de la interrupcin 21H son las encargadas
de realizar las lecturas y escrituras aleatorias respectivamente.
El nmero de registro aleatorio y el bloque actual son usados para calcular
la posicin relativa del registro a leer o escribir.
El registro AL regresa la misma informacin que para lectura o escritura
secuencial. La informacin que ser leda se regresar en el rea de
transferencia de disco, as mismo la informacin que ser escrita reside en
el DTA.
Cerrar un archivo
Para cerrar un archivo utilizamos la funcin 10H de la interrupcin 21H.
Si despus de invocarse esta funcin el registro AL contiene el valor de FFH
significa que el archivo ha cambiado de posicin, se cambi el disco o hay
un error de acceso al disco.
Trabajando con handles
El uso de handles para manejar los archivos facilita en gran medida la
creacin de archivos y el programador puede concentrarse en otros
aspectos de la programacin sin preocuparse en detalles que pueden ser
manejados por el sistema operativo.
La facilidad en el uso de los handles consiste en que para operar sobre un
archivo nicamente es necesario definir el nombre del mismo y el nmero
del handle a utilizar, toda la dems informacin es manejada internamente
por el DOS.
Cuando utilizamos este mtodo para trabajar con archivos no existe una
distincin entre accesos secuenciales o aleatorios, el archivo es tomado
simplemente como una cadena de bytes.
Funciones para utilizar handles
Las funciones utilizadas para el manejo de archivos por medio de handles
son descritas en la unidad 6: Interrupciones, en la seccin dedicada a la
interrupcin 21H.
Bibliografa:
http://www.itescam.edu.mx/principal/webalumnos/sylabus/asignatura.php
?clave_asig=SCC-1014&carrera=ISIC-2010-224&id_d=170