Está en la página 1de 11

1

NOTAS SOBRE DEBUG CLASE INEL 4206: MICROPROCESADORES I Preparadas por Rogelio Palomera G. Verano 1997. Versin corregida, Febrero 2006 1. Generalidades DEBUG es un programa provisto con DOS. Versiones ms avanzadas de este programa son SYMDEB y CodeView (CV), los cuales se proveen junto con MASM (Micro-Soft Assembler). El nombre sugiere "debugger", que significa programa para corregir errores de programacin en un cdigo. Existen otros programas que cumplen la misma funcin, 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 contnua o una a la vez, y verificar su ejecucin (lo que permite identificar errores -de ah el nombre- entre otras cosas). c) modificar directamente una o ms 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 instruccin de ensamblador. f) crear y cargar archivos

1.2 Limitaciones de DEBUG A) Toda expresin numrica es hexadecimal, con un mximo de cuatro cifras hexadecimales. Se escriben sin el sufijo H B) El ensamblador DEBUG no acepta variables ni smbolos 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 guin. 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 automticamente los registros: Los segmentos de registro se inicializan en el primer lugar de memoria disponible despus de cargar DEBUG, IP=0100, SP= FFEE y los dems registros a 0000. Se puede abrir DEBUG cargndolo con un programa:

2
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 parmetro pedido es opcional. En esta prctica no usamos todos los comandos. 2.2 Parmetros Importantes: Se puede iniciar usando un archivo que contiene comandos de DEBUG: C:\> DEBUG < file.DBG Los parmetros comunes, opcionales o no, son: address: Una direccin puede ser a) un offset 1 a 4 cifras hex - ( ejm 100). , DS es el segmento implcito 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 << nmero de bytes >> El el segundo caso, se indica en hexadecimal el nmero de bytes que abarca el rango.

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 BX-CX indica el nmero 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.

En este caso, los comandos incluidos en el archivo se ejecutan inmediatamente. El comando "?" genera una lista de los comandos de DEBUG : -? assemble compare dump enter fill go hex input load [number] move name output proceed quit A C D E F G H I L M N O P Q [address] range address [range] address [list] range list [=address] [addresses] value1 value2 port [address] [drive] [firstsector] range address [pathname] [arglist] port byte [=address] [number]

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 NV UP EI PL NZ NA PO NC 2D14:0100 0F DB 0F El Flag Register se muestra como NV UP EI PL NZ NA PO NC La ltima lnea muestra: 1. la direccin de la siguiente instruccin (2D14:0100); 2. el lenguaje mquina de la instruccin (0F ) y 3. el lenguaje mnemnico de la instruccin ( DB 0F). Observe que el offset de la direccin de la siguiente instruccin est dado por IP Como los registros se inicializaron, las banderas estn a "0" (cleared), a excepcin de la bandera de interrupcin (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)

Carry (C) 1: yes; 0: no Parity (P) (Even/Odd) Auxiliary half carry (A) (yes/no) Zero (Z) (Yes/ No) Sign (S) (Negative/Positive) Interrupt (I) (Enable/disable) Direction (D) (Decrement/increm ent) Overflow (O) (yes/no)

CY PE AC

NC PO NA

ZR

NZ

NG EI DN

PL DI UP

OV

NV

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 lnea siguiente dos puntos (:), despus de lo cual se introduce el nuevo valor deseado. Ejemplo: -R DS DS 2D14 :2D24 -R

4
AX=0000 BX=0000 BP=0000 SI=0000 DS=2D24 ES=2D14 NV UP EI PL NZ NA 2D14:0100 0F CX=0000 DX=0000 DI=0000 SS=2D14 CS=2D14 PO NC DB 0F SP=FFEE IP=0100 2D14:0100 05.90 38.40 98.37 0A.0B

