9 Clase Ensamblador Debug e Instrucciones Iniciales

14
Fuentes varias e internet UFPS Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 1 DEBUG Programa del DOS que es utilizado para probar y depurar programas ejecutables. Es muy útil para escribir programas muy pequeños en lenguaje ensamblador, examinar el contenido de un archivo o examinar el contenido de memoria. Para empezar a trabajar en debug dígito 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 guión -. FUNCIONES PRINCIPALES Recorrer y modificar la memoria ram Observar y modificar los registros Cargar en memoria programas Ensamblar en memoria directamente un programa Generar programas a partir de codigo en memoria Visualizar y modificar el estado del computador (prtos,inform,etc) Permite ejecutar un programa en modo de paso sencillo (una paso a la vez) de manera que podamos ver el efecto de cada instrucción sobre las localidades de memoria y los registros. Características de Debug 1. Despliega todo el código de un programa y los datos en formato hexadecimal. 2. No distingue entre mayúsculas y minúsculas. 3. Se debe colocar un espacio entre el comando y el parámetro. 4. Su despliegue consta de tres partes: (Izquierda) Dirección hexadecimal del último byte de la izquierda que se despliega en forma segmento:desplazamiento. (Centro) Representación hexadecimal del área desplegada. (Derecha) Representación en ASCII de los bytes que contienen caracteres desplegables. 5. Cada línea desplegada consta de 16 bytes separados en 8 bytes por un guión “-”. 6. Por cada byte en la línea se representan por dos caracteres hexadecimales más un espacio en blanco. 7. Teclas F1 repite carácter por carácter de la ultima instrucción y F5 la repite toda. Comandos de DEBUG Ensamblar A [Dirección] Comparar bloques de memoria C [Dirección de intervalo] Volcar “Desplegar” D [Intervalo] Escribir “Ingresar” E Dirección [Lista] Clase

description

Guia basica de Clase programacion Ensamblador, debug e instrucciones Iniciales para comenzar a programar

Transcript of 9 Clase Ensamblador Debug e Instrucciones Iniciales

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 1

DEBUG

Programa del DOS que es utilizado para probar y depurar programas ejecutables. Es muy útil para escribir programas muy pequeños en lenguaje ensamblador, examinar el contenido de un archivo o examinar el contenido de memoria.

Para empezar a trabajar en debug dígito 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 guión “-”.

FUNCIONES PRINCIPALES

Recorrer y modificar la memoria ram

Observar y modificar los registros

Cargar en memoria programas

Ensamblar en memoria directamente un programa

Generar programas a partir de codigo en memoria

Visualizar y modificar el estado del computador (prtos,inform,etc)

Permite ejecutar un programa en modo de paso sencillo (una paso a la vez) de manera que podamos ver el efecto de cada instrucción sobre las localidades de memoria y los registros.

Características de Debug

1. Despliega todo el código de un programa y los datos en formato hexadecimal. 2. No distingue entre mayúsculas y minúsculas. 3. Se debe colocar un espacio entre el comando y el parámetro. 4. Su despliegue consta de tres partes:

(Izquierda) Dirección hexadecimal del último byte de la izquierda que se despliega en forma segmento:desplazamiento.

(Centro) Representación hexadecimal del área desplegada.

(Derecha) Representación en ASCII de los bytes que contienen caracteres desplegables.

5. Cada línea desplegada consta de 16 bytes separados en 8 bytes por un guión “-”. 6. Por cada byte en la línea se representan por dos caracteres hexadecimales más un espacio en

blanco. 7. Teclas F1 repite carácter por carácter de la ultima instrucción y F5 la repite toda.

Comandos de DEBUG

Ensamblar A [Dirección]

Comparar bloques de memoria C [Dirección de intervalo]

Volcar “Desplegar” D [Intervalo]

Escribir “Ingresar” E Dirección [Lista]

Clase

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 2

Llenar localidades memoria con valores F [Lista de intervalos]

Ir hasta un punto especificado G [=Dirección] [Direcciones]

Hex “Suma y diferencia de 2 HEX” H Valor 1 Valor 2

Entrada I Puerto

Cargar en memoria L [Dirección] [Unidad] [1 Sector] [Número]

Mover el contenido de memoria M Dirección de intervalo

Nombre al programa N [Nombre ruta] [Lista de argumentos]

Salida 0 Bytes de puerto

Proceder a llamar una subrutina P [-Dirección] [Número]

