Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

9 Clase Ensamblador Debug e Instrucciones Iniciales

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 15

Fuentes varias e internet UFPS

DEPURADORES

Programas utilizados 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.

Los depuradores son tan potentes que podemos realizar la corrección de un error y luego generar
nuevamente el programa, esto vincula la violación de un código de seguridad de un programa para
conocerlo y/o modificarlo, permitiendo usar la aplicación libremente.

Existen depuradores de ALTO NIVEL y de BAJO NIVEL, para nuestro caso nos interesa de BAJO
NIVEL, lo que permite mirar un programa DESEMSAMBLADO, proceso inverso a ENSAMBLAR.

• ENSAMBLADOR: Convertir un lenguaje simbólico “ensamblador“ a un lenguaje de máquina.


es un lenguaje de programación de bajo nivel. Consiste en un conjunto de mnemónicos que
representan instrucciones básicas para los computadores.

Entre algunos ensambladores tenemos:

MASM FASM NASM GAS YASM TASM

• DESEMSAMBLADOR: Traduce lenguaje de maquina a lenguaje ensamblador (INGENIERÍA


INVERSA o RETROINGENIERÍA. Algunos desensambladores hacen uso de la información de
depuración simbólica presente en los archivos objeto tales como el ELF (Executable and
Linkable Format).

Entre algunos desensambladores tenemos:

IDA SoftICE GNU Debugger Ollydbg RosASM

• RETROINGENIERIA: Proceso de conocer información y/o diseño a partir de un producto


(software) terminado.

DEPURADORES ACTUALES:

SofICE: Depurador en modo kernel propietario y de pago para Microsoft Windows. Está diseñado para
ejecutarse debajo de Windows, de tal manera que el Sistema Operativo desconozca su presencia. A
diferencia de un depurador de aplicaciones, SoftICE es capaz de suspender todas las operaciones en
Windows cuando se desee, lo cual resulta útil para depurar drivers ya que es importante conocer cómo
se accede al hardware así como las funciones del sistema operativo.

WinDBG: El Depurador de Windows (WinDbg) se puede usar para depurar código en modo kernel y
modo usuario, para analizar volcados de memoria y para examinar los registros de la CPU mientras se
ejecuta el código.

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 1
Fuentes varias e internet UFPS

https://www.microsoft.com/es-co/p/windbg-preview/9pgjgd53tn86?rtc=1&activetab=pivot:overviewtab

Ollydbg: Depurador de código ensamblador de 32 bits para sistemas operativos Microsoft Windows.
Pone especial énfasis en el análisis del código binario, esto lo hace muy útil cuando no está disponible
el código fuente del programa.1 Traza registros, reconoce procedimientos, llamadas a las API, swiches,
tablas, constantes y strings, así como localiza rutinas de archivos objeto y de bibliotecas

x64dbg: Depurador para plataformas de 32 y 64 bits, bajo entornos MICROSOFT muy potente como
otros depuradores, y gran complejidad en su entorno de manejo y estructura.

DEBUG A 16 BITS

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 código 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.

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 2
Fuentes varias e internet UFPS
(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]

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]

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 3
Fuentes varias e internet UFPS
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..........

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

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 4
Fuentes varias e internet UFPS
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

11 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

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 76543210 Decimal Hexadecimal

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 5
Fuentes varias e internet UFPS
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 ”

-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 Insert Caps Num Scroll
Comb

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

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 6
Fuentes varias e internet UFPS
Valor de Comb Insert Caps Num Scroll Valor de Insert Caps Num Scroll
Comb

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

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

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 7
Fuentes varias e internet UFPS
-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

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

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 8
Fuentes varias e internet UFPS
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
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

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 9
Fuentes varias e internet UFPS
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

-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

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 10
Fuentes varias e internet UFPS

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


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

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 11
Fuentes varias e internet UFPS

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.

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

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 12
Fuentes varias e internet UFPS
SUB AX,BX ; Resta 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
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

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 13
Fuentes varias e internet UFPS
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

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
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 14
Fuentes varias e internet UFPS

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 CMP AL,0A0H


TITLE programa cambio del estado de las teclas JE MINSERT
.MODEL SMALL NUM:
.STACK 64 CMP AL,20H
JE MNUM
.DATA JMP SALIR
POS DB 00 MINSERT:
VAX DW ? MOV DX,0080H
VALOR DB 0A0H SUB DS:[17H],DX
MOV AL,DS:[17H]
.CODE JMP NUM
BEGIN PROC FAR MNUM:
MOV AX,@DATA MOV DX,0020H
MOV DS,AX SUB DS:[17H],DX
PUSH DS MOV AL,DS:[17H]
MOV DX,0000H SALIR:
MOV BX,40H POP DS
MOV DS,BX MOV AX,4C00h
MOV AL,DS:[17H] INT 21
MOV AH,DS:[18H] BEGIN ENDP
INSERT: END BEGIN

Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 15

También podría gustarte