B2) Escribiendo inmediatamente despus de la direccin la lista desead de bytes (la lista puede escribirse numricamente como nmeros o como ASCII: -E 100 90 40 37 B

2.3.2 Memoria Para trabajar con la memoria se usan tres comandos: E, D y F. En estos tres comandos debemos especificar una direccin 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 direccin nos muestra el contenido de la memoria en esa direccin, 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 direccin DS:0100 es el byte 0E. -E 100 2D14:0100 0E.

-E 200 'ABC' -E 200 2D14:0200 41. 2.3.2.2 Comando D:

42.

43.

Este comando permite ver bloques de memoria, y muestra aquellos lugares con cdigo 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 direccin utilizada con D. B) D <<address>> presenta lo mismo que D, pero a partir de la direccin indicada. C) D << range>> presenta solamente el bloque en el rango indicado. 2.3.2. 3 Comando F <<range>> <<list>>. Permite "llenar" uno o ms 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

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 ms lugares de memoria hay dos formas: B1) Escribiendo inmediatamente despus del punto el nuevo byte deseado. (En el ejemplo, las negritas): -E 100

5
2.3.3 Otros comandos con memoria: A) El comando M <<range>> <<address>> nos permite copiar en la direccin <<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 47-61 2D14:0110 04 8B C6 F7 0A 0A D0 D3-48 2D14:0120 00 DB D2 D3 E0 03 F0 8E-DA 2D14:0130 C0 16 F8 8E C2 AC 8A D0-00 2D14:0140 C2 24 FE 3C B0 75 05 AC-F3 2D14:0150 75 6D 6D 13 A8 01 50 14-74 2D14:0160 8E FC 12 A8 33 D2 29 E3-13 2D14:0170 0B F8 83 FF FF 74 11 26-01 -M 100 105 120 -D 100 130 2D14:0100 0F 00 B9 8A FF F3 AE 47-61 2D14:0110 04 8B C6 F7 0A 0A D0 D3-48 2D14:0120 0F 00 B9 8A FF F3 F0 8E-DA 2D14:0130 C0 . -S 100 130 16 2D14:012B 2D14:012F -S 100 120 'Ga' 2D14:0107 3. Instrucciones en lenguaje ensamblador (mnemnicas) y corriendo programas. 3.1 Comandos U(nassembly) y A(ssembly) 3.1.1 Comando U [<<address>] [<<range>>] Interpreta en forma mnemnica, 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,

03 DA 8B 00 AA B1 8B 1D

1F 2B C7 4E A0 BE C2 E2

8B D0 16 AD 0A 32 03 F3

C3 34 C2 8B EB 01 C3 81

48 00 B6 C8 06 8D 69 00

12 03 01 46 3C 8B 02 94

B1 2D 16 8A B2 1E 00 FA

.......Ga....H.. ........H.+.4.................. ..........N...F. .$.<.u........<. umm...P.t..2.... ....3.)......i.. .....t.&........ .......Ga....H.. ........H.+.4..................

03 1F 8B C3 48 12 B1 DA 2B D0 34 00 03 2D 8B C7 16 C2 B6 01 16

empieza en la direccin CS:0100 o donde indique el programa .exe que se haya cargado. Ver ejemplos: -U 2D14:0100 2D14:0101 2D14:0105 2D14:0106 2D14:0107 2D14:0108 2D14:0109 2D14:010B 2D14:010D 2D14:010E 0F 00B98AFF F3 AE 47 61 031F 8BC3 48 12B1048B DB 0F ADD [BX+DI+FF8A],BH REPZ SCASB INC DI DB 61 ADD BX,[BX] MOV AX,BX DEC AX ADC DH,[BX+DI+8B04]

6
2D14:0112 C6F70A 2D14:0115 0AD0 2D14:0117 D348DA [BX+SI-26],CL 2D14:011A 2BD0 2D14:011C 3400 2D14:011E 032D -U 10A 112 2D14:010A 1F 2D14:010B 8BC3 2D14:010D 48 2D14:010E 12B1048B 2D14:0112 C6F70A MOV OR ROR SUB XOR ADD BH,0A DL,AL WORD PTR DX,AX AL,00 BP,[DI] 2D14:021B -U 210 21B 2D14:0210 88DC 2D14:0212 01D1 2D14:0214 0A0E0423 2D14:0218 B84503 2D14:021B 66 -

MOV ADD OR MOV DB