Salir Q

Registrar “mostrar” registros R [Registrar]

Buscar caracteres en memoria S [Lista de intervalos]

Seguimiento paso a paso T [-Dirección] [Valor]

Desemsamblar U [Intervalo]

Escribir un archivo desde debug W [Dirección] [Unidad] [1 Sector] [Número]

Asignar memoria expandida XA [Número de páginas]

Desasignar memoria expandida XD [Identificador]

Asignar páginas de memoria expandida XM [Lpágina] [Ppágina] [Identificador]

Mostrar estado de memoria expandida 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..........

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 3

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 indicación 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

23C2 es una localidad de memoria para pasarlo a la realidad sebemos invertirlo:

23 C2 = C2 23 en binario es 1100001000100011

1 1 0 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

1 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 = C2 23

Para la siguiente explicación nos basamos en:

15,14 (2 bits) Números de puertos paralelos conectados. En el ejemplo es 3

00=0 01=1 10=2 11=3 BIOS maneja 3 estados Normal, EPP, ECP

por eso en el ejemplo nos da resultado 3 puertos

11-9 (3 bits) Número de puertos seriales conectados. En el ejemplo es 1

000=0 001=1 010=2 011=3

7,6 (2 bits) Número de dispositivos de disco flexible. En el ejemplo es 0

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 4

00=1 01=2 10=3 11=4

5,4 (2 bits) Modo inicial de vídeo. En el ejemplo es 80 x 25 a color.

00 = No usado 01 = 40*25 color 10 = 80*25 color 11= 80*25 Mono

2 Mouse instalado 1= Si En el ejemplo es No=0

1 Coprocesador matemático presente. En el ejemplo es Si = 1

0 Unidad de disco flexibles presente. En el ejemplo es Si = 1

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 información

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

Posición del Bit 7 6 5 4 3 2 1 0 Decimal Hexadecimal

Insert activa 1 0 0 0 0 0 0 0 = 128 (10) = 80H

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

Scroll Lock active 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

Shift izquierdo presionado 0 0 0 0 0 0 1 0 = 2(10) = 02H

Shift derecho presionado 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 ”

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 5

-e 40:17 40 “Activa el Caps Lock ”

-e 40:17 60 “Activa el Num lock y el Caps Lock ”

-e 40:17 50 “Activa el Caps Lock y el Scroll Lock ”

-e 40:17 00 “Desactiva todo ”

Suma total de valores de combinaciones

Valor de Comb Insert Caps Num Scroll Valor de Comb

Insert Caps Num Scroll

F0H X X X X 06H X X

E0H X X X 05H X X

D0H X X X 04H X

C0H X X 03H X X

B0H X X X 02H X

A0H X X 01H X

09H X X 00H

08H X

07H X X X

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 dirección 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 extensión .COM, y sera la localidad que utilizaremos debido a que debug solo puede crear este tipo específico 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 números, nótese que los primeros cuatro dígitos (en sistema hexadecimal) pueden ser diferentes, pero los últimos cuatro deben ser 0100, ya que es la dirección que indicamos como inicio. Ahora podemos introducir las instrucciones:

0C1B:0100 mov ax,0002 ; coloca el valor 0002 en el registro ax

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 6

0C1B:0103 mov bx,0004 ; coloca el valor 0004 en el registro bx

0C1B:0106 add ax,bx ; le adiciona al contenido de ax el contenido de bx

0C1B:0108 int 20; provoca la terminación del programa y se vuelve al prompt del debug

0C1B:010A

Int 20 No es una instrucción de ensamblador, es una llamada a una interrupción 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 instrucción ejecuta el programa, se detiene en la dirección 108 y muestra los contenidos de los registros.

GUARDAR Y CARGAR LOS PROGRAMAS

Los pasos a seguir para guardar un programa ya almacenado en la memoria son:

1. Obtener la longitud del programa restando la dirección final de la dirección inicial, naturalmente en sistema hexadecimal.

2. Darle un nombre al programa y extensión. 3. Poner la longitud del programa en el registro CX. 4. Ordenar al Debug que escriba el programa en el disco.

Al terminar de ensamblar el programa se vería así:

0C1B:0100 mov ax,0002

0C1B:0103 mov bx,0004

0C1B:0106 add ax,bx

0C1B:0108 int 20

0C1B:610A

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 7

- 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 tamaño del comando h “000A” CX 0000:000A

