1.2 Limitaciones de DEBUG NOTAS SOBRE DEBUG

Documentos relacionados
LABORATORIO DE PROGRAMACIÓN EN LENGUAJE ENSAMBLADOR x86-16bits

Todos los comandos de DEBUG se invocan usando una sola letra y son los siguientes:

APUNTES DE LENGUAJE ENSAMBLADOR APÉNDICE B DEBUG

BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN

EL PROGRAMA MICROSOFT CODEVIEW

Ingeniería en Sistemas. Sistemas Operativos. Trabajo Práctico: Repaso de Interrupciones, direccionamiento de memoria y registros del procesador.

Tema 1. Fundamentos del lenguaje ensamblador

Arquitectura (Procesador familia 80 x 86 )

Conceptos de Arquitectura de Computadoras Curso 2015

Curso básico de Emsamblador. Laboratorio # 1. Capitulo 4. Las instrucciones del ensamblador (2da. Parte)

UNIVERSIDAD TECNICA FEDERICO SANTA MARIA - Sede TALCAHUANO. Area Electrónica Programación en Ensamblador 8088/86.

Asignatura: ASSEMBLER INF-153 LABORATORIO 1

EJEMPLOS EN ENSAMBLADOR

ARQUITECTURA INTERNA DEL µp8086

Introducción al EMU8086

6-REGISTROS DEL 8086 Y DEL 80286

Universidad Nacional de Ingeniería Arquitectura de Maquinas I. Unidad II: Arquitectura y Programacion de un Microprocesador (80X86)

Los números naturales y enteros en el 80X86 y en LAN

Ejercicio. Solución. Banderas. Banderas. Banderas 05/10/2011 UNIDAD 5 2 A PARTE PROGRAMANDO EN EL ENSAMBLADOR DEL Z80

Examen de teoría (5 puntos)

Pregunta correcta= 0,3 Pregunta no contestada= 0 Pregunta incorrecta (tipo test)= -0,15

Objetivo. Introducción. Tema: GENERACION DE CODIGO. Compiladores, Guía 11 1

Registros Arquitectura x86. M. en C. Erika Vilches

Arquitectura de Computadores II Clase #3

Laboratorio 1 Entorno de desarrollo y subrutinas

Tema: Lenguaje ensamblador embebido

Estructura de Computadores: Tema 1. Introducción. Índice. Arquitectura del i8086

Práctica 2. Registros y posiciones de memoria

Intel 8086 modelo básico (primera parte) Registros:

Arquitectura Interna del 8088

Instrucciones del microprocesador

INT 21H Función 02H Salida de Carácter LLAMADA: AH = 02H DL = Código ASCII a enviar al dispositivo de salida. DEVUELVE: NADA.

Examen de teoría (5 puntos)

ENSAMBLADOR. M.C. Laura Cuayahuitl Romero MODO DE DIRECCIONAMIENTO DIRECTO

Un. VIII. Generación de Código Objeto

(4) Unidad 4. Recursos de Programación SISTEMAS BASADOS EN MICROPROCESADORES. Grado en Ingeniería Informática EPS - UAM

USO DE MEMORIA Y PERIFÉRICOS CON EMU8086. Kervin Sánchez Herrera.

LABORATORIO DE PROGRAMACIÓN EN LENGUAJE ENSAMBLADOR x86-16bits

APENDICE B Ensamblador IASM11/Simulador AVSIM11

1.2.- EL MICROPROCESADOR.

Universidad Nacional de Ingeniería Arquitectura de Maquinas I. Unidad I: Arquitectura y Programación de un Microprocesador (8086)

EL EMU8086 Y EL MICROPROCESADOR 8086.

El Diseño de un Lenguaje Máquina

ENSAMBLADOR DE ARCHIVO TASM MASM NASM GAS. Características de un Ensamblador de Archivo

PROF. ANGEL MENDEZ YALLI.

SISTEMAS BASADOS EN MICROPROCESADORES

