Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenido:
P2.1. Ensamblado en lnea..................................................................................................... 1
P2.2. Bloques de programacin estructurada......................................................................... 3
P2.3. Depuracin en el entorno Visual Studio C++. La ventana de inspeccin. ................... 5
Condiciones de uso: Cundo se pueden utilizar. ................................................................... 5
Qu informacin podemos ver y/o modificar. ....................................................................... 5
Formato de la visualizacin. .................................................................................................. 6
P2.4. Cuestiones. ................................................................................................................... 7
Los lenguajes de alto nivel suelen tener instrucciones que permiten implementar directamente
las construcciones ms comunes en la programacin estructurada. El juego de instrucciones de un
procesador (y, por tanto, el lenguaje ensamblador) no suele implementar directamente estas
construcciones, sino que se tienen que realizar con instrucciones de comparacin y de salto
condicional o incondicional (equivalentes al goto de C). Sin embargo, esto no quiere decir que la
programacin estructurada no se usa en lenguaje ensamblador. No hay que olvidar que todas las
estructuras de cdigo de un lenguaje de alto nivel se traducen a cdigo mquina y, por tanto, tienen
su equivalente en lenguaje ensamblador.
1
Fig. 1. Ensamblado en lnea dentro de un programa Visual C.
Etiqueta es un nombre simblico. Utiliza las mismas reglas que los nombres de funcin en
C. El valor de Etiqueta es la direccin virtual donde se almacena el primer byte del cdigo
de operacin de la instruccin.
ombre_de_Instruccin es el nombre de cualquiera de las instrucciones del procesador.
operando1, operando2. Si la instruccin tiene 2 operandos, operando2 es el operando
fuente y operando1 es el operando destino (y tambin fuente en las operaciones aritmtico-
lgicas). Como operandos se pueden usar:
o Constantes numricas.
o Nombres de variables o funciones definidas en el cdigo fuente C: el
ensamblador las sustituye por su direccin.
2
La gran ventaja del ensamblado en lnea frente al ensamblado independiente es que es mucho
ms fcil de usar, sobre todo si se tiene que mezclar ensamblador con lenguaje de alto nivel.
Entre las desventajas del ensamblado en lnea, tenemos:
No todos los lenguajes y/o compiladores lo permiten. El C bsico es lo suficientemente
cercano al ensamblador como para que sea fcil incluir ensamblado en lnea en un
compilador. En general, esto es ms difcil cuanto ms abstracto es un lenguaje.
La sintaxis depende del compilador. No hay ningn tipo de estandarizacin. De hecho,
la sintaxis de Visual C++ es distinta a la de Borland C++.
El cdigo fuente en lenguaje de alto nivel que contiene instrucciones ensamblado en
lnea no son portales. A veces es preferible mantener separado los fuentes en alto nivel
del lenguaje ensamblador para facilitar la portabilidad. Las tareas para portar el cdigo
slo afectaran, en este caso, al fuente en lenguaje ensamblador.
No suele soportar caractersticas avanzadas de los ensambladores independientes, como
pueden ser el uso de macros o el ensamblado condicional.
Puede afectar a los mecanismos de optimizacin de cdigo del compilador. En los
compiladores actuales, el rendimiento de la optimizacin puede ser menor si el cdigo
fuente contiene construcciones extraas al lenguaje de alto nivel. Puede darse el caso
de que si se incluye ensamblado en lnea el compilador genere peor cdigo (ms
lento, por ejemplo) que si no se usa. De cualquier forma, el grado en que afecta a la
optimizacin es difcil de determinar, pues depende del funcionamiento interno del
compilador, lo cual, por supuesto, no suele estar documentado1.
En cualquier caso, dado la sencillez del ensamblado en lnea, en esta asignatura se va a usar
principalmente para dos tipos de tareas:
Generar programas simples, como los que se van a usar en esta prctica.
Comprobar el funcionamiento de algunas instrucciones del procesador. Cuando se tenga
alguna duda sobre los detalles del funcionamiento de alguna instruccin, no hay ms
que usarla en un bloque __asm y ejecutar el depurador para ver como funciona.
En esta prctica se va a utilizar ensamblado en lnea para ver como se usan las instrucciones de
comparacin y salto condicional para hacer los principales bloques de programacin estructurada.
La mecnica es la misma para cada uno de los tipos de bloques, y se ilustra con el bloque IF
THEN:
C.1) Bloques IF THE%. Realizar con ensamblado en lnea la parte sombreada del
programa de la figura 2.
1
Hay que tener en cuenta que algunas tcnicas de optimizacin ms avanzadas suelen ser heursticas y muy
complejas. Para los propios diseadores del compilador puede ser muy difcil determinar como pueden afectar el bloque
en ensamblador al cdigo generado. En tal caso, para prevenir efectos inesperados, se desactivan algunas de las
optimizaciones.
3
1: int Entero1, Entero2, Entero3, EnMedio, Maximo, Minimo; // Enteros con signo.
2: void main(void)
3: {
4: int Temporal;
5: Entero2= -4;
6: Entero3= 200;
El siguiente cdigo muestra cmo se trata en ensamblador cada uno de estos elementos:
15: __asm {
16: mov EAX, Entero1 ;TESTEO DE CONDICION
17: cmp EAX, Entero2 s
18: jle fin_if ; SE SALTA CUANDO LA CONDICION ES FALSA
19: mov Temporal, EAX
20: mov EAX, Entero2
21: mov Entero1, EAX INSTRUCCIONES DEL BLOQUE IF
22: mov EAX, Temporal
23: mov Entero2, EAX
24: fin_if:
25: }
La instruccin jle realiza el salto si EAX Entero2, considerando que ambos nmeros son
enteros con signo, de forma que salta todo el bloque IF si la condicin es falsa.
Para comprobar que el cdigo ensamblador es equivalente al C slo hay que insertar un
breakpoint en la lnea 19: El programa debe pararse y el valor de Entero1 y Entero2 debe ser 3 y
4, respectivamente.
Resumiendo, si tenemos un bloque IF-THEN con el siguiente pseudocdigo:
IF <condicin> THE%
<bloque IF>
E%DIF
la mecnica general para pasar de un bloque IF THEN a instrucciones en ensamblador es:
4
<instrucciones de comparacin que testan la condicin>
Jcc END_IF ; salto condicional. cc es el cdigo de condicin para la condicin falsa2.
<instrucciones del bloque if>
END_IF:
<instrucciones que siguen al bloque>
2
Ver la tabla de la transparencia 27 del tema 2 para los distintos tipos de saltos condicionales, en funcin del tipo de
dato y la condicin de salto.
5
Operaciones con variables, elementos de estructuras, direcciones, etc.
Variable global
Variable local
Direcciones de variables
Registros
Vector
Estructura
Formato de la visualizacin.
Es importante, a la hora de evitar confusiones al interpretar la informacin, tener siempre claro
cul es el formato de los datos que se presentan:
Tipo de datos: Los tipos que intervienen en una expresin debe ser compatibles.
o Es recomendable utilizar el casting de expresiones de C.
Formato del dato. El elemento ms importante del formato es la base de numeracin
usada para expresar su valor. La base de numeracin por defecto puede ser decimal o
hexadecimal. Se puede cambiar usando el men desplegable que aparece al pulsar el
botn derecho del ratn sobre la ventana de inspeccin.
o Es posible modificar el formato por defecto de una determinada expresin
usando un operador de formato:
Expresin , Operador_formato.
o Los operadores de formato ms comunes son:
6
Fig. 5. Operadores de formato para las expresiones de la ventana de depuracin.
P2.4. Cuestiones.
C.3) Qu cambios hay que hacer si las todas las variables se definen como unsigned int
en la lnea 1:? Y si se definen como char o unsigned char?
IF <condicin> THE%
<bloque IF>
ELSE
<bloque ELSE>
E%DIF
C.7) Cambiar el bucle FOR de la figura 2 por una estructura WHILE y codificarla en
ensamblador. Dibujar el esquema equivalente al de la figura 3 para esta estructura.
WHILE <condicin>
<bloque WHILE>
E%DWHILE
C.8) Cambiar el bucle FOR de la figura 2 por una estructura DO WHILE y codificarla
en ensamblador. Dibujar el esquema equivalente al de la figura 3 para esta estructura.
DO
<bloque REPEAT>
WHILE <condicin>