Nota: Muchas veces toca observar los registros BX y DX para también colocarlos en Cero por si tienen algún 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

Para cargar un archivo ya guardado son necesarios dos pasos:

Proporcionar el nombre del archivo que se cargará. Cargarlo utilizando el comando "l" (load).

- n prueba.com ; n coloca el nombre de prueba.com

- l ; l carga programa

- u 100 109 ; u verificar que el programa se cargo en memoria (desensambla para mostrarlo) siempre se cargan a partir de la dirección 100H

0C3D:0100 B80200 MOV AX,0002

0C3D:0103 BB0400 MOV BX,0004

0C3D:0106 01D8 ADD AX,BX

0C3D:0108 CD20 INT 20

EJERCICIOS 1. Explicación de la Interrupción INT 21 para obtener datos de la BIOS -a 0100 1A9A:0100 Mov AH,2A EN LA PROXIMA INSTRUCCION EL IP AUMENTO EN 2 1A9A:0102 INT21 1A9A:0104 NOP Ejecutemos -r para observar los contenidos de los registros y ejecutemos el paso a paso pero con -p La fecha de la BIOS se nos da de la siguiente manera: AL: Día de la semana donde 0= domingo

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 8

CX: Año 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 Realizo el calculo del tamaño en bytes del programa en memoria. 020F 000F Retorna la SUMA y RESTA de los valores colocados como parámetros. - n prueba.com Defino el nombre para mi archivo - r CX Modifico el valor del CX pues es el No. que toma Debug para calcular tamaño

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 9

-w Escribo el programa en disco osea genero un archivo Writing 000F bytes

INSTRUCIONES INICIALES

Instrucción MOV: Transferencia de datos entre celdas de memoria, registros y acumulador.

Sintaxis: MOV Destino,Fuente Donde Destino es el lugar a donde se moverán los datos y fuente es el lugar donde se encuentran dichos datos. Los diferentes movimientos de datos permitidos para esta instrucción son: Direccionamiento de Registro Copia un byte, palabra o palabra doble a un registro. Ejemplo: MOV AH,AL 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 EDX, [ 23H ] Direccionamiento indirecto por registro Copia un byte, palabra o palabra doble entre un registro y la localidad de memoria direccionada por un registro índice o base. Ejemplo: MOV AX,[ BX ] MOV [ SI ],AX MOV EDX, [ EDI ] Direccionamiento base más índice Copia un byte, palabra o palabra doble entre un registro y la localidad de memoria direccionada por un registro base mas un registro índice. Ejemplo: MOV AX,[ BX + SI ] MOV [ BX + DI ], AX MOV EDX, [ EBX + ESI ] Direccionamiento relativo al registro Copia un byte, palabra o palabra doble entre un registro y la localidad de memoria direccionada por un registro índice o base más un desplazamiento. Ejemplo: MOV AX,[ BX + 2] MOV [ SI + 4 ],AX MOV EDX, [ EDI +1]

Ejemplos MOV AL,AH Si MOV AX,CX Si

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 10

MOV EBX,EDX Si MOV CX,DH Si MOV EDX,AL Si MOV EAX,CX Si MOV SI,DI Si MOV CS,AX No MOV BL,DX No MOV AX,EDX No MOV ES,DS No MOV V1,[ SI ] No Instrucción PUSH: Coloca una palabra en la pila 2 o 4 bytes.

Sintaxis: PUSH fuente La instrucción PUSH decrementa en dos el valor de SP y luego transfiere el contenido del operando fuente a la nueva dirección resultante en el registro recién modificado. El decremento en la dirección se debe a que al agregar valores a la pila ésta crece de la dirección mayor a la dirección menor del segmento, por lo tanto al restarle 2 al valor del registro SP lo que hacemos es aumentar el tamaño de la pila en dos bytes, que es la única cantidad de información que puede manejar la pila en cada entrada y salida de datos. Ejemplo: Suposición SP=FFEE PUSH AX ; Coloca en el registro de pila el valor de AX y decremento el SP SP=FFEC PUSH BX ; Coloca en el registro de pila el valor de BX y decremento el SP SP=FFEA Instrucción POP: Recupera un dato de la pila de 2 bytes o 4 bytes Sintaxis: POP destino Esta instrucción transfiere el último valor almacenado en la pila al operando destino, despues incrementa en dos el registro SP. Este incremento se debe a que la pila va creciendo desde la dirección mas alta de memoria del segmento hacia la mas baja, y la pila solo trabaja con palabras (2 bytes), entonces al incrementar en dos el registro SP realmente se le esta restando dos al tamaño real de la pila. Ejemplo: Suposición de que el SP= FFEA POP AX ; Saca del registro de pila el valor de AX e incrementa el SP SP=FFEC POP BX ; Saca del registro de pila el valor de BX e incrementa el SP SP=FFEE