Arquitectura de Computadores II Clase #3

Creación De Scripts Ejecutables

5 - Lenguaje Ensamblador

Práctica ENS:Ensamblar y depurar

Unidad IV: Programación de microcontroladores

Tema 5. Presentación de datos por pantalla

Ciclos de máquina. Otro ejemplo: decremento de un registro par (donde rp = HL, DE, BC, SP) DCX rp

Examen de teoría (4 puntos)

La arquitectura del 8086/8088

Práctica 4. Lenguaje máquina y lenguaje ensamblador

Relación de Problemas I

9. Lenguaje ensamblador

Instrucciones Lógicas y Registro de Banderas

INFORMATICA TECNICATURA DE NIVEL SUPERIOR ALGUNOS EJERCICIOS DE SELECCIÓN E ITERACION

SISTEMAS BASADOS EN MICROPROCESADORES

Práctica 1. Introducción a la programación en ensamblador

Tema 4. Lenguaje máquina y lenguaje ensamblador

Trabajo Práctico Nro 3: Assembler

MANEJO DEL MOUSE EN LENGUAJE C++

Instrucción De Salto Incondicional

Tema 5: La pila, las macros y los procedimientos

Práctica 3 - Arquitectura del CPU

Tema 5.1: Presentación de datos en pantalla

Estructura de Computadores. Problemas de Instrucciones y Direccionamientos

Instrucciones de Control de Flujo y Usos de la Pila

Arquitectura del CPU. Organización del Computador 1 Verano 2016

PROCESAMIENTO DE LOS DATOS. Procesamiento de datos ascii a binario y de binario a ascii

Tema 6. Segmentación y modos de direccionamiento

RELACIÓN DE PROBLEMAS DE LÓGICA PROGRAMADA (TEMA 4)

Sobre cómo dividir un programa ensamblador x86 (modo Real) en módulos compilables por separado.

Circuitos Digitales II y Laboratorio Electrónica Digital II y Laboratorio

SISTEMAS BASADOS EN MICROPROCESADORES

62/8&,21(6$/(;$0(1'( /$%25$725,2'((6758&785$6'(/26&20387$'25(6 &8562)(%5(52

Apellidos Nombre DNI

Ejemplo del uso de las subrutinas

Contenido. Conjunto de Instrucciones. Formato de la Instrucción. Instrucciones de 1 byte. Formato de la Instrucción 28/09/2011

Ejercicios del Tema 3. Fundamentos de la programación en ensamblador

3 - Arquitectura interna de un up

Tema: Introducción al IDE de Microsoft Visual C#.

Laboratorio de Procesamiento Digital de Voz Practica 1. INTRODUCCION DE MATLAB Y MANEJO DE ARCHIVOS DE VOZ

Introducción a la Computación. Capítulo 10 Repertorio de instrucciones: Características y Funciones

EDITOR VI. La sintaxis del comando vi es, al igual que la de cualquier comando UNIX: vi [opciones] archivo

Funcionamiento de las computadoras

A. La estructura del código fuente será la siguiente: copie y pegue la información mediante la computadora

Tema 4: Lenguaje máquina - Lenguaje ensamblador

2 de septiembre de 2010 Hoja: 1 / 10. Solamente existe una opción válida en las preguntas de respuesta múltiple.

Creación de Shell Scripts

Tema 4. Lenguaje máquina y lenguaje ensamblador

Transcripción:

1 NOTAS SOBRE DEBUG CLASE INEL 4206: MICROPROCESADORES I 1. Generalidades Preparadas por Rogelio Palomera G. Verano 1997. Versión corregida, Febrero 2006 DEBUG es un programa provisto con DOS. Versiones más avanzadas de este programa son SYMDEB y CodeView (CV), los cuales se proveen junto con MASM (MicroSoft Assembler). El nombre sugiere "debugger", que significa programa para corregir errores de programación en un código. Existen otros programas que cumplen la misma función, así como otros tipos de ensambladores 1.1 Ventajas de los programas depuraadores ("debuggers") a) examinar el contenido de la memoria y los registros; b) ejecutar instrucciones de un programa, ya sea en forma contínua o una a la vez, y verificar su ejecución (lo que permite identificar errores de ahí el nombre entre otras cosas). c) modificar directamente una o más instrucciones del programa sin necesidad de seguir todo el proceso de ensamblado. d) escribir instrucciones en lenguaje ensamblador (ensamblar) y ejecutarlas Esto permite estudiar el efecto de las instrucciones; e) desensamblar instrucciones, esto es, interpretar el contenido de memoria como instrucción de ensamblador. f) crear y cargar archivos 1.2 Limitaciones de DEBUG A) Toda expresión numérica es hexadecimal, con un máximo de cuatro cifras hexadecimales. Se escriben sin el sufijo H B) El ensamblador DEBUG no acepta variables ni símbolos en las instrucciones del ensamblador. C) Solamente trabaja en modo real, y existen algunos comandos de ensamblador que no pueden probarse en este DEBUG D) Solamente trabaja con registros de 16 y 8 bits, y no incluye al FS ni GS. Para trabajar con los registros de 32 bits, como EAX, EBX, etc. debe usarse el CodeView. 2. Usando DEBUG 2.1 Abriendo y saliendo de DEBUG. Help Para comenzar DEBUG, simplemente escriba el comando DEBUG y oprima ENTER. Se puede abrir desde cualquier directorio. C:\>DEBUG El "prompt" de DEBUG es el guión. Los comandos en DEBUG no se ejecutan mientras no se oprima la tecla ENTER. Cuando se abre DEBUG solo con el comando anterior, el programa inicializa automáticamente los registros: Los segmentos de registro se inicializan en el primer lugar de memoria disponible después de cargar DEBUG, IP=0100, SP= FFEE y los demás registros a 0000. Se puede abrir DEBUG cargándolo con un programa:

2 C:\> DEBUG <file.exe>> Cuando se invoca al programa file.exe, éste ocupa un lugar en la memoria y los registros se inicializan de la manera siguiente: * el par de registros BXCX indica el número de bytes que contiene el programa. ** CS y SS, y los indicadores IP y SP se inicializan de acuerdo al inicio de los segmentos correspondientes. ** IP = 0000 si no se uso la directiva ORG en el programa fuente. Se puede iniciar usando un archivo que contiene comandos de DEBUG: C:\> DEBUG < file.dbg En este caso, los comandos incluidos en el archivo se ejecutan inmediatamente. El comando "?" genera una lista de los comandos de DEBUG :? assemble A [address] compare C range address dump D [range] enter E address [list] fill F range list go G [=address] [addresses] hex H value1 value2 input I port load L [address] [drive] [firstsector] [number] move M range address name N [pathname] [arglist] output O port byte proceed P [=address] [number] quit Q register R [register] search S range list trace T [=address] [value] unassemble U [range] write W [address] [drive] [firstsector] [number] allocate expanded memory XA [#pages] deallocate expanded memory XD [handle] map expanded memory pages XM [Lpage] [Ppage] [handle display expanded memory status XS Los corchetes [ ] indican que el parámetro pedido es opcional. En esta práctica no usamos todos los comandos. 2.2 Parámetros Importantes: Los parámetros comunes, opcionales o no, son: address: Una dirección puede ser a) un offset 1 a 4 cifras hex ( ejm 100)., DS es el segmento implícito para los comandos E, D y F. CS para los comandos A, G, P, T, W, U b) un segmento y un offset ( 0230: 100) ; c) un registro de segmento y un offset (CS: 100) range: bloque de direcciones que empieza en un address determinado. El rango se especificar como a) address1 address2 (address2 solamente offset ya que el segmento es el mismo que address1) b) address L << número de bytes >> El el segundo caso, se indica en hexadecimal el número de bytes que abarca el rango.

3 2.3 Examinando y modificando memoria y registros. 2.3.1 Registros: El comando R permite examinar y modificar el contenido de los registros. Con el comando R solamente, aparece una lista de los registros y su contenido. R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0100 2D14:0100 0F DB 0F Carry (C) 1: yes; 0: no Parity (P) (Even/Odd) Auxiliary half carry (A) (yes/no) Zero (Z) (Yes/ No) CY PE AC ZR NC PO NA NZ El Flag Register se muestra como La última línea muestra: Sign (S) (Negative/Positive) Interrupt (I) (Enable/disable) NG EI PL DI 1. la dirección de la siguiente instrucción (2D14:0100); 2. el lenguaje máquina de la instrucción (0F ) y 3. el lenguaje mnemónico de la instrucción ( DB 0F). Direction (D) (Decrement/increm ent) DN UP Observe que el offset de la dirección de la siguiente instrucción está dado por IP Overflow (O) (yes/no) OV NV Como los registros se inicializaron, las banderas están a "0" (cleared), a excepción de la bandera de interrupción (EI = "1", interrupt enabled). La lectura de las banderas se muestra en la tabla siguiente. La bandera T (trap) no se incluye, ya que ésta se usa solamente para correr programas paso a paso. Bandera = 1 (set) = 0 (cleared) Para modificar el contenido de un registro, se invoca el comando R seguido del registro que se desea modificar. DEBUG responde indicando el valor actual del registro y en la línea siguiente dos puntos (:), después de lo cual se introduce el nuevo valor deseado. Ejemplo: R DS DS 2D14 :2D24 R

4 AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE DS=2D24 ES=2D14 SS=2D14 CS=2D14 IP=0100 2D14:0100 0F DB 0F 2.3.2 Memoria Para trabajar con la memoria se usan tres comandos: E, D y F. En estos tres comandos debemos especificar una dirección o un rango. En el comando D éstos son opcionales. 2.3.2.1 Comando E: Este comando nos permite examinar y/o modificar contenidos de memoria. A) Examinando: El comando E seguido de la dirección nos muestra el contenido de la memoria en esa dirección, seguida de un punto. Oprimiendo la barra de espacio se muestra la siguiente direccion, y asi sucesivamente hasta que se aprieta "Enter" o "Return". En el siguiente ejemplo, se ve que el contenido de memoria con dirección DS:0100 es el byte 0E. E 100 2D14:0100 0E. Usando ahora la tecla de espacio, se ve el contenido de las direcciones 100 (0E), 101 (00), 102 (B9) y 103 (8A): E 100 2D14:0100 0E. 00. B9. 8A. B) Modificando:Para modificar uno o más lugares de memoria hay dos formas: B1) Escribiendo inmediatamente después del punto el nuevo byte deseado. (En el ejemplo, las negritas): 2D14:0100 05.90 38.40 98.37 0A.0B B2) Escribiendo inmediatamente después de la dirección la lista desead de bytes (la lista puede escribirse numéricamente como números o como ASCII: E 100 90 40 37 B E 200 'ABC' E 200 2D14:0200 41. 42. 43. 2.3.2.2 Comando D: Este comando permite ver bloques de memoria, y muestra aquellos lugares con código ASCII, el cual se muestra a la derecha.. Tiene las modalidades siguientes: A) El comando D solo presenta 128 bytes, en grupos de 16, a partir de la última dirección utilizada con D. B) D <<address>> presenta lo mismo que D, pero a partir de la dirección indicada. C) D << range>> presenta solamente el bloque en el rango indicado. 2.3.2. 3 Comando F <<range>> <<list>>. Permite "llenar" uno o más lugares en un rango dado, con bytes especificados en una lista. En los ejemplos usamos el comando D para verificar el resultado: F 100 L 5 88 D 100 L 5 2D14:0100 88 88 88 88 88 F 200 L 5 A B C D E D 200 L 5 2D14:0200 0A 0B 0C 0D 0E E 100