AH,BL CX,DX CL,[2304] AX,0345 66

POP MOV DEC ADC MOV

DS AX,BX AX DH,[BX+DI+8B04] BH,0A

Este ensamblador elemental no permite variables. Todos los nmeros 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 ejecucin de una instruccin para fines de aprendizaje o de correccin; B) correr programas o secciones de programas para verificarlos. 3.2.1Comando G Este comando ejecuta las intrucciones una despus de la otra. Sus modalidades son: a) G: ejecuta las instrucciones a partir de la direccin CS:IP;

A la derecha de la memoria aparece el lenguage mquina correspondiente a la instruccin en lenguaje mquina que aparece despus de la direccin. Si el byte no corresponde a ningn 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 direccin donde ser colocada la instruccin (La direccin podemos ponerla opcionalmente). Despus de escribir la instruccin, nos responde con una nueva direccin. Continuamos as hasta finalizar. Se sale del modo A oprimiendo <<return>> solamente en la lnea, sin ningn otro dato. NOTA: El comando A solo nos coloca en la direccin siguiente a la ltima vez que se utiliz. Si queremos una direccin particular, hay que agregarla. -A 210 2D14:0210 2D14:0212 2D14:0214 2D14:0218 MOV AH, BL ADD CX, DX OR CL, [2304] MOV AX, 345

b) G = <<address>>: ejecuta las instrucciones a partir de la direccin 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 sealando <<address2>>

7
Si se encuentra con una instruccin invlida etonces o bien se congela la mquina o causa un error. Si todas las instrucciones son vlidas, 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 BP=0000 SI=0000 DI=0000 DS=2D14 SS=2D14 CS=2D14 IP=0100 NV UP EI PL NZ NA PO NC 2D14:0100 B80004 MOV AX,0400 -A 200 2D14:0200 MOV AX, 0400 2D14:0203 MOV [234], AX 2D14:0206 INT 3 2D14:0207 SP=FFEE ES=2D14 -G = 200 AX=0400 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 UP EI PL NZ NA PO 2D14:0206 CC -A 300 2D14:0300 2D14:0303 2D14:0306 2D14:0308 2D14:030A -G=300 C:\> 3.2.2 Comandos T y P: Estos dos comandos funcionan de manera casi similar. Si hay una instruccin 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 instruccin repetitiva, mientras que T solamente ejecuta una instruccin. A) T (P) CX=0000 DX=0000 DI=0000 SS=2D14 CS=2D14 NC INT 3 SP=FFEE IP=0206 NV

MOV MOV MOV INT

AX,0400 [2340], AX AH,4C 21

Ejecuta una instruccin ( subrutina o lazo en caso P), cuya direccin es la que corresponde a la ltima ocasin en que se usaron. Despus de ejecutarla devuelve a la pantalla los registros; si es necesario analizar memoria, entonces podemos hacerlo. B) T <<nmero>> (P <<nmero>> )

Este comando jecuta la cantidad de instrucciones indicada por <<nmero>> .

8
-t C) T=<< address>> P=<< address>> Ejecutan la instruccin en la direccin indicada. Si solamente se da el offset, el segmento es CS. D) T=<< address>> << nmero>> P=<< address>> << nmero>> Ejecuta <<nmero>> instrucciones a partir de la direccin 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 instruccin observe que CX = 0016. Cuando se ejecuta la segunda instruccin: AX=0001 , que es lo que se pidi. Como CX no es cero , se vuelve a la instruccin 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 tambin IP: C:\>debug -a 2D14:0100 mov cx, 16 2D14:0103 inc al 2D14:0105 loop 103 2D14:0107 -t AX=0000 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 NV UP EI PL NZ NA 2D14:0103 FEC0 CX=0016 DX=0000 DI=0000 SS=2D14 CS=2D14 PO NC INC AL SP=FFEE IP=0103 AX=0001 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 NV UP EI PL NZ NA 2D14:0105 E2FC -t AX=0001 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 NV UP EI PL NZ NA 2D14:0103 FEC0 -t 5 AX=0002 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 NV UP EI PL NZ NA 2D14:0105 E2FC AX=0002 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 NV UP EI PL NZ NA 2D14:0103 FEC0 AX=0003 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 NV UP EI PL NZ NA 2D14:0105 E2FC AX=0003 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 NV UP EI PL NZ NA 2D14:0103 FEC0 CX=0015 DX=0000 SP=FFEA DI=0000 SS=2D14 CS=2D14 IP=0105 PE NC LOOP 0103 CX=0014 DX=0000 DI=0000 SS=2D14 CS=2D14 PE NC INC AL SP=FFEA IP=0103 CX=0016 DX=0000 SP=FFEE DI=0000 SS=2D14 CS=2D14 IP=0105 PO NC LOOP 0103 CX=0015 DX=0000 DI=0000 SS=2D14 CS=2D14 PO NC INC AL SP=FFEE IP=0103

