Análisisde un programa en ensamblador
Ejercicio propuesto
Programación modular
A la hora de desarrollar un programa pequeño, cualquier metodologíapuede valer. El problema surge cuando ese programa va creciendo, con loque la cantidad de sentencias lo hace poco legible y ya no es posible hacerun seguimiento lógico de su ejecución. Otro factor a teneren cuenta, es que la persona que lea un código no tiene porquéser la misma que lo ha escrito. Aún más, es posible que seandiferentes programadores los que intervengan en el desarrollo de una aplicación.
Parece claro que la solución pasa por la formulación deprogramas complejos a partir de secuencias pequeñas, o módulos,cada uno de los cuales realiza una tarea bien definida. Es lo que se denominauna programación modular.
Pero la modularidad no sólo debe estar presente en el código,debe estarlo en todo el desarrollo, a través de las siguientes tareas:
Las razones para dividir un programa en partes más pequeñaspueden ser:
La mayoría de los ensambladores están diseñadospara ayudar en el proceso de modularización en tres formas, básicamente:
Un ensamblador es el programa que convierte un listado de códigofuente en código objeto, es decir, lenguaje máquina (el quefinalmente interpretará el procesador) en el que sólo lefaltan las referencias a rutinas externas. El código fuente es unfichero que contiene la secuencia de instrucciones en lenguaje ensambladorque forma el programa, así como ciertas directivas o comandos parael propio ensamblador, que ha sido creado utilizando un editor de texto.El código objeto consta del código en lenguaje máquinay de la información necesaria para enlazarlo con otros módulosobjeto.
Enlace y reubicación
Al construir un programa algunos de sus módulos pueden colocarseen el mismo módulo fuente y ensamblarse juntos, otros pueden estaren módulos diferentes y ser ensamblados separadamente. Si se ensamblanpor separado, el módulo principal, que contiene la primera instrucciónque se va a ejecutar, debe acabar con una sentencia END que indique elpunto de entrada al programa, y cada uno de los otros módulos debenterminar con una sentencia END sin ningún operando. En cualquiercaso, los módulos objeto resultantes, algunos de los cuales puedenestar agrupados en librerías, deben ser enlazados para formar elmódulo de carga, antes de que se pueda ejecutar el programa. Ademásde dar como salida el módulo de carga, el linker o enlazadorimprime un mapa de memoria que indica donde serán cargados los módulosobjeto en la memoria. Después de crearse el módulo de carga,éste es cargado por el cargador en la memoria del ordenador y comienzala ejecución.
La siguiente figura muestra el procedimiento general para la creacióny ejecución de un programa:
Independientemente del sistema, la combinación linker/cargadordebe crear todos los segmentos y asignaciones de dirección necesariospara permitirle al programa funcionar correctamente. En concreto, estacombinación debe:
Para realizar un programa que se ejecute en un PC, hay que partir deun fichero fuente en ensamblador, escrito con un editor de texto, que generecódigos ASCII, tal como EDIT.
El programa fuente que a continuación se lista se denomina FACTOR.ASM.
;*******************************************************************************
; CALCULA EL PRODUCTO DEL FACTORIAL DE DOS NUMEROS QUESE
; ENCUENTRAN EN LAS POSICIONES DE MEMORIA 0 Y 1 DEL SEGMENTODE
; DATOS. EL VALOR DE CADA NUMERO DEBE SER INFERIOR A9. EL RESULTADO
; SE ALMACENA EN DOS PALABRAS DEL SEGMENTO EXTRA, ENLA PRIMERA
; PALABRA EL MENOS SIGNIFICATIVO Y EN LA SEGUNDA EL MAS
; SIGNIFICATIVO. SE UTILIZA UNA RUTINA PARA CALCULAREL FACTORIAL.
;_______________________________________________________________________
;_______________________________________________________________________
; DEFINICION DEL SEGMENTO DE DATOS
DATOS SEGMENT
DATO_1 DB 0
DATO_2 DB 0
DATOS ENDS
;_______________________________________________________________________
;_______________________________________________________________________
; DEFINICION DEL SEGMENTO DE PILA
PILA SEGMENT STACK "STACK"
DB 40H DUP (0)
PILA ENDS
;_______________________________________________________________________
;_______________________________________________________________________
; DEFINICION DEL SEGMENTO EXTRA
EXTRA SEGMENT
RESULT DW 0,0 ; 2 PALABRAS ( 4 BYTES )
EXTRA ENDS
;_______________________________________________________________________
;_______________________________________________________________________
; DEFINICION DEL SEGMENTO DE CODIGO
CODE SEGMENT
ASSUME CS:CODE, DS:DATOS, ES: EXTRA, SS:PILA
FACT_DATO_1 DW 0
; COMIENZO DEL PROCEDIMIENTO PRINCIPAL
START PROC
;INICIALIZALOS REGISTROS DE SEGMENTO CON SUS VALORES
MOV AX, DATOS
MOV DS, AX
MOV AX, PILA
MOV SS, AX
MOV AX, EXTRA
MOV ES, AX
; CARGA EL PUNTERODE PILA CON EL VALOR MAS ALTO
MOVSP, 64
; FIN DE LAS INICIALIZACIONES
;COMIENZO DELPROGRAMA
MOV CL, DATO_1
CALL FACTOR
MOV FACT_DATO_1,AX ; ALMACENA EL RESULTADO
MOV CL, DATO_2
CALL FACTOR
MOV BX, FACT_DATO_1
MUL BX ; EN AX ESTA EL RESULTADO DEL FACTORIAL DEL SEGUNDO
; ALMACENA EL RESULTADO
MOV RESULT, AX
MOV RESULT+2, DX
; FIN DEL PROGRAMA
MOV AX, 4C00H
INT 21H
START ENDP
;_______________________________________________________________
; SUBRUTINA PARA CALCULAR EL FACTORIAL DE UN NUMERO
; ENTRADA CL=NUMERO
; SALIDA AX=RESULTADO, DX=0 YA QUE CL<=9
;_______________________________________________________________
FACTOR PROC NEAR
MOV AX, 1
XOR CH,CH
CMP CX, 0
JE FIN
IR:
MUL CX
DEC CX
JNE IR
FIN:
RET
FACTOR ENDP
; FIN DEL SEGMENTO DE CODIGO
CODE ENDS
; FIN DEL PROGRAMA INDICANDO DONDE COMIENZA LA EJECUCION
END START
;_______________________________________________________________________
En el programa fuente anterior es importante destacar:
El fichero factor.obj necesita ser "linkado" (encadenado) parapoder ejecutarse. Para hacer el link hay que escribir
Entrar en el menú de VIEW y activar la ventana de CPU. Dichaventana está compuesta por otras subventanas
Para ejecutar un programa, acceder al menú RUN en el que se tienendiferentes opciones:
Primer ejemplo: sencillo
Segundo ejemplo: código más completo, varios ficheros fuente, interacción con C.