5 2.3.3 Otros comandos con memoria: A) El comando M <<range>> <<address>> nos permite copiar en la dirección <<address>> el bloque de memoria indicada en el <<range>>. B) El comando S <<range>> <<list>> localiza los bytes de la lista los bytes dentro del rango indicado. El comando devuelve las direcciones donde se encuentran los bytes indicados. En la siguiente secuencia se puede apreciar el efecto de estos comandos: D 100 2D14:0100 0F 00 B9 8A FF F3 AE 4761 03 1F 8B C3 48 12 B1...Ga...H.. 2D14:0110 04 8B C6 F7 0A 0A D0 D348 DA 2B D0 34 00 03 2D...H.+.4.. 2D14:0120 00 DB D2 D3 E0 03 F0 8EDA 8B C7 16 C2 B6 01 16... 2D14:0130 C0 16 F8 8E C2 AC 8A D000 00 4E AD 8B C8 46 8A...N...F. 2D14:0140 C2 24 FE 3C B0 75 05 ACF3 AA A0 0A EB 06 3C B2.$.<.u...<. 2D14:0150 75 6D 6D 13 A8 01 50 1474 B1 BE 32 01 8D 8B 1E umm...p.t..2... 2D14:0160 8E FC 12 A8 33 D2 29 E313 8B C2 03 C3 69 02 00...3.)...i.. 2D14:0170 0B F8 83 FF FF 74 11 2601 1D E2 F3 81 00 94 FA...t.&... M 100 105 120 D 100 130 2D14:0100 0F 00 B9 8A FF F3 AE 4761 03 1F 8B C3 48 12 B1...Ga...H.. 2D14:0110 04 8B C6 F7 0A 0A D0 D348 DA 2B D0 34 00 03 2D...H.+.4.. 2D14:0120 0F 00 B9 8A FF F3 F0 8EDA 8B C7 16 C2 B6 01 16... 2D14:0130 C0. S 100 130 16 2D14:012B 2D14:012F S 100 120 'Ga' 2D14:0107 3. Instrucciones en lenguaje ensamblador (mnemónicas) y corriendo programas. empieza en la dirección CS:0100 o donde indique el programa.exe que se haya cargado. Ver ejemplos: 3.1 Comandos U(nassembly) y A(ssembly) 3.1.1 Comando U [<<address>] [<<range>>] Interpreta en forma mnemónica, esto es, en lenguaje ensamblador el contenido de la memoria. Interpreta 16 instrucciones, o las instrucciones en el rango indicado. Con U solo, las interpreta partir de la última memoria interpretada anteriormente. La primera vez que se ejecuta, U 2D14:0100 0F DB 0F 2D14:0101 00B98AFF ADD [BX+DI+FF8A],BH 2D14:0105 F3 REPZ 2D14:0106 AE SCASB 2D14:0107 47 INC DI 2D14:0108 61 DB 61 2D14:0109 031F ADD BX,[BX] 2D14:010B 8BC3 MOV AX,BX 2D14:010D 48 DEC AX 2D14:010E 12B1048B ADC DH,[BX+DI+8B04]