CX=0014 DX=0000 SP=FFEA DI=0000 SS=2D14 CS=2D14 IP=0105 PO NC LOOP 0103 CX=0013 DX=0000 DI=0000 SS=2D14 CS=2D14 PO NC INC AL SP=FFEA IP=0103

9
AX=0004 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 NV UP EI PL NZ NA 2D14:0105 E2FC -p AX=0017 BX=0000 BP=0000 SI=0000 DS=2D14 ES=2D14 NV UP EI PL NZ NA 2D14:0107 47 CX=0000 DX=0000 DI=0000 SS=2D14 CS=2D14 PE NC INC DI SP=FFEA IP=0107 CX=0013 DX=0000 SP=FFEA DI=0000 SS=2D14 CS=2D14 IP=0105 PE NC LOOP 0103

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 BX-CX se inicializan con el nmero de bytes dentro del archivo (parte ms significativa en BX). Si ste es un programa, IP se inicializa adems con el offset de la primera instruccin. Se puede cargar el archivo o programa al invocar a DEBUG desde DOS: C:> DEBUG PROGRAM.EXE

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 exista. 2) Usando los dos registros BX y CX escriba el nmero de bytes que se van a guardar. La parte ms significativa se escribe en BX ( Si son menos de 64Kbytes, BX=0000) 3) Comando W. En la seccin 5 se muestra un ejemplo.

Tambin se puede cargar desde DEBUG con los comandos Name y Load con el formato siguiente: : - N - L PROGRAM.EXE

5. Ejemplo de un programa en lenguaje mquina y .COM Como primer ejemplo, vamos a escribir un programa directamente en lenguaje mquina usando DEBUG. Este programa ser guardado como PRUEB1.COM. Es completamente ejecutable desde DOS (o Windows). 5.1 Programa en lenguaje mquina Paso 1: Inicie DEBUG e Paso 2: introduzca los siguientes 48 bytes en la direccin CS:100. Esta direccin se pone para asegurar que se empieza justamente en offset 100 dentro del segmento CS. Esta es una condicin de los programas con extensin .COM. -E CS:100 BA 12 01 B4 09 CD 21 BA 24 01 84 09 CD 21 B4 4C

10
-E 43 -E 36 CS:110 CD 21 0D 0A 43 55 52 53 4F 20 4D 49 52 4F 20 CS:120 49 0D 0A 24 49 4E 45 4C 20 34 32 30 0D 0A 24 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 mquina con U 100 110 Sin embargo, de 0112 en adelante se ven resultados diferentes a lo que introdujo. Esto se debe a la interpretacin 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 usara en una sesin de DEBUG.. Los comandos incluyen el return , que aparece como una lnea 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 lnea ( Respete las lneas en blanco):

Paso 3: Indicar en los registros BX-CX el nmero 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 nmero 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 Tambin lo podemos correr dentro de DEBUG con G=100. 5.2 Programa en Assembly: El mismo programa de la subseccin 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 2D30:0103 2D30:0105 2D30:0107 MOV MOV INT MOV DX, 112 AH,09 21 DX,011C

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 introduccin a Assembly; las siguientes tres lneas son el mini-programa que deseamos probar. Una lnea en blanco para terminar con Assembly. Despus 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 lnea en blanco para salir de E. Finalmente salimos de DEBUG con el comando Q.