Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2 Fundamentos
2 Fundamentos
Objetivos
1. Saber sobre programación secuenciales que involucren transferencia de datos y
operaciones aritméticas con datos enteros
2. Resolver ejercicios de programación que involucren manipulación de bits
3. Comprender la programación que involucren saltos condicionales y repeticiones
Existe algo de verdad al decir que El lenguaje ensamblador es simple. Este lenguaje se diseñó
para ejecutarse en poca memoria y consiste principalmente en operaciones sencillas de bajo nivel.
Entonces ¿por qué tiene la reputación de ser difícil de aprender? Después de todo, ¿qué tan difícil
puede ser mover datos de un registro a otro y realizar un cálculo? He aquí un ejemplo de un
programa simple en lenguaje ensamblador que suma dos números y muestra el resultado:
Un comentario puede aparecer solo en una línea o a continuación de una instrucción en la misma
línea, como lo muestran los dos ejemplos siguientes:
Ciertas palabras en lenguaje ensamblador están reservadas para sus propósitos propios, y son
usadas solo bajo condiciones especiales. Por categorías, las palabras reservadas incluyen:
• Instrucciones, como MOV, ADD, SUM, MULT, etc que son operaciones que la
computadora puede ejecutar.
• Directivas como END o SEGMENT, que se emplean para proporcionar comandos al
ensamblador.
• Operadores, como FAR y SIZE, que se utilizan en expresiones.
• Símbolos predefinidos, como @Data y @Model, que regresan información a su programa.
El uso de una palabra reservada para un propósito equivocado provoca que el ensamblador
genere un mensaje de error.
1.2.3 Identificadores
Un identificador es un nombre que se aplica a elementos en el programa, variables, constantes,
procedimientos, etc. Un identificador puede usar los siguientes caracteres:
El ensamblador no es sensible al uso de mayúsculas/minúsculas, por lo que una directiva tal como
DWORD podría escribirse como dword, Dword, dWord, etcétera.
En la tabla de Tipos de datos intrínsecos siguiente, ilustra todos los tipos de datos pertenecen a
enteros, excepto los últimos tres, en los que la notación IEEE hace referencia a los formatos de
números reales estándar, publicados por la Sociedad de computadoras del IEEE.
2.2.2 Instrucción de definición de datos
Las instrucciones de definición de datos crean variables con base en los tipos de datos intrínsecos
(tabla previa). Una definición de datos tiene la siguiente sintaxis:
Directiva La directiva en una instrucción de definición de datos puede ser BYTE, WORD, DWORD,
SBYTE, SWORD, o cualquiera de los tipos listados en la tabla mostrada previamente. Además,
puede ser cualquiera de las directivas de definición de datos heredadas que se muestran en la
tabla siguiente, que también soportan los ensambladores NASM y TASM.
Inicializador En una definición de datos se requiere por lo menos un inicializador, aunque sea
cero. Los inicializadores adicionales (si los hay) van separados por comas. Si se prefiere dejar la
variable sin inicializar, puede usar el símbolo ? como inicializador. Todos los inicializadores, sin
importar su formato, se convierten en datos binarios mediante el ensamblador.
Un inicializador de signo de interrogación (?) deja la variable sin inicializar, indicando que se le
asignará un valor en tiempo de ejecución:
valor6 BYTE ?
El nombre opcional es una etiqueta que marca el desplazamiento de la variable, desde el inicio
de su segmento. Por ejemplo, si valor1 se encuentra en el desplazamiento 0000 dentro del
segmento de datos y consume 1 byte de almacenamiento, valor2 se encuentra de manera
automática en el desplazamiento 0001:
valor1 BYTE 10h
valor2 BYTE 20h
La directiva heredada DB puede definir también una variable de 8 bits, con o sin signo:
Dentro de una definición de datos individual, sus inicializadores pueden utilizar distintos tipos de
datos.
Cada carácter utiliza un byte de almacenamiento. Las cadenas son una excepción a la regla que
establece que los valores de bytes deben separarse por comas.
Una cadena puede distribuirse a través de varias líneas, sin tener que suministrar una etiqueta
para cada línea:
Los códigos hexadecimales 0Dh y 0Ah se llaman también CR/LF (retorno de carro/avance de
línea) o caracteres de fin de línea. Cuando se escriben en la salida estándar, desplazan el cursor
hacia la columna izquierda de la línea que sigue a la línea actual.
2.2.3.3 El operador DUP
Este operador asigna almacenamiento para varios elementos de datos, usando una expresión
constante como contador. Puede utilizarse con datos inicializados o sin inicializar:
Arreglo de palabras Para crear un arreglo de palabras se listan los elementos o se usa el
operador DUP. El siguiente arreglo contiene una lista de valores:
A continuación se muestra un diagrama del arreglo en memoria, suponiendo que miLista empieza
en el desplazamiento 0000. Las direcciones se incrementan en 2, ya que cada valor ocupa 2
bytes:
Arreglo de dobles palabras Para crear un arreglo de dobles palabras, se inicializa cada elemento
en forma explícita, o se utiliza el operador DUP. He aquí un arreglo que contiene valores sin signo
específicos:
miLista DWORD 1,2,3,4,5
A continuación se muestra un diagrama del arreglo en memoria, suponiendo que miLista empieza
en el desplazamiento 0000. Los desplazamientos se incrementan por 4:
val1 DT 1000000000123456789Ah
La siguiente tabla describe a cada uno de los tipos reales estándar, en términos de su número
mínimo de dígitos significativos y el rango aproximado:
.data
arregloPequenio DWORD 10 DUP(0) ; 40 bytes
.data?
arregloGrande DWORD 5000 DUP(?) ; 20,000 bytes sin inicializar
Por otro lado, el siguiente código produce un programa compilado que es 20,000 bytes más
grande:
.data
arregloPequenio DWORD 10 DUP(0) ; 40 bytes
arregloGrande DWORD 5000 DUP(?) ; 20,000 bytes
Mezcla de código y datos El ensamblador nos permite cambiar entre el código y los datos en
nuestros
programas. Por ejemplo, tal vez podríamos llegar a necesitar declarar una variable que se utilice
sólo dentro de un área localizada de un programa. El siguiente ejemplo inserta una variable
llamada temp entre dos instrucciones de código:
.code
mov eax,ebx
.data
temp DWORD ?
.code
mov temp,eax
...
Aunque temp parece interrumpir el flujo de las instrucciones ejecutables, MASM coloca a temp
en el segmento de datos, separada del segmento que guarda el código compilado.
Le mostraremos cómo utilizar la directiva de signo de igual (=) para crear símbolos que
representen expresiones enteras. Utilizaremos las directivas EQU y TEXTEQU para crear símbolos
que representen texto arbitrario.
Ejemplos:
Tecla_Esc = 27
CUENTA = 5
En el primer formato, expresión debe ser una expresión entera válida. En el segundo formato,
símbolo es el nombre de un símbolo existente, que ya se ha definido con o EQU. En el tercer
formato, puede aparecer cualquier texto dentro de los signos < y >. Cuando el ensamblador se
encuentra a nombre más adelante en el programa, sustituye el valor entero o el texto por ese
símbolo. EQU puede ser útil cuando se define un valor que no se evalúa como entero. Por ejemplo,
una constante numérica real puede definirse mediante EQU:
PI EQU <3.1416>
Ejemplo El siguiente ejemplo asocia un símbolo con una cadena de caracteres. Después puede
crearse una variable mediante el uso del símbolo:
Ejemplo No. 2
Ejemplo No. 3
Ejemplo No. 4
2.2.13.2 Entrada de datos
Ejemplo No. 5
Ejemplo No. 6
Ejemplo No. 7
Ejercicios