Ejemplos PUSH AX Copia a la pila el valor contenido en AX POP AX Saca el valor apuntado por el SP, y lo copia en el registro AX PUSHF Copia el estado de las banderas sobre la pila PUSHA Copia las palabras registro propósito general, apuntadores e índices en la pila. POPA Proceso inverso al anterior. POP CS Instrucción ILEGAL Instrucción ADD: Adición de los operandos.

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 11

Sintaxis: ADD destino, fuente Suma los dos operandos y guarda el resultado en el operando destino. Ejemplo: MOV AX,0006 ; Mueve al AX el número 0006H MOV BX,0010 ; Mueve al BX el número 0010H ADD AX,BX ; Suma el contenido del AX con el BX y guarda el resultado en AX=0016H INT 21H ; Finaliza el programa. Instrucción SUB: Substracción de operandos.

Sintaxis: SUB destino, fuente

Resta el operando fuente del destino. Ejemplo: MOV AX,02E4H ; Mueve al AX el número 02E4H MOV BX,00FFH ; Mueve al BX el número 00FFH SUB AX,BX ; Suma el contenido del AX con el BX y guarda el resultado en AX=01E5H INT 21H ; Finaliza el programa. Instrucción DEC: Decrementar el operando

Sintaxis: DEC destino Esta operación resta 1 al operando destino y almacena el nuevo valor en el mismo oeprando. Ejemplo: MOV AX,4567 ; Mueve al AX el número 4567H MOV BX,1234 ; Mueve al BX el número 1234H DEC AX ; Decrementa el AX en 1 osea el AX=4566H DEC BX ; Decrementa el BX en 1 osea el BX=1233H Instrucción INC: Incrementar el operando.

Sintaxis: INC destino La instrucción suma 1 al operando destino y guarda el resultado en el mismo operando destino. Ejemplo: MOV AX,4567 ; Mueve al AX el número 4567H MOV BX,1234 ; Mueve al BX el número 1234H INC AX ; Incrementa el AX en 1 osea el AX=4568H

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 12

INC BX ; Incrementa el BX en 1 osea el BX=1235H Instrucción 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 aritméticos 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 Instrucción 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

Instrucción LEA “Load Offset Address” : Cargar dirección desplazamiento Su función 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 dirección de desplazamiento de VAR3 al AX:3434 MOV BX,[AX] // Mueve el valor de la posición 3434 que sería 1 MOV CX,[AX+2] // Mueve el valor de la posición 3436 que sería 3

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 13

Valor de las teclas Insert 80H Caps Lock 40H Bloq Num 20H Scroll Lock 10H

ESTRUCTURA BASICA PARA HACER UN PROGRAMA .EXE

.MODEL SMALL ; modelo de memoria (1 segmento de código 1 segmento de datos)

.386 ; directiva para ejecutar instrucciones a 32 bits

.STACK 64 ; declaración segment de pila

.DATA ; declaración del segmento de datos

; aca van todas las variables .CODE holamiamor PROC FAR ; declaración del segmento de código principal

MOV AX,@DATA ; inicio asociativo segmento de código y de datos MOV DS,AX ; carga la dirección al segmento de datos

… ; aca va todo el código del programa

… MOV AX,4C00h ; carga de la interrupción para salir al S.O. INT 21 ; ejecución de la interrupción llamando al valor que está en el AX

holamiamor ENDP ;fin del segmento de código comoestas PROC NEAR ;inicio procedimiento particular

… ; procedimientos particulares … comoestar ENDP ;fin del procedimiento particular END ; fin de todo el programa

Programa para cambiar el estado de las teclas Page 60,120 TITLE programa cambio del estado de las teclas

.MODEL SMALL

.STACK 64

Fuentes varias e internet UFPS

Esp.I.S Miguel Fabian Robles A. www.robgon.net Material Arq del Compt UFPS Página 14

.DATA POS DB 00 VAX DW ? VALOR DB 0A0H .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

NUM: 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