6 2D14:0112 C6F70A MOV BH,0A 2D14:0115 0AD0 OR DL,AL 2D14:0117 D348DA ROR WORD PTR [BX+SI26],CL 2D14:011A 2BD0 SUB DX,AX 2D14:011C 3400 XOR AL,00 2D14:011E 032D ADD BP,[DI] U 10A 112 2D14:010A 1F POP DS 2D14:010B 8BC3 MOV AX,BX 2D14:010D 48 DEC AX 2D14:010E 12B1048B ADC DH,[BX+DI+8B04] 2D14:0112 C6F70A MOV BH,0A A la derecha de la memoria aparece el lenguage máquina correspondiente a la instrucción en lenguaje máquina que aparece después de la dirección. Si el byte no corresponde a ningún OPCODE, lo interpreta como DB. 3.1.2 Comando A [<<address>>]: Para escribir instrucciones en lenguaje ensamblador. Al introducir el comando, nos responde con la dirección donde será colocada la instrucción (La dirección podemos ponerla opcionalmente). Después de escribir la instrucción, nos responde con una nueva dirección. Continuamos así hasta finalizar. Se sale del modo A oprimiendo <<return>> solamente en la línea, sin ningún otro dato. NOTA: El comando A solo nos coloca en la dirección siguiente a la última vez que se utilizó. Si queremos una dirección particular, hay que agregarla. A 210 2D14:0210 MOV AH, BL 2D14:0212 ADD CX, DX 2D14:0214 OR CL, [2304] 2D14:0218 MOV AX, 345 2D14:021B U 210 21B 2D14:0210 88DC MOV AH,BL 2D14:0212 01D1 ADD CX,DX 2D14:0214 0A0E0423 OR CL,[2304] 2D14:0218 B84503 MOV AX,0345 2D14:021B 66 DB 66 Este ensamblador elemental no permite variables. Todos los números son hexadecimales: A 2D14:021B ADD AX, DURO ^ Error 2D14:021B 3.2 Ejecutando instrucciones y/o programas :Comandos G(o), T(race) y P(roceed). Estas instrucciones son de suma importancia porque nos permiten: A) observar la ejecución de una instrucción para fines de aprendizaje o de corrección; B) correr programas o secciones de programas para verificarlos. 3.2.1Comando G Este comando ejecuta las intrucciones una después de la otra. Sus modalidades son: a) G: ejecuta las instrucciones a partir de la dirección CS:IP; b) G = <<address>>: ejecuta las instrucciones a partir de la dirección indicada (segmento CS si no se indica lo contrario) G = <<address1>> <<address2>>: Ejecuta las instrucciones entre las dos direcciones indicadas y regresa al final el contenido de registros, con IP señalando <<address2>>

