VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
UNIDAD 2 PROGRAMACIÓN BASICA
1. Síntesis de información recopilada
Unidad 2
Pérez Camacho Jesús Asmeth
Ingeniería en Sistemas Computacionales,
Instituto Tecnológico de Tuxtla Gutiérrez,
Tuxtla Gutiérrez Chiapas
killerMstr1@gmail.com
Abstract—En este documento se recopila toda la información
sobre la unidad 2 de lenguajes de interfaz y se realiza una breve
y sintetizada descripción de cada subtema que corresponde a la
unidad.
I. INTRODUCCIÓN
Una computadora digital o, mejor dicho, su parte física,
sólo distingue datos de tipo binario, es decir, constituidos por
dos únicos valores a los que se denomina valor 0 y valor 1 y
que, físicamente, se materializan con tensiones comprendidas
entre 0 y 4.0 voltios y entre 4 y 5 voltios, respectivamente.
Para representar datos que contengan una información se
utilizan una serie de unos y ceros cuyo conjunto indica dicha
información.
La información que hace que el hardware de la computadora
realice una determinada actividad de llama instrucción. Por
consiguiente una instrucción es un conjunto de unos y ceros.
Las instrucciones así formadas equivalen a acciones elemen-
tales de la máquina, por lo que al conjunto de dichas instruc-
ciones que son interpretadas directamente por la máquina se
denomina lenguaje máquina.
El lenguaje máquina fue el primero que empleo el hombre
para la programación de las primeras computadoras. Una
instrucción en lenguaje máquina puede representarse de la
siguiente forma:
011011001010010011110110
Esta secuencia es fácilmente ejecutada por la computadora,
pero es de difícil interpretación, siendo aún más difícil la
interpretación de un programa (conjunto de instrucciones)
escrito de esta forma. Esta dificultad hace que los errores sean
frecuentes y la corrección de los mismos costosa, cuando no
imposible, al igual que la verificación y modificación de los
programas.
II. DESARROLLO DE CONTENIDOS
La programación en lenguaje ensamblador ofrece diferentes
ventajas. Un programa escrito en lenguaje ensamblador re-
quiere considerablemente menos memoria y tiempo de ejecu-
ción que un programa escrito en un lenguaje de alto nivel.
La programación en lenguaje ensamblador depende de la
arquitectura del computador sobre el cual se trabaja, esto
es importante para entender el funcionamiento interno de
la máquina, por ello al programar en ensamblador se llega
a comprender cómo funciona el computador y cómo es su
estructura básica. La capacidad de poder escribir programas
en lenguaje ensamblador es muy importante para los profe-
sionales del área de Sistemas Operativos debido a que los
programas residentes y rutinas de servicio de interrupción casi
siempre son desarrollados en lenguaje ensamblador. Además,
aun cuando la mayoría de los especialistas en programación
desarrolla aplicaciones en lenguajes de alto nivel, que son
más fáciles de escribir y de mantener, una práctica común
es codificar en lenguaje ensamblador aquellas rutinas que han
causado cuellos de botella en el procesamiento.
A. Ensamblador (y ligador) a utilizar
El término ensamblador se refiere a un tipo de programa
informático que se encarga de traducir un fichero fuente
escrito en un lenguaje ensamblador, a un fichero objeto que
contiene código máquina, ejecutable directamente por el mi-
croprocesador. El programa lee el fichero escrito en lenguaje
ensamblador y sustituye cada uno de los códigos nemotécnicos
que aparecen por su código de operación correspondiente
en sistema binario para la plataforma que se eligió como
destino en las opciones específicas del ensamblador. Podemos
distinguir entre dos tipos de ensambladores: Ensambladores
básicos. Ensambladores modulares 32-bits o de alto nivel.
Fig. 1. Diagrama de un ligador
Un ligador, es un programa que enlaza todos los progra-
mas o módulos obteniendo lo que denominamos programa
ejecutable. Es un programa que enlaza distintos módulos o
2. programas que poseen subprogramas. Además incorporan las
denominadas rutinas de librerías en caso de solicitarlas el
propio programa. La generación de un módulo ejecutable a
partir de una colección de procedimientos traducidos indepen-
dientemente requiere un ligador. Sus principales funciones son:
Enlazar código intermedio compilado independientemente en
un solo módulo de carga resolviendo las diferencias entre
Tokens. Incorpora las denominadas rutinas de librerías en
caso de solicitarlas el propio programa. Su función es reducir
procedimientos traducidos por separado y enlazarlos para
que se ejecuten como una unidad llamada programa binario
ejecutable.
B. Ciclos numéricos
Un ciclo, conocido también como iteración, es la repetición
de un proceso un cierto número de veces hasta que alguna
condición se cumpla. En estos ciclos se utilizan los brincos
"condicionales" basados en el estado de las banderas. Por
ejemplo la instrucción jnz que salta solamente si el resultado
de una operación es diferente de cero y la instrucción jz que
salta si el resultado de la operación es cero.
Fig. 2. Ejemplo saltos y ciclos
C. Captura básica de cadenas
En el lenguaje ensamblador el tipo de dato cadena (string)
no está definido, pero para fines de programación, una cadena
es definida como un conjunto de localidades de memoria
consecutivas que se reservan bajo el nombre de una variable.
Instrucciones para el manejo de strings Instrucciones para el
manejo de strings El lenguaje ensamblador cuenta con cinco
instrucciones para el manejo de cadenas: MOVS: Mueve un
byte o palabra desde una localidad de memoria a otra. LODS :
Carga desde la memoria un byte en AL o una palabra en AX.
STOS : Almacena el contenido del registro AL o AX en la
memoria. CMPS : Compara localidades de memoria de un byte
o palabra. SCAS : Compara el contenido de AL o AX con el
contenido de alguna localidad de memoria. Las instrucciones
para cadenas trabajan en conjunto con la instrucción CLD, la
cual permite establecer que el sentido en el que las cadenas
serán procesadas será de izquierda a derecha. Otra instrucción
importante es el prefijo de repetición REP, el cual permite que
una instrucción para manejo de cadenas pueda ser repetida
un número determinado de veces. Los registros índice juegan
un papel importante en el procesamiento de cadenas de datos,
el par de registros CS:SI indican la dirección de la cadena
original que será procesada, y el par ES:DI contienen la
dirección donde las cadenas pueden ser almacenadas.
Fig. 3. Captura básica de cadenas
D. Comparación y prueba
Existen dos instrucciones especiales en el microprocesador
8086: CMP y TEST. CMP (Comparar) compara si dos valores
son iguales o diferentes. Su funcionamiento es similar al de
la instrucción SUB (restar), sólo que no modifica el operando
de destino, solamente modifica las banderas de signo (SF),
de cero (ZF) y de acarreo (CF). Por ejemplo: CMP AX,33
Esta instrucción compara si el valor almacenado en el registro
AX es igual que el valor 33 en decimal. Por otro lado, la
instrucción TEST realiza la operación AND de los operandos
especificados sin que el resultado se almacene en algún reg-
istro, modificando únicamente ciertas banderas. Su aplicación
más común es la de probar si algún bit es cero. Por ejemplo:
Test AL,1 Esta instrucción prueba si el bit menos significativo
de AL es 1 y Test AL,128 prueba si el bit más significativo
de AL es 1. Por lo general estas instrucciones van seguidas
de alguna de las instrucciones de salto.
E. Saltos
Se basan completamente en los flags, pero están simplifica-
dos.
Los saltos podrían resumirse en un modo "Basic" de la
manera IF-THEN-GOTO de forma que cuando se cumple una
condición se salta a un sitio determinado.
He aquí los tipos de saltos condicionales (las letras en
mayúsculas son las instrucciones):
JO: Jump if overflow. Salta si el flag de desbordamiento
está a uno
3. Fig. 4. Ejemplo comparación y prueba
JNO: Jump if not overflow. Salta si el flag de desbor-
damiento está acero.
JC, JNAE, JB: Los tres sirven para lo mismo. Significan:
Jump if Carry, Jump if Not Above or Equal y Jump if Below.
Saltan por lo tanto si al haber una comparación el flag de
acarreo se pone a 1; es entonces equivalente a < en una
operación sin signo.
JNC, JAE, JNB: Otros tres que valen exactamente para lo
mismo. Jump if not Carry, Jump if Above or Equal y Jump
if Not Below. Saltan por tanto si al haber una comparación el
flag de acarreo vale 0, o sea, es equivalente al operador >=
El salto sin condiciones, con el que podremos cambiarel
control a cualquier punto del programa. Sería como el "Goto"
del Basic, simplemente transferir el control a otro punto del
programa. La orden esJMP (de Jump, salto) Si se recuerdan
los registros CS:IP, se podrá ver qué es lo que hace realmente
la instrucción, y no es más que incrementar o decrementar IP
para llegar a la zona del programa a la que queremos transferir
el control (IP es el Offset que indica la zona de memoria que
contiene la siguiente instrucción a ejecutar, y CS el segmento).
El formato más sencillo para el salto sería JMP 03424h, lo
que saltaría a esa zona. Pero es algo complejo calcular en qué
dirección va a estar esa instrucción, con lo que utilizaremos
etiquetas.
He aquí un ejemplo:
MOV AX,0CC34h
MOV CL,22h
JMP PALANTE
VUELVE:CMP BX,AX
JMP FIN
PALANTE: MOV BX,AX
JMP VUELVE
FIN: XOR CX,CX
F. Ciclos condicionales
Existen dos tipos de instrucciones de salto: las instrucciones
de salto condicional y las de salto incondicional. Las instruc-
ciones de salto condicional, revisan si ha ocurrido alguna
situación para poder transferir el control del programa a otra
sección.
La siguiente es una lista de las instrucciones de salto
condicional y su descripción:
Fig. 5. Tipos de saltos
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 efectúa 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 efectúa 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 efectúa 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 efectúa 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 efectúa 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 efectúa 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 efectúa 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 efectúa
si SF=OF.
Fig. 6. Ciclos condicionales
G. Incremento y decremento
Son las más básicas a la hora de hacer operaciones con
registros INC:
Incrementar el valor de un registro o de cualquier posición
en memoria, en una unidad y DEC lo decrementa. INC Ax
Incrementa en una el valor de Ax DEC Ax Decrementa Ax,
le resta uno.
Estas 2 instrucciones equivalentes a "a++" , nos serviran
bastante como contadores para bucles.
4. 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.
Fig. 7. Instrucciones aritméticas e incremento y decremento
H. Captura de cadenas con formato
Permiten el movimiento, comparación o búsqueda rápida en
bloques de datos:
MOVC: transferir carácter de una cadena.
MOVW: transferir palabra de una cadena.
CMPC: comparar carácter de una cadena.
CMPW: comparar palabra de una cadena.
SCAC: buscar carácter de una cadena.
SCAW: buscar palabra de una cadena.
LODC: cargar carácter de una cadena.
LODW: cargar palabra de una cadena.
STOC: guardar carácter de una cadena.
STOW: guardar palabra de una cadena.
REP: repetir.
CLD: poner a 0 el indicador de dirección.
STD: poner a 1 el indicador de dirección.
Fig. 8. Orden de captura de cadenas
I. Instrucciones aritméticas
Existen 8 instrucciones aritméticas básicas: ADD (Suma),
SUB (Resta), MUL (Multiplicación sin signo), DIV (División
sin signo), IMUL (Multiplicación con signo), IDIV (División
con signo), INC (Incremento unitario) y DEC (Decremento
unitario). Las instrucciones ADD y SUB permiten realizar
sumas y restas sencillas y tienen el siguiente formato: . ADD
Destino, Fuente . SUB Destino, Fuente Ejemplos:
ADD AX,BX ;AX=AX+BX
ADD AX,10 ;AX=AX+10
SUB AX,BX ;AX=AX-BX
SUB AX,10 ;AX=AX-10
En las operaciones de suma y resta el resultado siempre es
almacenado en el operando de destino, el cual puede ser un
registro o una variable.
Fig. 9. Instrucciones aritméticas
J. Manipulación de la pila
La pila es un grupo de localidades de memoria que se
reservan con la finalidad de proporcionar un espacio para el
almacenamiento temporal de información.
La pila de los programas es del tipo LIFO (Last In First
Out, Último en entrar, Primero en salir).
Para controlar la pila el microprocesador cuenta con dos
instrucciones básicas: Push (Meter) y Pop (sacar).
El formato de estas instrucciones es el siguiente: Push
operando Pop operando Cuando se ejecuta la instrucción Push,
el contenido del operando se almacena en la última posición
de la pila.
Por ejemplo: Si AX se carga previamente con el valor 5,
una instrucción Push AX almacenaría el valor 5 en la última
posición de la pila. Por otro lado la instrucción Pop saca el
último dato almacenado en la pila y lo coloca en el operando.
Siguiendo el ejemplo anterior, la instrucción Pop BX obtendría
el número 5 y lo almacenaría en el registro BX.
K. Obtención de cadena con representación decimal
En las computadoras el formato natural para la aritmética
es el binario. La representación del número decimal 1; 527 en
los tres formatos decimales:
5. ASCII 31 35 32 37 (cuatro bytes)
BCD desempaquetado 01 05 02 07 (cuatro bytes)
BCD empaquetado 15 27 (dos bytes)
El procesador realiza aritmética en valores ASCII y BCD
un dígito a la vez. Ya que los datos son ingresados desde
un teclado significan que están en formato ASCII, la repre-
sentación en memoria de un número decimal ingresado tal
como 1234 es 31323334H. Pero realizar aritmética sobre tal
número implica un tratamiento especial. Las instrucciones
AAA y AAS realizan aritmética de manera directa sobre
números ASCCI
L. Instrucciones lógicas
Las instrucciones lógicas, son utilizadas para realizar op-
eraciones lógicas sobre los operandos.
AND OR NEG TEST NOT XOR AND: Condición de
ejecución y del estado de su bit.
NEG: Genera el complemento a 2.
NOT: Lleva a cabo la negación bit por bit.
OR: Inclusivo lógico.
TEST: Compara lógicamente los operandos.
XOR: OR exclusivo.
Estas trabajan sobre los bits de sus operandos. Para verificar
el resultado de operaciones recurrimos a las operaciones cmp
y test.
Fig. 10. Ejemplo instrucción lógica de saltos
M. Desplazamiento y rotación
Existen muchas operaciones que requieren desplazar valores
de los bits que componen un número a la izquierda o a la
derecha. Los operadores de desplazamiento de bits suelen
utilizarse para llevar a cabo operaciones muy rápidas de
multiplicación y de división de enteros. Un desplazamiento a
la izquierda equivale a una multiplicación por 2 y un desplaza-
miento a la derecha una división por 2. Un desplazamiento no
es una rotación. A medida que se desplazan los bits hacia otro
extremo se van rellenando con ceros por el otro extremo. Los
bits que salen se pierden.
Rotación:
RCL DESTINO,CONTADOR: Rota destino a través de
carry a la izquierda contador veces
RCR DESTINO,CONTADOR: Rota destino a través de
carry a la derecha contador veces
ROL DESTINO,CONTADOR: Rota destino a la izquierda
contador veces
ROR DESTINO,CONTADOR: Rota destino a la derecha
contador veces
SAL DESTINO,CONTADOR: Desplaza destino a la
izquierda contador veces y rellena con ceros
SAR DESTINO,CONTADOR: Desplaza destino a la
derecha contador veces y rellena con bit
SF SHR DESTINO,CONTADOR: Desplaza destino a la
derecha contador veces y rellena con ceros.
NOTA: El DESTINO va a ser la dirección y el CONTADOR
es el número de veces que se retira la instrucción.
Fig. 11. Instrucciones de rotación
N. Obtención de una cadena con la representación hexadec-
imal
Instrucciones de Desplazamiento Lineal AL/SHL (De-
splazamiento aritmético a la izquierda).
Sintaxis:
SAL/SHL destino, contador
Indicadores:
Desplaza a la derecha los bits del operando destino el
número de bits especificado en el segundo operando. Los bits
de la izquierda se rellenan con el bit de signo del primer
operando. Si el número de bits a desplazares 1 se puede
especificar directamente, si es mayor se especifica a través
de CL.
Ejemplos: SAR AX, CL
SAR BP,1
SHR (Desplazamiento lógico a la derecha).
6. Fig. 12. Instrucciones de desplazamiento lineal (obtencion de una cadena con
la representación hexadecimal)
Sintaxis:
SHR destino, contador
Fig. 13. Ejemplo desplazamiento a la derecha
O. Captura y almacenamiento de datos numéricos
Permiten la opción de introducir algún número en un pro-
grama deseado, en el cual dando las instrucciones necesarias
se pueden además de ser capturadas almacenarlas dentro del
programa.
Para la introducción de los datos ya sea numéricos o
carácter es necesario la interacción a través de un dispositivo
como: teclado, ratón, monitor, etc. Los datos se almacenan en
memoria en el orden en que han sido declarados y podemos
acceder a ellos usando el nombre dado en la declaración.
P. Operaciones básicas sobre archivos de disco
Las operaciones basicas que es posibles llevar a cabo sobre
las unidades de disco son:
create (crear)
delete (eliminar)
open (abrir)
close (cerrar)
read (leer)
write (escribir)
append (añadir)
seek (buscar)
get attributes (obtener atributos)
set attributes (establecer atributos)
rename (cambiar nombre)
Fig. 14. Diagrama de operaciones(Ensamblador, ligador, archivos)
III. CONCLUSIÓN
El lenguaje ensamblador es muy complejo y no es sencillo
de aprender, pero el leguaje ensamblador es y seguirá siendo
una de las herramientas de programación más utilizadas por
todas las personas que desean tener un mayor grado de
comprensión sobre el funcionamiento de los dispositivos. Este
lenguaje nos brinda todas las herramientas con las cuales
nosotros podemos innovar y seguir aprendiendo de ello. El
lenguaje ensamblador no ha sido relegado, en la actualidad
existe una gran cantidad de programas ensambladores que nos
permiten programar en ambientes operativos gráficos como
Windows, Linux, iOS, entre otros. [?]
REFERENCES
[1] Brey, B.; Los microprocesadores de Intel: Arquitectura, Programación e
Interfaces; Ed. Prentice Hall; 3ł Edición; 1995.
[2] http://www.infor.uva.es/~cllamas/fi2/fi2-2.pdf
[3] Cecilio Blanco Viejo, Electrónica digital
http://books.google.com.mx/books?id=myOXwYAhOwgC&pg=PA209&dq=MEMORIA+
[4] Rojas, A.; Ensamblador Básico; Ed. Computec; 2ł Edición; 1995.
[5] Raúl Alcaraz Martínez, Aspectos hard-
ware y software del microprocesador 6800
https://books.google.com.mx/books?id=p07XAgAAQBAJ&pg=PA36&dq=ensamblador+