Buses y Periféricos

Anuncio
Buses y Periféricos. ITIS. (01/02)
Ensamblador y Turbo debugger
BUSES Y PERIFÉRICOS
Programación en ensamblador utilizando TASM, TLINK, y TD
1. Introducción
La idea de esta práctica es introducir al alumno en el manejo de las herramientas de
desarrollo de programas en ensamblador de la familia de procesadores 8086. Estas
herramientas son:
TASM: ensamblador, que transforma el código simbólico con el que trabaja el
programador en código máquina.
TLINK: enlazador, que convierte el código máquina obtenido por TASM en un formato
ejecutable en el sistema operativo base.
TD (Turbo debugger): Una herramienta de depuración de errores del código. Nos
permite simular la ejecución del código ejecutable y detectar los posibles fallos que se
revelarán en tiempo de ejecución.
2. Creación de un programa en ensamblador
Un programa en ensamblador debe ser introducido con un editor de textos como el
Block de Notas o el WordPad. Se recomienda que su extensión sea .asm. A
continuación se le somete a TASM.
TASM admite una serie de opciones. Principalmente, en tiempo de desarrollo, nos
interesa /zi, que ensambla el código introduciendo elementos añadidos que permitirán
posteriormente su tratamiento mediante TD. Una vez hemos conseguido un programa
depurado, esta opción nos perjudica porque genera un código menos eficiente. Otra
opción de interés es /l, que nos devuelve un archivo con extensión .lst, el cual contiene
un listado del código ya ensamblado. En él podemos observar el código máquina que
asocia con cada instrucción, o la dirección relativa de cada instrucción con respecto al
comienzo de segmento.
El resultado de TASM sobre un archivo de código es un nuevo archivo con extensión
.obj. Este archivo será el parámetro con que alimentaremos a TLINK. Éste también
lleva una opción relacionada con el debugger que, por el momento, siempre
añadiremos: /v.
TLINK nos devuelve un archivo con extensión .exe. El ejecutable. Se podrá mandar a
ejecutar directamente sobre MSDOS. En este caso, si ocurren errores, sólo podremos
observar un comportamiento extravagante del sistema, que se corresponderá poco con lo
que esperábamos de él. Por ello preferimos ejecutarlo en el debugger que nos permitirá
ver paso a paso (instrucción a instrucción) la ejecución y determinar en qué momento se
sale de nuestras previsiones.
1
Buses y Periféricos. ITIS. (01/02)
Ensamblador y Turbo debugger
3.- Eliminación de errores. (Uso del TD)
Una vez disponemos del archivo ejecutable (extensión .exe) podemos invocar con él al
Turbo Debugger.
Esta herramienta nos permitirá ver el programa fuente así como el código generado por
el ensamblador en sus posiciones de memoria definitivas para la actual ejecución.
También podemos observar (y modificar) los registros del procesador y los datos que
hayamos situado en memoria (segmento de datos). Nos permitirá realizar una ejecución
"segura" del programa, entendiendo por esto que si el programa alberga errores tenemos
la certeza de que estos no van a perjudicar al sistema, lo que no podemos asegurar si
directamente lo sometemos al msdos. Y principalmente, porque es la opción más
práctica, podemos ejecutar el programa instrucción a instrucción, con lo cual
comprobamos que cada instrucción modifica exactamente aquellos recursos que
esperábamos que modificase y de la manera en que deseábamos que lo hiciera cuando
escribimos el programa.
Para cargar el programa en el debugger basta invocar a éste con el archivo ejecutable
como parámetro. Si la carga se realiza adecuadamente, estaremos visualizando el código
fuente, en ensamblador, de nuestro programa. A partir de aquí podemos mandar a
ejecutar el programa, tanto de forma completa como paso a paso. En este último caso,
tras cada paso, una flechita indicará en el código fuente cual es la última instrucción que
se ha ejecutado.
La opción CPU del menú VIEW nos abrirá una ventana en la que podremos ver el
código máquina ya localizado en memoria, con la flechita apuntando a la primera
instrucción a ejecutar. También veremos otra ventana en la que aparecen los registros
del procesador y su contenido se irá modificando en cada paso de ejecución. Y, por
último, podemos ver el contenido del espacio de memoria que también se irá
modificando a medida que vamos ejecutando instrucciones que le afecten.
ACTIVIDADES A REALIZAR.
1º Introducirán el código que viene a continuación en un archivo de texto utilizando
cualquier editor de textos plano (que no añada controles de edición): WordPad,
NotePad.
(Documento a generar 1: Un listado del programa con cada instrucción comentada.
Ayúdese con el listado de instrucciones y directivas.)
2º Ensamblarán y enlazarán el archivo generado hasta obtener un ejecutable. (Este
código en principio no tiene errores, de manera que cualquier problema que surja se
deberá a la transcripción). Realizar una ejecución en msdos.
(Documento a generar 2: Explicar qué es lo que hace el programa)
3º Cargarán el código en el TD y lo ejecutarán paso a paso.
(Documento a generar 3: Explicar qué función realizan las teclas F1, F2, ALT-F5)
(Documento a generar 4: Tratar de identificar en el programa qué secciones de código
realizan cada parte del resultado de ejecución del programa según el documento 2)
2
Buses y Periféricos. ITIS. (01/02)
Ensamblador y Turbo debugger
Bibliografía:
Turbo Debugger 3.0, User's Guide BORLAND
Turbo Assembler 3.0, User's Guide BORLAND
8086/87 Programación ensamblador en entorno msdos. Miguel Angel Rodríguez
Roselló Ediciones Anaya Multimedia 1990
3
Buses y Periféricos. ITIS. (01/02)
Ensamblador y Turbo debugger
com_pantalla EQU 0B800h
tam_pantalla EQU 4000
DATOS
SEGMENT
TEXTO
DB "BUSES Y PERIFERICOS. EUI.",13,10,"TITULACION DE INGENIERO TECNICO DE
SISTEMAS",13,10,'$'
TEXTE
DB "AMIGOS Y AMIGAS, BIEN VENIDOS A LAS PRACTICAS DE BUSES
PERIFERICOS",13,10,'$'
DATOS ENDS
PILA
SEGMENT
DB 127 DUP('p')
DB 'P'
ENDS
apuntador
PILA
CODIGO SEGMENT
ASSUME CS:CODIGO, DS:DATOS, SS:PILA
borra_pantalla PROC
PUSH ES
PUSH AX
PUSH CX
PUSH DI
PUSHF
MOV AX, com_pantalla
MOV ES,AX
MOV CX, (tam_pantalla/2)+1
MOV DI, tam_pantalla
MOV AL, '-'
MOV AH, 07h
STD
REP STOSW
POPF
POP DI
POP CX
POP AX
POP ES
RET
ENDP
Todo_es_empezar:
MOV AX, DATOS
MOV DS, AX
MOV AX, PILA
MOV SS, AX
MOV SP, OFFSET apuntador
MOV AH,09h
MOV DX, OFFSET TEXTO
INT 21h
Call borra_pantalla
NO:
f:
CODIGO ENDS
END
MOV AH,09h
MOV DX, OFFSET TEXTE
INT 21h
MOV AH, 4Ch
INT 21h
Todo_es_empezar
4
Buses y Periféricos. ITIS. (01/02)
Ensamblador y Turbo debugger
INSTRUCCIONES 8086
Transferencia de datos
IN
LAHF
LDS
LEA
LES
MOV
OUT
POP
POPF
PUSh
PUSHF
SAHF
XCHG
XLAT
- entrada de bytes o palabra
- Cargar AH con las banderas
- Cargar puntero usando DS
- Cargar dirección efectiva
- Cargar puntero usando ES
- Mover
- Salida de byte o palabra
- Recuperar palabra de la pila
- Recuperar banderas de la pila
- Depositar palabra en la pila
- Depositar banderas en la pila
- Almacenar Ah en banderas
- Intercambiar dos operandos
- Traducir
Instrucciones aritméticas
AAA
AAD
AAM
AAS
ADC
ADD
CBW
CMP
CWD
DAA
DAS
DEC
DIV
IDIV
IMUL
INC
MUL
NEG
SBB
SUB
- Ajuste ASCII en suma
- Ajuste ASCII en división
- Ajuste ASCII en multiplicación
- Ajuste ASCII en resta
- Sumar con acarreo
- Sumar (sin acarreo)
- Convertir byte en palabra
- Comparar operandos
- Convertir palabra a doble palabra
- Ajuste decimal en suma
- Ajuste decimal en resta
- Decrementar en uno
- Dividir sin signo
- Dividir con signo
- Multiplicar con signo
- Incrementar en uno
- Multiplicar sin signo
- Negar/formar complemento a 2
- Restar con acarreo
- Restar (sin acarreo)
Instrucciones de manejo de bits
AND
- Y lógico
NOT
- Negación lógica
OR
- O lógico
RCL
- Rotación a izquierda a través del bit de acarreo
RCR
- Rotación a derecha a través del bit de acarreo
ROL
- Rotación a izquierda
ROR
- Rotación a derecha
SAL
- Desplazamiento aritmético a izquierda
SAR
- Desplazamiento aritmético a derecha
(conservando el signo)
SHL
- Desplazamiento lógico a izquierda
SHR
- Desplazamiento lógico a derecha
TEST
- Comparación lógica de dos operandos
XOR
- O lógico exclusivo
Instrucciones de transferencia del control
CALL
JA
JAE
JB
JBE
JC
JCXZ
JE
JG
JGE
JL
JLE
JNA
JNAE
JNB
JNBE
JNC
JNE
JNG
- Llamada a procedimiento
- Saltar si superior
- Saltar si superior o igual
- Saltar si inferior
- Saltar si inferior o igual
- Saltar si hay acarreo
- Saltar si CX es cero
- Saltar si igual
- Saltar si mayor
- Saltar si mayor o igual
- Saltar si menor
- Saltar si menor o igual
- Saltar si no es mayor
- Saltar sino es mayor o igual
- Saltar si no es menor
- Saltar si no es menor o igual
- Saltar si no hay acarreo
- Saltar si no es igual
- Saltar si no es mayor
JNGE
- Saltar si no es mayor o igual
JNL
- Saltar si no es menor
JNLE
- Saltar si no es menor o igual
JNO
- Saltar si no se produce desbordamiento
JNP
- Saltar si no hay paridad
JNS
- Saltar si no es negativo
JNZ
- Saltar si no es cero
JMP
- Salto incondicional
JO
- Saltar si se produce desbordamiento
JP
- Saltar si hay paridad
JPE
- Saltar si hay paridad par
JPO
- Saltar si hay paridad impar
JS
- Saltar si el signo es negativo
JZ
- Saltar si el resultado es cero
LOOP
- Bucle hasta que acabe contador
LOOPE - Bucle mientras igual
LOOPNE - Bucle mientras no igual
LOOPNZ - Bucle mientras resultado no cero
LOOPZ - Bucle mientras resultado cero
RET
- Retornar de un procedimiento
Instrucciones de manejo de cadenas.
CMPS
- Comparar cadenas de bytes o palabras
CMPSB - Comparar cadenas de bytes
CMPSW - Comparar cadenas de palabras
LODS
- Cargar cadena (bytes o palabras)
LODSB - Cargar cadena de bytes
LODSW - Cargar cadena de palabras
MOVS
- Mover cadena (bytes o palabras)
MOVSB - Mover cadenas de bytes
MOVSW - Mover cadenas de palabras
REP
- Repetir operación de cadena
REPE
- Repetir mientras igual
REPNE - Repetir mientras no igual
REPNZ - Repetir mientras resultado no cero
REPZ
- Repetir mientras resultado cero
SCAS
- Explorar cadena (b o p)
SCASB - Explorar cadena de bytes
SCASW - Explorar cadena de palabras
STOS
- Almacenar cadena (b o w)
STOSB - Almacenar cadena de bytes
STOSW - Comprarse una tienda en el polo norte.
Instrucciones de interrupción.
INT
INTO
IRET
- Invocar a la interrupción
- Interrupción si desbordamiento
- Retorno de interrupción
Instrucciones de control de microprocesador.
CLC
- Borrar bandera de acarreo
CLD
- Borrar bandera de dirección
CLI
- Borrar bandera de interrupción
CMC
- Complementar bandera de acarreo
ESC
- Escape (transmitir información a un
coprocesador)
HLT
- Parar el procesador
LOCK
- Bloquear el bus
NOP
- No operación
STC
- Activar bandera de acarreo
STD
- Activar bandera de dirección
STI
- Activar bandera de interrupción
WAIT
- Esperar a que termine un coprocesador.
5
Buses y Periféricos. ITIS. (01/02)
Ensamblador y Turbo debugger
DIRECTIVAS DEL COMPILADOR
Directivas de datos
Definición de símbolos
EQU
=
- Asigna símbolo a expresión fija
- Asigna símbolo a expresión variable
TITLE
- Título del listado
SUBTTL - Subtítulo del listado
Listado de macros
.LALL
- Listar macros y expansiones
.SALL
- Suprimir listado macros y expansiones
.XALL
- Listar sólo macros que generan código objeto
Control del listado
Definición de datos
DB
DW
DD
DQ
DT
- Definir byte
- Definir palabra
- Definir doble palabra
- Definir cuádruple palabra
- Definir diez bytes
.XCREF
.CREF
.XLIST
.LIST
- Suprimir referencias cruzadas
- Restaurar listado de referencias cruzadas
- Suprimir listado ensamblador
- Restaurar listado ensamblador
Comentarios
COMMENT - Comentario
Referencias externas
PUBLIC - Definir símbolo público
EXTRN - Definir símbolo externo
INCLUDE - Incluir fichero fuente
Control del ensamblador
END
- Fin del módulo fuente
ORIGIN - Origen de código o datos
EVEN
- Poner contador de posiciones a par
.RADIX - Definir base de numeración por defecto.
Definición de segmentos y procedimientos
SEGMENT - Comienzo de segmento
ENDS
- Final de segmento
ASSUME - Suponer registros de segmentos
PROC
- Comienzo de procedimiento
ENDP
- Fin de procedimiento
Definición de bloques
GROUP - Agrupar segmentos
NAME - Nombrar un módulo
LABEL - Asignar un atributo a un nombre
RECORD - Definir registro
STRUC - Definir estructura
Directivas condicionales
IF
ELSE
ENDIF
- Evaluar condición y decidir
- Si condición es falsa
- Fin de estructura condicional
Directivas de listado
Mensajes
%OUT
- Emitir un mensaje durante el ensamblaje
Control del listado de los bloques asociados a una
condición falsa
.LFCOND - Listar bloques asociados a una condición falsa
.SFCOND - Suprimir ese listado mencionado arriba
.TFCOND - Invertir el modo de listado de los bloques...
Directivas de macro
Definición de macros
MACRO - Comienza macro
ENDM - Fin macro
LOCAL - Define etiquetas dentro de macro
EXITM - Terminar expansión de la macro
PURGE - Borrar macros de la memoria
REPT
- Repetir bloque de sentencias un número de
veces
IRP
- Repetir bloque de sentencias con un valor cada
vez
IRPC
- Repetir bloque de sentencias con un carácter
cada vez
Operadores de macro
&
- Operador para concatenar símbolos o texto
;;
- Operador para comentarios que no aparecerán
en la expansión
!
- Operador para interpretar caracteres en sentido
literal
%
- Operador para convertir una expresión en un
número
Formato del listado
PAGE
- Formato de la página del listado
6
Descargar