7 Si se encuentra con una instrucción inválida etonces o bien se congela la máquina o causa un error. Si todas las instrucciones son válidas, en los dos primeros casos ejecutará las instrucciones indefinidamente o hasta encontrarse con una de las siguientes instrucciones: a) INT 20 : Responde "Program Terminated normally" y regresa al "prompt" de DEBUG. Los registros son inicializados. b) MOV AH, 4C, INT 21: Igual que antes, pero a veces regresa a DOS y no a DEBUG. c) INT 3 : (break) Suspende la corrida y muestra el estado de los registros. Esto es útil para observar segmentos de programa.observe los siguientes ejemplos. A 2D14:0100 MOV AX, 0400 2D14:0103 MOV [234],AX 2D14:0106 INT 20 2D14:0108 G Program terminated normally E 234 2D14:0234 00. 04. R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0100 2D14:0100 B80004 MOV AX,0400 A 200 2D14:0200 MOV AX, 0400 2D14:0203 MOV [234], AX 2D14:0206 INT 3 2D14:0207 G = 200 AX=0400 BX=0000 CX=0000 DX=0000 SP=FFEE DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0206 NV UP EI PL NZ NA PO NC 2D14:0206 CC INT 3 A 300 2D14:0300 MOV AX,0400 2D14:0303 MOV [2340], AX 2D14:0306 MOV AH,4C 2D14:0308 INT 21 2D14:030A G=300 C:\> 3.2.2 Comandos T y P: Estos dos comandos funcionan de manera casi similar. Si hay una instrucción de tipo INTerrupt (la cual es en realidad una subrutina), o una instruccion repetitiva como LOOP o REP, el comando P ejecutará toda la subrutina o toda la instrucción repetitiva, mientras que T solamente ejecuta una instrucción. A) T (P) Ejecuta una instrucción ( subrutina o lazo en caso P), cuya dirección es la que corresponde a la última ocasión en que se usaron. Después de ejecutarla devuelve a la pantalla los registros; si es necesario analizar memoria, entonces podemos hacerlo. B) T <<número>> (P <<número>> ) Este comando ëjecuta la cantidad de instrucciones indicada por <<número>>.

