Computing">
Assembler y Debug1
Assembler y Debug1
Assembler y Debug1
Debug:
-e 5000
La instrucción –e muestra el contenido en memoria. En este caso se posiciona en la
dirección de memoria 5000 y muestra su contenido. En este caso la posición de
memoria 5000 posee el contenido 34.
:5000 34
Utilizando el punto se puede cambiar el valor agregando un nuevo valor después del
punto. Se pueden colocar dos dígitos en hexa equivalente a 1 byte en binario por cada
posición de memoria. Al colocar .11 posteriormente al valor se reemplazará el
contenido de la posición 5000 por el valor 11.
:5000 34.11
Si luego del punto se deja un espacio con la barra espaciadora muestra la siguiente
posición de memoria.
Si uno modifica un valor con el punto y luego da espacios también muestra los
contenidos de las siguientes posiciones de memoria y puede cambiarlos.
AX [ AH | AL ] = Acumulador
16 bits.
8 bits AH y 8 bits AL.
BX = Registro base, suele tener la posición de inicio de una tabla de valores.
CX = Registro contador.
DX = Registro de datos multiuso.
Los registros acumuladores son llamados AX, BX, CX y DX. El registro BX también
puede utilizarse como puntero para guardar direcciones que apunten a posiciones de
memoria.
Los registros AX, BX, CX y DX son de 16 bits, pero si se necesita operar con 8 bits
cada uno de estos registros se divide en dos registros de 8 bits, la parte alta y baja del
registro de 16 bits y se denominan con H y L.
Los registros SI y DI son registros punteros para manejar listas. SI es indice fuente y DI
indice destino.
Los registros SP y BP manejan Pilas.
DS, CS, SS, ES son registros de segmento de datos, de código, de stack y extra.
CS señala la dirección del segmento de código de programa que se esta ejecutando.
DS señala la dirección del segmento de datos del programa en ejecución.
SS señala la dirección del segmento donde esta la pila del programa
ES es un segmento auxiliar para señalar espacio extra o almacenar direcciones
intermedias momentáneamente.
Ejemplo de instrucciones
Una Suma
Add AX, [5000]
Los Flags son indicadores que pueden valer 1 o 0, es decir 1 bit y pueden ser utilizados
o no por la siguiente instrucción.
Estos indicadores constituyen el registro de estado y son esenciales para las
instrucciones e salto.
Instrucciones de salto
JB Jump if below
JBE Jump Below or equal
JA Jump up
JAE Jump up or equal
JNZ Jump if not 0
JZ Jump if 0 o letras.
Instrucción de comparación
CMP AH, FF
CMP Ax, Bx
Luego de los comandos se presiona enter y en los casos que corresponde puede ponerse
un nuevo valor.
-r
Muestra el estado de todos los registros y el estado de los flags.
Los dos primeros renglones indican el estado de los registros de la CPU. El tercer
renglón se refiere a la memoria principal.
Luego muestra en el centro 1a instrucción y a la izquierda de esta el código máquina.
-rf modifica las banderas o flags. Ejemplo: flag de carry NC , sin carry, si pongo -rf cy
y enter queda CY, es decir que hay carry.
-r ip
Examina donde esta apuntando el registro IP. Ej IP 0100:
Mediante este comando indica la primera instrucción a ejecutar.
Luego de los dos puntos se puede cambiar la dirección hacia adonde apunta el IP.
Se utiliza cuando escribo un programa para luego decirle al instruction pointer o
contador de programa adonde va a comenzar mi programa, ej -r ip enter e ingreso la
dirección 0100.
-d
Muestra exploración de la memoria como datos. -d 00:00. El primer par de ceros es el
segmento y el segundo par el offset o desplazamiento. Si estoy en el data segment
escribo los datos ahí.
-u
Muestra exploración de la memoria como código o instrucciones de programa. A partir
de u puedo poner el segmento de código, ej -u 073f enter y me muestra la memoria
como instrucciones. Si estoy en el code segment escribo el código ahí.
u 0100 10A muestra el código desde la direccion 0100 hasta la 10A.
-a
El comando a sirve para comenzar a escribir programas en assembler. A partir de a se
escribe la dirección de memoria a partir de la cual se quiere escribir el programa. En
general los programas .com comienzan a partir de la dirección 0100.
Los corchetes indican datos en memoria. Un registro entre corchetes indica la direccion
de datos en memoria. Un número entre corchetes indica modo de direccionamiento
directo, se da la dirección para localizar en memoria el dato a procesar.
-a 0100
La a significa Assamble. Se posiciona en la dirección de memoria y comienza a
ensamblar.
-p
Significa proceed. va paso a paso, no se mete en las subrutinas. Es la forma que
utilizaremos.
-t
Trace. Sigue paso a paso la ejecución del programa. Se mete en las subrutinas.
-g
Ejecuta hasta que termina en el int 20
-ret
se utiliza desde una llamada Call.
-n test.com
n le da un nombre al programa. el este caso se llamará test.com.
Para escribir un programa en disco hay que escribir en el registro CX el tamaño del
programa. Hay que verificar que el registro DX valga 0000. Por ejemplo, si el programa
tiene 11 bytes o B en hexa, escribo -r cx y enter. Cuando me pide ingresar el valor de
cx despues de los : pongo el tamaño del programa, en este caso b y luego enter.
-w
Escribe el programa en el directorio por defecto. luego al ejecutar el comando dir tendre
el archivo test.com.
Para cargar el programa en la memoria del debug desde el disco debo escribir para el
ejemplo:
-n test.com
-l enter (L de cargar o load).
Cuando quiero cambiar una instrucción ya escrita en un programa debo tener cuidado
del tamaño que ocupa dicha instrucción, ya que si es reemplazada por otra mas grande
me arruinará el programa. Antes de reemplazar una instrucción es bueno grabar el
programa.
Ejercicios:
-e 5000 00.03
-e 5006 00.05
-A 0200
:0200 MOV AX, [5000] llevar a AX una copia de P que esta en 5000-5001
:0203 ADD AX, [5000] Sumar a AX una copia de P.
:0207 SUB AX, [5006] restar a AX una copia de Q que esta en 5006-5007
:020B MOV [5010], AX transferir a 5010 y 5011 una copia de AX.
:020E
-e 5010 00.01
Los corchetes indican datos en memoria. Si una instrucción tiene un número entre
corchetes se dice que esta en modo de direccionamiento directo, se da la dirección para
localizar en memoria el dato a procesar.
:0100 MOV CX, [B310] Lleva a CX una copia de N que esta en B310 y B311.
:0104 MOV BX, [B300] lleva a BX una copia de M que esta en B300 y 301
:0108 SUB AX, AX Pone el acumulador AX en cero restandolo a si mismo.
:010A ADD AX, BX Sumar a AX el valor valor de M que esta en BX
:010C DEC CX Resta uno a CX, pueden cambiar los flags.
:010D JNZ 010A Si respecto al resultado anterior el flag Z=0 salta a 010 A
:010F MOV [B320], AX Lleva a B320 y 321 en memoria el valor de AX
:0112 INT 20 fin.
:0100 MOV CX, [B310] Lleva a CX una copia de N que esta en B310 y B311.
:0104 MOV BX, [B300] lleva a BX una copia de M que esta en B300 y 301
:0108 SUB AX, AX Pone el acumulador AX en cero restandolo a si mismo.
:010A ADD AX, BX Sumar a AX el valor valor de M que esta en BX
:010C JO 0130 Si el flag V = 1, saltar a :0130
:010E DEC CX Resta uno a CX, pueden cambiar los flags.
:010F JNZ 010A Si respecto al resultado anterior el flag Z=0 salta a 010 A
:0111 MOV [B320], AX Lleva a B320 y 321 en memoria el valor de AX
:0114 INT 20 fin.
A 0130
:0130 MOV AX, FFFF Llevar a AX una copia de la constante FFFF
:0133 MOV [B320],AX Llevar a B320 y B321 de memoria una copia de AX
:0136 INT 20 fin.
Manejo de Listas
-e 1500
03 cantidad de elementos que integran la lista.
-e 1000
Posición donde empieza la lista.
-a 100
0100: MOV Cl, [1500] Carga en el contador Cl la longitud de la lista.
0104: MOV SI, 1000 El puntero SI apunta al comienzo de la lista.
0107: SUB AX, AX Pone Ax en 0
0109: ADD AX, [SI] Suma a AX un nro de la lista apuntada por SI.
010B: ADD SI, 2 Suma 2 a SI. Ahora apunta a 1002.
010E: DEC Cl Decrementa Cl.
0110: JNZ 109 Mientras Z=0, vuelve a 109.
0112: MOV [2000], AX
0115: INT 20
-r ip
-g
-e 2000.
Ejercicio 7: De una lista de naturales encontrar los que representan la letra e, contarlos
y guardar en otra lista las direcciones donde se encuentran.
Ejercicio 8: Se tiene una lista de numeros naturales de 1 byte cada uno que empieza en
la direccion 2000. Su longitud está en la dirección 1500. Encontrar el mayor de los
números de la lista y guardarlo en la direccion 3000.
:0100 MOV CL, [1500] Carga en CL la longitud de la lista que esta en 1500.
:0104 MOV SI, 2000 SI apunta al comienzo de la lista de datos.
:0107 MOV AL, [SI] Lleva el primer nro de la lista a AL, suponiendo mayor.
:0109 INC SI Incrementa el puntero SI para tomar el segundo nro.
:010A DEC CL Decrementa CL, pues ya se tomó el primer nro de la lista.
:010C CMP AL, [SI] Compara el nro supuesto mayor en AL con el sig de SI.
:010E JA 0112 Saltar a 0112 si el nro que está en AL está por arriba.
:0110 MOV AL, [SI] Carga en AL el nuevo nro mayor apuntado por SI.
:0112 INC SI Incrementa SI para apuntar al prox elemento.
:0113 DEC CL Decrementa CL.
:0115 JNZ 010C Mientras Z sea 0, volver a 010C.
:0117 MOV [3000], AL Carga en 3000 el número mayor.
:011A INT 20 Fin.