9 Clase Ensamblador Debug e Instrucciones Iniciales
9 Clase Ensamblador Debug e Instrucciones Iniciales
9 Clase Ensamblador Debug e Instrucciones Iniciales
UFPS
Clase
DEBUG
Programa del DOS que es utilizado para probar y depurar programas ejecutables. Es muy til para
escribir programas muy pequeos en lenguaje ensamblador, examinar el contenido de un archivo o
examinar el contenido de memoria.
Para empezar a trabajar en debug dgito la su nombre respectivo y pulso enter, al pulsar la entrada o
archivo ejecutable del DOS aparecer el promt de debug el cual es un guin -.
FUNCIONES PRINCIPALES
Caractersticas de Debug
1.
2.
3.
4.
Comandos de DEBUG
Ensamblar
A [Direccin]
C [Direccin de intervalo]
Volcar Desplegar
D [Intervalo]
Escribir Ingresar
E Direccin [Lista]
www.robgon.net
Pgina 1
UFPS
F [Lista de intervalos]
G [=Direccin] [Direcciones]
H Valor 1 Valor 2
Entrada
I Puerto
Cargar en memoria
M Direccin de intervalo
Nombre al programa
Salida
0 Bytes de puerto
P [-Direccin] [Nmero]
Salir
R [Registrar]
S [Lista de intervalos]
T [-Direccin] [Valor]
Desemsamblar
U [Intervalo]
XA [Nmero de pginas]
XD [Identificador]
XS
Ejemplos de DEBUG
1. C:\WINDOWS>debug
-d
Muestra el contenido de memoria a partir del segmento de datos en un desplazamiento de 200H
(6810):(512)
1A9A:0200
AA 0A C0 75 FA 80 3E C0 - D7 00 74 73 E8 68 07 BE
...u..>...ts.h..
1A9A:0210
91 D6 BF 54 CB A0 39 DF - E8 1B 0A E8 FB 09 75 16
...T..9.......u.
1A9A:0220
80 3E 83 CF 00 75 0F BA - 96 80 E8 C3 1F E8 D7 E2
.>...u..........
www.robgon.net
Pgina 2
UFPS
1A9A:0230
BA B8 7E E9 CF 06 80 3E - 8D CF 00 75 42 E8 F1 03
..~....>...uB...
1A9A:0240
72 10 80 3E 83 CF 00 75 - 36 80 3E C1 D7 00 75 46 r
..>...u6.>...uF
1A9A:0250
EB 2D 80 3E 9C D7 00 75 - 07 80 3E 83 CF 00 74 08
.-.>...u..>...t.
1A9A:0260
C6 06 8E CF 01 E9 CA FE - E8 C4 00 74 86 80 3E C2
...........t..>.
1A9A:0270
D7 00 74 03 E9 1F FF C6 - 06 8E CF 01 E9 17 FF 80
..t.............
2. Una palabra rudimentaria en la BIOS nos explica una indicacin rudimentaria de los dispositivos
instalados.
BIOS
-d 40:10 Localidades en que se encuentra instalados los dispositivos detectados por la BIOS
0040:0010
23 C2 FE 80 02 92 10 A0-00 00 28 00 28 00 30 0B
#.........(.(.0.
0040:0020
3A 34 31 02 30 0B 0D 1C-E0 4F E0 50 E0 50 E0 48
:41.0....O.P.P.H
0 1 0 0 0 0 0 1 0 0 0 1 0 portatil
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
11
0 0 0 0 1 0 0 0 1 0 0 0 1 1 = C2 23
www.robgon.net
Pgina 3
UFPS
3. Unas localidades de memoria nos muestra la marca, modelo y derechos de autor de la BIOS
como lo es
-d FE00:0 luego de pulsar enter siguen pulsando d y sigue apareciendo toda la informacin
4. Unas localidades de memoria nos muestra la fecha de la BIOS como lo es
-d FFFFF:5
5. Para cambiar el estado del teclado a encendido
Posicin del Bit
76543210
Decimal
Hexadecimal
Insert activa
Capslock active
0 1 0 0 0 0 0 0 = 64(10) = 40H
Numlock activa
0 0 1 0 0 0 0 0 = 32 (10) = 20H
0 0 0 1 0 0 0 0 = 16 (10) = 10H
Alt presionada
0 0 0 0 1 0 0 0 = 8 (10) = 08H
Ctrl presionada
0 0 0 0 0 1 0 0 = 4 (10) = 04H
0 0 0 0 0 0 1 0 = 2(10) = 02H
0 0 0 0 0 0 0 0 = 1(10) = 01H
Ejemplos:
-e 40:17 10 Activa el scroll lock
-e 40:17 20 Activa el Num Lock
www.robgon.net
Pgina 4
UFPS
Valor de Comb
Insert
Caps
Num
Scroll
Valor de
Comb
F0H
E0H
D0H
C0H
B0H
A0H
09H
08H
Caps
Num
06H
05H
04H
Scroll
03H
02H
01H
X
07H
Insert
00H
ENSAMBLAR EN MEMORIA
Para ensamblar un programa en el Debug se utiliza el comando "a" (assemble); cuando se utiliza este
comando se le puede dar como parametro la direccin donde se desea que se inicie el ensamblado.
Si se omite el parametro el ensamblado se iniciar en la localidad especificada por CS:IP, usualmente
0100H, que es la localidad donde deben iniciar los programas con extensin .COM, y sera la localidad
que utilizaremos debido a que debug solo puede crear este tipo especfico de programas.
Aunque en este momento no es necesario darle un parametro al comando "a" es recomendable hacerlo
para evitar problemas una vez que se haga uso de los registros CS:IP, por lo tanto tecleamos:
-a 0100 [Enter] debido a que el CS contiene 0C1B
Al hacer sto aparecer en la pantalla algo como: 0C1B:0100 y el cursor se posiciona a la derecha de
estos nmeros, ntese que los primeros cuatro dgitos (en sistema hexadecimal) pueden ser diferentes,
pero los ltimos cuatro deben ser 0100, ya que es la direccin que indicamos como inicio. Ahora
podemos introducir las instrucciones:
0C1B:0100 mov ax,0002
www.robgon.net
Pgina 5
UFPS
0C1B:010A
Int 20 No es una instruccin de ensamblador, es una llamada a una interrupcin del sistema operativo.
Para ejecutar el programa que escribimos se utliza el comando "g" (Correr el programa en memoria),
al utilizarlo veremos que aparece un mensaje que dice: "Program terminated normally". Naturalmente
con un mensaje como ste no podemos estar seguros que el programa haya hecho la suma, pero existe
una forma sencilla de verificarlo, utilizando el comando "r" del Debug podemos ver los contenidos de
todos los registros del procesador, simplemente teclee:
- r [Enter]
AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1B ES=0C1B SS=0C1B CS=0C1B IP=010A NV UP EI PL NZ NA PO NC
0C1B:010A 0F DB oF
-g 108, esta instruccin ejecuta el programa, se detiene en la direccin 108 y muestra los contenidos
de los registros.
www.robgon.net
Pgina 6
UFPS
- h 10a 100 ; h obtener la longitud programa donde se hace: dir. final y luego dir. inicial
020A 000A ; resultado del comando anterior donde es: rta de suma y rta resta de las 2 dir anterior.
- n virus.com ; n nos permite colocarle un nombre al programa
- r CX ;cambio el valor del registro CX por el obtenido en el tamao del comando h 000A CX
0000:000A
Nota: Muchas veces toca observar los registros BX y DX para tambin colocarlos en Cero por si
tienen algn valor, pues l Debug toma a uno de estos dos registros como parte alta del CX.
-w ; w escribe el programa en el disco y nos indica cuantos bytes escribio. El programa queda
almacenado en el directorio en D.O.S. que nos encontremos ubicados.
Writing 000A bytes
www.robgon.net
Pgina 7
UFPS
CX: Ao en HEX
DH: Mes 01 al 12
DL: Dia 01 al 31
2. Ejercicios de sumas y restas, e incrementos y decrementos
MOV AX,FFEE
MOV BX,45BC
MOV CX,AX
INC CX
DEC BX
ADD AX,BX
MOV DX,AX
SUB CX,0001
MOV AX,CX
ADD BX,0001
NOP ; Al final de los valores deben quedar igual AX,BX y CX que al inicio del programa.
3. Ejercicio de Pila
MOV AX,8BCF
ADD BX,0002
INC AX
PUSH BX
PUSH AX
INC SP
DEC SP
POP AX
POP BX
MOV CX,BX
NOP
4. Ejemplo de guardar el programa anterior en el disco duro.
1A9A:0100 B8CF8B MOV AX,8BCF
1A9A:0103 83C302 ADD BX,+02
1A9A:0106 40 INC AX
1A9A:0107 53 PUSH BX
1A9A:0108 50 PUSH AX
1A9A:0109 44 INC SP
1A9A:010A 4C DEC SP
1A9A:010B 58 POP AX
1A9A:010C 5B POP BX
1A9A:010D 89D9 MOV CX,BX
1A9A:010F 90 NOP
- h 10F 100
020F 000F
- n prueba.com
- r CX
Modifico el valor del CX pues es el No. que toma Debug para calcular tamao
www.robgon.net
Pgina 8
UFPS
MOV AX,CX
MOV EBX,EDX
Direccionamiento inmediato
Copia un byte, palabra o palabra doble a un registro o localidad de memoria.
Ejemplo: MOV AH,10
MOV AX,A
MOV EDX,22331221H
Direccionamiento directo
Copia un byte, palabra o palabra doble a un registro.
Ejemplo: MOV AX,[ 10H ]
MOV VAT, AX
MOV [ SI ],AX
MOV [ SI + 4 ],AX
Ejemplos
MOV AL,AH
Si
MOV AX,CX Si
www.robgon.net
Pgina 9
UFPS
MOV CX,DH Si
MOV EAX,CX Si
MOV CS,AX No
MOV AX,EDX No
MOV V1,[ SI ] No
Ejemplos
PUSH AX
POP AX
PUSHF
PUSHA
POPA
POP CS
www.robgon.net
Pgina 10
UFPS
Sintaxis: ADD destino, fuente
Ejemplo:
MOV AX,0006 ; Mueve al AX el nmero 0006H
MOV BX,0010 ; Mueve al BX el nmero 0010H
ADD AX,BX ; Suma el contenido del AX con el BX y guarda el resultado en AX=0016H
INT 21H ; Finaliza el programa.
www.robgon.net
Pgina 11
UFPS
Instruccin MOVSX y MOVZX: Se utilizan para complementar las limitaciones de MOV. Permitiendo
mover de un byte a dos y de dos a cuatro sea de una byte a una palabra o de una palabra a una
palabra doble
[ Etiqueta ] MOVS(Z)V [ registro / memoria ], [ registro / memoria / inmediato ]
MOVSX: Para mover valores aritmticos con signo relleno de unos de izquierda a derecha.
MOVZX: Para mover valores sin signo rellena de ceros de izquierda a derecha.
Ejemplo:
Var1 DB 1111b
Var2 DW 10101111b
MOVSX AX,Var1 // Mueve el valor Var1 al AX el cual toma el valor AX=1111 1111
MOVZX EBX,Var2 // Mueve el valor Var2 al EBX el cual toma el valor EBX=0000 0000 1010 1111
MOVSX Var1,AH // Mueve el valor AH a Var1 el cual toma el valor Var1=1111
Instruccin XCHG: Intercambio de los valores de los operandos
Realiza una transferencia de datos diferente a la realizada por MOV Mueve valores copiando del origen
al destino, permitiendo intercambiar los datos del origen al destino y del destino al origen.
Solo se permite su uso para el intercambio de datos entre dos registros y entre registro y memoria.
Por ejemplo:
XCHG AX,CX
XCHG AX,VAR1
XCHG VAR1,BX
Instruccin LEA Load Offset Address : Cargar direccin desplazamiento
Su funcin es la de inicializar un registro con un valor de desplazamiento.
Sintaxis: [ Etiqueta ] LEA [ registro / memoria ]
Ejemplo:
Si suponemos que los valores de los registros son:
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=166C ES=166C SS=166C CS=166C IP=0100 NV UP EI PL NZ NA PO NC
166C:0100 BA3986 MOV DX,8639
VAR3=3434
VAR3 DB 1234
LEA AX,VAR3 // Carga la direccin de desplazamiento de VAR3 al AX:3434
MOV BX,[AX] // Mueve el valor de la posicin 3434 que sera 1
MOV CX,[AX+2] // Mueve el valor de la posicin 3436 que sera 3
www.robgon.net
Pgina 12
UFPS
80H
40H
20H
10H
MOV AX,4C00h
INT 21
holamiamor ENDP
; procedimientos particulares
comoestar ENDP
END
www.robgon.net
.MODEL SMALL
.STACK 64
Pgina 13
UFPS
NUM:
.DATA
POS DB 00
VAX DW ?
VALOR DB 0A0H
CMP AL,20H
JE MNUM
JMP SALIR
MINSERT:
MOV DX,0080H
SUB DS:[17H],DX
MOV AL,DS:[17H]
JMP NUM
MNUM:
MOV DX,0020H
SUB DS:[17H],DX
MOV AL,DS:[17H]
SALIR:
POP DS
MOV AX,4C00h
INT 21
BEGIN ENDP
END BEGIN
.CODE
BEGIN PROC FAR
MOV AX,@DATA
MOV DS,AX
PUSH DS
MOV DX,0000H
MOV BX,40H
MOV DS,BX
MOV AL,DS:[17H]
MOV AH,DS:[18H]
INSERT:
CMP AL,0A0H
JE MINSERT
www.robgon.net
Pgina 14