8 C) T=<< address>> P=<< address>> Ejecutan la instrucción en la dirección indicada. Si solamente se da el offset, el segmento es CS. D) T=<< address>> << número>> P=<< address>> << número>> Ejecuta <<número>> instrucciones a partir de la dirección indicada. En el ejemplo siguiente el objetivo es ir incrementando el registro AL tantas veces (16H = 22) como lo indica el contador. Primero escribimos las instrucciones. Al ejecutar la primera instrucción observe que CX = 0016. Cuando se ejecuta la segunda instrucción: AX=0001, que es lo que se pidió. Como CX no es cero, se vuelve a la instrucción de incrementar. Luego hacemos un T 5 para ejecutar cinco instrucciones. Cuando usamos P, como hay un LOOP, se realiza todo el lazo y se sale de el. Observe que despues de P tenemos AX = 0016 y CX=0000. Observe también IP: C:\>debug a 2D14:0100 mov cx, 16 2D14:0103 inc al 2D14:0105 loop 103 2D14:0107 t AX=0000 BX=0000 CX=0016 DX=0000 SP=FFEE DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0103 2D14:0103 FEC0 INC AL t AX=0001 BX=0000 CX=0016 DX=0000 SP=FFEE DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0105 2D14:0105 E2FC LOOP 0103 t AX=0001 BX=0000 CX=0015 DX=0000 SP=FFEE DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0103 2D14:0103 FEC0 INC AL t 5 AX=0002 BX=0000 CX=0015 DX=0000 SP=FFEA DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0105 NV UP EI PL NZ NA PE NC 2D14:0105 E2FC LOOP 0103 AX=0002 BX=0000 CX=0014 DX=0000 SP=FFEA DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0103 NV UP EI PL NZ NA PE NC 2D14:0103 FEC0 INC AL AX=0003 BX=0000 CX=0014 DX=0000 SP=FFEA DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0105 2D14:0105 E2FC LOOP 0103 AX=0003 BX=0000 CX=0013 DX=0000 SP=FFEA DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0103 2D14:0103 FEC0 INC AL

9 AX=0004 BX=0000 CX=0013 DX=0000 SP=FFEA DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0105 NV UP EI PL NZ NA PE NC 2D14:0105 E2FC LOOP 0103 p AX=0017 BX=0000 CX=0000 DX=0000 SP=FFEA DS=2D14 ES=2D14 SS=2D14 CS=2D14 IP=0107 NV UP EI PL NZ NA PE NC 2D14:0107 47 INC DI 4. Manejando archivos de datos, bytes o programas. 4.1 Salvando archivos Se pueden salvar bloques de memoria (que pueden corresponder a instrucciones, a datos o cualquier informacion particular) en archivos. El procedimiento es el siguiente: 1) Utilice el comando N con el siguiente formato: N << [path] file_name>> Si se omite [path], el archivo se generará en el directorio desde el cual se invocó a DEBUG. Con este comando hemos llamado a un archivo file_name, o lo hemos creado si no existía. 2) Usando los dos registros BX y CX escriba el número de bytes que se van a guardar. La parte más significativa se escribe en BX ( Si son menos de 64Kbytes, BX=0000) 3) Comando W. En la sección 5 se muestra un ejemplo. 4.2 Cargando archivos Un archivo que consista de bytes, o que sea un programa ejecutable (.EXE o.com), puede cargarse dentro de DEBUG para examinarse, usarse como datos, etc. Hay dos maneras de hacerlo. Cuando se carga un archivo, los registros BXCX se inicializan con el número de bytes dentro del archivo (parte más significativa en BX). Si éste es un programa, IP se inicializa además con el offset de la primera instrucción. Se puede cargar el archivo o programa al invocar a DEBUG desde DOS: C:> DEBUG PROGRAM.EXE También se puede cargar desde DEBUG con los comandos Name y Load con el formato siguiente: : N PROGRAM.EXE L 5. Ejemplo de un programa en lenguaje máquina y.com Como primer ejemplo, vamos a escribir un programa directamente en lenguaje máquina usando DEBUG. Este programa será guardado como PRUEB1.COM. Es completamente ejecutable desde DOS (o Windows). 5.1 Programa en lenguaje máquina Paso 1: Inicie DEBUG e Paso 2: introduzca los siguientes 48 bytes en la dirección CS:100. Esta dirección se pone para asegurar que se empieza justamente en offset 100 dentro del segmento CS. Esta es una condición de los programas con extensión.com. E CS:100 BA 12 01 B4 09 CD 21 BA 24 01 84 09 CD 21 B4 4C

10 E CS:110 CD 21 0D 0A 43 55 52 53 4F 20 4D 49 43 52 4F 20 E CS:120 49 0D 0A 24 49 4E 45 4C 20 34 32 30 36 0D 0A 24 Paso 3: Indicar en los registros BXCX el número de bytes que se desean guardar, es decir, la longitud del programa. Como 48D = 30H, cargamos CX con 30H, BX=00. Crear el archivo PRUEB1.COM y salvarlo (comando W). DEBUG responde indicando el número de bytes salvados. R CX CX 0034 :30 N PRUEB1.COM W Writing 00030 bytes Ahora podemos correr el programa desde DOS: C:> PRUEB1 CURSO MICRO I INEL 4206 También lo podemos correr dentro de DEBUG con G=100. 5.2 Programa en Assembly: El mismo programa de la subsección anterior puede escribirse dentro de DEBUG con lenguaje ASSEMBLY de la siguiente manera (LAS NEGRITAS INDICAN LO QUE SE ENTRO, CON UN "RETURN" AL FINAL): A 100 2D30:0100 MOV DX, 112 2D30:0103 MOV AH,09 2D30:0105 INT 21 2D30:0107 MOV DX,011C 2D30:010A MOV AH, 09 2D30:010C INT 21 2D30:010E MOV AH, 4C 2D30:0110 INT 21 2D30:0112 DB 0D, 0A, 'MICRO I','$' 2D30:011C DB 0D, 0A, 'INEL 4206' 2D30:0127 DB 0D, 0A, '$' 2D30:012A Puede usted verificar los comandos y el lenguaje máquina con U 100 110 Sin embargo, de 0112 en adelante se ven resultados diferentes a lo que introdujo. Esto se debe a la interpretación que da el comando U a los binarios. Usar entonces D CS:112 6. Archivos con comandos de DEBUG Usted puede escribir, usando un editor de texto, un archivo con los comandos que usaría en una sesión de DEBUG.. Los comandos incluyen el return, que aparece como una línea en blanco. Por ejemplo, supongamos que queremos cambiar el contenido de la memoria 400 a la memoria 402. Podemos probar las instrucciones MOV AL, [400] y MOV [402], AL usando DEBUG. Pero en lugar de abrir DEBUG y hacerlo, sigamos los pasos que se indican: Paso 1. Usando un editor de texto, escriba el siguiente archivo, con A 200 como primera línea ( Respete las líneas en blanco): A 200 MOV AL, [400] MOV [402], AL INT 20 U 200 208 E 400 6C 0 0

11 G =200 E 402 Q Paso 2:. Salve el archivo como EJEM.DEB Paso 3:. En DOS escriba el comando C: > DEBUG<EJEM.DEB En este caso, DEBUG no está cargando un programa, sino que interpreta el contenido de EJEM.DEB como comandos de DEBUG. A 200 inicia la introducción a Assembly; las siguientes tres líneas son el miniprograma que deseamos probar. Una línea en blanco para terminar con Assembly. Después verificamos las instrucciones con U 200 208. Cargamos la memoria 400 con 6C e inicializamos 401 y 402 con 0. Corremos el programa con G=200. Examinamos la memoria 402 para verificar la corrida. Una línea en blanco para salir de E. Finalmente salimos de DEBUG con el comando Q.