Curso Radasm III

16
1 [RVLCN] C la ses de P r o gr a m aciOn CON M A SM +Ra da sm C a pitul o I I I :R e g i s tro s de l M icro Pro ce s a do r Escrito por: ^A|An M0r3N0^ Consejero: RedH@wk DESCARGO LEGAL El presente escrito, creado para fines educacionales e investigacion. Es de libre distribucion, siempre que se conserve intacto el contenido y se precise derechos de autor.

Transcript of Curso Radasm III

Page 1: Curso Radasm III

1 [RVLCN]

C l a ses de P r o gr a m a c iO n C O N M ASM +Ra da sm

C a p itulo I I I : R e gis tro s de l M icro Pro ce s a do r

Escrito por: ^A|An M0r3N0^ Consejero: RedH@wk

DESCARGO LEGAL

El presente escrito, creado para fines educacionales e investigacion. Es de libre distribucion, siempre que se conserve intacto el contenido y se precise

derechos de autor.

Page 2: Curso Radasm III

2 [RVLCN]

[ Registros del Microprocesador ] Nuestro procesador necesita registros para almacenar datos, y pueden ser utilizados libremente. Entre los principales registros tenemos: Registros de Propó sitos generales. Son 4 registros EAX, EBX, EDX, ECX y se emplea para uso general, y se subdividen en:

EAX, EBX, ECX,EDX (32 bits ) AX, BX, CX, DX (16 bits)

AH, BH, CH, DH (8 bit, H = Hight ). AL, BL, CL, DL (8 bit L = Low). Ejemplo EAX = 12345678 AX = 5678 AH = 56 AL = 78 El procesador 80368 permite el uso de estos registros: EAX, EBX, ECX, EDX que son de 32 bits.

Registros de uso general

Descripció n

EAX (Acumulador) Es utilizado para operaciones aritméticas (suma, resta, divisió n, multiplicació n). Algunas Funciones después de ser utilizadas devuelven un valor a EAX.

EBX (Base) Se utiliza para direccionar el acceso a datos, situados en la memoria, también se puede utilizar para operaciones aritméticas.

ECX (Contador) Se utiliza como contador por algunas instrucciones, también es utilizado para operaciones aritméticas.

EDX (Datos) Algunas operaciones de entrada/salida requieren su uso, y las operaciones de multiplicació n y divisió n con cifras grandes suponen al EDX y al EAX trabajando juntos. Puede usar los registros de propó sitos para suma y resta de cifras de 8, 16, 32 bits.

Registros de Indice Descripció n ESI El registro índice de 16 bits es requerido por

algunas operaciones con cadenas (de caracteres). EDI El registro índice destino también es requerido por

algunas operaciones con cadenas de caracteres. Registro de banderas Descripció n

Se usa para registrar la informació n de estado y de control de las operaciones del microprocesador, y son 9, CF, OF, ZF, SF, PF, AF, DF, IF, TF.

Page 3: Curso Radasm III

3 [RVLCN]

[ Instrucciones del Microprocesador ] Las instrucciones son secuencias de bits (unos y ceros), e indican que operació n debe hacer y con que dato se debe realizar la operació n, por ahora veremos 11 instrucciones:

MOV (Mover) Destino Fuente Esta instrucció n MOV significa mover y se encarga de pasar el contenido del operando Fuente al de Destino. En la programació n debemos respetar las siguientes reglas: Destino.- Puede ser variables y registros de 8, 16 y 32 bits. Fuente.- Puede ser variables, registros de Windows y valores enteros.

ADD (Suma) Destino Fuente La instrucció n ADD significa Suma. Suma el contenido de los dos operá ndos y el resultado es remplazado en el operando Destino. Destino.- Puede ser variables y registros de 8, 16 y 32 bits. Fuente.- Puede ser variables, registros de Windows y valores enteros.

SUB (Resta) Destino Fuente La instrucció n SUB significa Resta. Resta el contenido del operando Fuente con la de Destino y el resultado es almacenado en el operando Destino. Destino.- Puede ser variables y registros de de 8, 16 y 32 bits Fuente.- Puede ser variables, registros de Windows y valores enteros.

INC (Incrementa 1) Destino

DEC (Decrementa 1) Destino

Estas instrucciones incrementas y decrementan respectivamente el valor contenido en el operando Destino. Destino.- Puede ser variables y registros de 8, 16 y 32 bits.

PUSH (Guarda) Fuente PUSH se encarga de guardar el contenido del operando Fuente, en la Pila. Fuente.- Puede ser variables, valores enteros y registros de 16 y 32 bits.

Page 4: Curso Radasm III

4 [RVLCN]

POP (Recupera) Destino

Al contrario de PUSH, esta instrucció n recupera el contenido guardado en la pila. Destino.- Puede ser variables y registros de 16 y 32 bits. Cuando se guarda varios valores con la instrucció n PUSH y si se quiere recuperar se utiliza la instrucció n POP, respetando la siguiente regla:

“Ultimo en guardar y primero en recuperar” Instrucciones Ló gicas: Utiliza la calculadora de Windows (modo científica) para pasar en los sistema decimal, hexadecimal y binario las cantidades expresadas.

AND Destino Fuente Realiza la operació n Ló gica AND entre los operá ndos Fuente y Destino de bit a bit, y el resultado es remplazado en el operando Destino.

TABLA DE VERDAD AND A B Resultado 0 0 0 0 1 0 1 0 0 1 1 1

Ejemplo: 1110 (14 en decimal o E hexadecimal). 1101 (13 en decimal o D hexadecimal). 1100 (12 en decimal o C hexadecimal).

OR Destino Fuente

Realiza la operació n ló gica OR inclusiva entre los operá ndos de bit a bit, y el resultado es remplazado en el operando Destino.

TABLA DE VERDAD OR A B Resultado 0 0 0 0 1 1 1 0 1 1 1 1

Page 5: Curso Radasm III

5 [RVLCN]

Ejemplo: 1110 (14 en decimal o E hexadecimal). 1101 (13 en decimal o D hexadecimal). 1111 (15 en decimal o F hexadecimal).

NOT Destino La instrucció n NOT invierte los bits en el operando Destino.

TABLA DE VERDAD NOT A Resultado 1 0 0 1

Ejemplo: 1101 (13 en decimal o D hexadecimal). 0010 (2 en decimal).

XOR Destino Fuente Realiza la operació n ló gica XOR exclusiva entre los operá ndos bit a bit, y el resultado es remplazado en el operando Destino.

TABLA DE VERDAD XOR A B Resultado 0 0 0 0 1 1 1 0 1 1 1 0

Ejemplo: 1110 (14 en decimal o E hexadecimal). 1101 (13 en decimal o D hexadecimal). 0011 (3 en decimal). Todas las operaciones ló gicas que hemos visto tienen la siguiente regla: Fuente.- Puede ser variables, valores y registros de 16 y 32 bits Destino.- Puede ser variables y registros de 16 y 32 bits. [ Ejercicios Con Instrucciones] Abrimos el archivo prog002a con nuestro IDE RadAsm donde encontramos lo siguiente: En el archivo .INC hemos declarado la variable Valor_1 tipo DD

Page 6: Curso Radasm III

6 [RVLCN]

prog002a: ;##################[Operaciones Aritméticas]################ MOV EAX,444 ; EAX = 444 ADD EAX,333 ; EAX = 444 + 333 = 777 MOV Valor_1,EAX ; Movemos el Resultado en la ; variable Valor_1 = EAX = 777 MOV EBX,15Dh ; EBX = 15Dh MOV EAX,20Ch ; EAX = 20Ch ADD EAX,EBX ; EAX = 20Ch + EBX = 15Dh = 369h PUSH EBX ; Guardamos el contenido del Registro EBX = 15Dh ; en la Pila. DEC EAX ; Decrementamos 1 a EAX = 369h - 1 = 368h INC EBX ; Incrementamos 1 a EBX = 15Dh + 1 = 15Eh SUB EAX, EBX ; Restamos EAX = 368h - EBX = 15Eh = 20Ah POP EBX ; Recuperamos el contenido de la Pila al ; registro EBX SUB EBX,10 ; Restamos EBX = 15Dh - 10 =153 Cuando se quiere declarar nú meros en Hexadecimal debemos escribir el cará cter h al final del valor, si no hay ningú n cará cter al final significa que es decimal. ;##################[Operaciones Ló gicas]################ MOV EAX,12 ;12 = 1100b MOV EBX,11 ;11 = 1011b AND EAX,5 ; EAX=12 (1100b) And 5(0101b) = 4 (0100b) OR EAX,EBX ; EAX= 4(0100b) OR EBX 11(1011b) = F(1111b) OR EBX,1101b ;EBX = 11(1011b) OR 13(1101b) = F(1111b) XOR EAX, EBX ;EAX = F(1111b) XOR EBX = F(1111b) = 00000 PUSH -2 ; Guardamos en la Pila el valor -2 POP EBX ; Recuperamos el Valor Guardado en la pila ; En el registro EBX NOT EBX ; NOT EBX = -2 = 1 Cuando se quiere declarar nú meros binarios debemos escribir el cará cter b al final del valor entero. En Las Operaciones ló gicas si desean comprobar los resultados pueden verificar la tabla de verdad correspondiente a cada operació n. 1.- En el programa anterior es solo un ejemplo de usar apropiadamente las instrucciones, ahora debemos darle sentido a nuestro programita: Tenemos 5 valores enteros: 1.- 1Ah 2.- 500 3.- 1C2h 4.- 13h 5.- 200

Page 7: Curso Radasm III

7 [RVLCN]

Haremos un programa que haga la siguiente operació n: 1Ah + 500 = X El resultado X restamos 1C2h: X – 1C2 = Y Guardamos el resultado Y en la pila o en una variable, y luego sumaremos las cantidades que todavía no utilizamos de esta manera: 13h + 200 = Z Recuperamos el resultado Y, y lo restamos con la cantidad del resultado Z, el resultado final debe ser almacenado en el registro EAX. Solució n 1 prog002b.- En el archivo .inc declaramos la variable “Y” tipo DD. prog002b: mov eax,1Ah ; EAX = 1AH add eax,500 ; EAX = 1Ah + 500 = 526 sub eax,1C2h ;EAX = 526 – 1C2 = 76 mov Y, eax ;Y (variable) = EAX = 76 mov eax, 13h ; EAX = 13H add eax,200 ; EAX = 13H + 200 = 219 sub eax ,Y ; EAX = 219 - Y (76) = 143 El resultado final es EAX =143. Solució n 2 prog002c.- todas las cantidades está n declaradas en el archivo .inc de nuestro programa donde: Valor_1 DD 1Ah Valor_2 DD 500 Valor_3 DD 1C2h Valor_4 DD 13h Valor_5 DD 200 prog002c: mov eax,Valor_1 ; EAX = 1Ah add eax,Valor_2 ; EAX = 1Ah + 500 = 526 sub eax,Valor_3 ;EAX = 526 – 1C2 = 76 push eax ; Guardamos en la pila el contenido de EAX = 76 mov eax,Valor_4 ; EAX = 13H add eax,Valor_5 ; EAX = 13H + 200 = 219 pop ebx ; Recuperamos el contenido de EAX en EBX = 76 sub eax,ebx ; EAX = 219 - Y (76) = 143 Hay muchas soluciones no solo son estas dos, usted si quiere aprender mas debe desarrollar su propia solució n.

Page 8: Curso Radasm III

8 [RVLCN]

[ Mostrando Resultados ] En nuestro có digo anterior no mostramos el resultado de la operació n aritmética, para ello debemos saber las siguientes funciones de conversiones del masm32.lib

Librería MAsm32.lib atodw,addr Numero_decimal Esta funció n convierte cadenas de texto (cantidades decimales), a su valor entero, la cantidad convertida será devuelta en EAX. Ejemplo: .data Numero_decimal db “10”,0 .code Invoke atodw,addr Numero_decimal mov ebx, eax ;EAX contiene el valor entero 10 o Ah

Librería MAsm32.lib htodw,addr Numero_Hexadecimal Esta funció n es similar a atodw pero trabaja con cantidades hexadecimales, y la convierte a su valor entero, la cantidad convertida será devuelta en EAX.

Librería MAsm32.lib dwtoa,Cantidad,addr Numero_Convertido_decimal Esta funció n convierte valores enteros en cadenas de texto decimal, seria lo contrario de la funció n atodw. Cantidad.- En este pará metro se puede utilizar variables, valores enteros y registros de Windows. Ejemplo: Caso1.- valor entero: Invoke dwtoa,12, addr Numero_Convertido_decimal Caso2.- Variables tipo DD: Invoke dwtoa, Valor_1, addr Numero_Convertido_decimal Caso2.- Registros de Windows: Invoke dwtoa, EAX, addr Numero_Convertido_decimal

Page 9: Curso Radasm III

9 [RVLCN]

Librería MAsm32.lib dw2hex, Cantidad,addr Numero_Convertido_Hex Esta funció n contiene los mismos pará metros de la funció n dwtoa, con la diferencia que el resultado es una cantidad de texto hexadecimal, viene hacer lo contrario de la funció n htodw. En los siguientes ejemplos utilizaremos todas las funciones mencionadas, presta mucha atenció n cada detalle. 1.- En el ejercicio anterior mostraremos el resultado en decimal y Hexadecimal en un mensaje:

2.- Haremos un programa que sume cadenas de texto con cantidades decimal y hexadecimal, al final debe mostrar el resultado:

prog003.exe

Page 10: Curso Radasm III

10 [RVLCN]

En el ejemplo (prog003.exe), observamos que tenemos cantidades en decimal y hexadecimal (cadenas de texto), y luego para sumar dichas cantidades convertimos a valores enteros con las funciones atodw y htodw para que podamos operar con las instrucciones de procesador como la de sumar (ADD) y mover (MOV), luego para mostrar el resultado debemos convertir los valores enteros a cadenas de texto con las funciones dwtoa y dw2hex respectivamente: Esquema de trabajo:

Veamos otro ejemplo de conversiones, recuerda siempre estar atento a cada detalle del video:

prog003a.exe

Se ha trabajado directamente con valores enteros declarados en nuestro archivo .inc, cuyas cantidades hemos sumado, luego para mostrar el resultado hemos convertido en cadenas de texto dwtoa y dw2hex, respectivamente.

Page 11: Curso Radasm III

11 [RVLCN]

Esquema de trabajo:

Eso tenemos en cuento a conversiones de valores enteros a cadenas y viceversa Nota: Nunca podemos mostrar valores enteros, para hacerlo debemos convertir a cadenas de texto. [ Creando Tus propias Funciones ] 1.- Ahora crearemos una funció n que muestre un mensaje, esta funció n tendrá un pará metro donde ira la direcció n de la etiqueta del mensaje, dentro de la funció n que vamos a crear se encontrara la APi MessageBox que será el encargado de mostrar el mensaje.

prog004.exe

Page 12: Curso Radasm III

12 [RVLCN]

Como observamos en el video primero declaramos la funció n que vamos a utilizar: Funcion PROC MsgT:DWORD invoke MessageBox,NULL,MsgT,addr MsgTitulo, \ MB_OK + MB_ICONINFORMATION RET Funcion endp PROC.- Esta directiva sirve para definir un procedimiento o llamado que se va ha utilizar y su sintaxis es así: Nombre_Funcion PROC Argumento/s (si lo hubiera) RET Nombre_Funcion endp Si nuestra funció n necesita un pará metro su sintaxis seria así: Nombre_Funcion PROC Parametro01: Tipo de variable RET Nombre_Funcion endp Si en nuestra funció n necesitamos má s de 1 pará metro, es necesario separar por “,” (comas) cada pará metro de esta manera: Nombre_Funcion PROC Prmtr01: Tipo de variable, Prmtr02: Tipo de variable, etc… RET Nombre_Funcion endp Tipo de variable.- Aquí declaramos la longitud de bytes que se necesita ya sea DWORD, WORD, BYTE, por lo general siempre se declara la variable que tenga mayor longitud como DWORD. Nombre_Funcion.- Aquí escribimos nuestra etiqueta para el nombre de la funció n, recuerda que esta etiqueta no debe repetirse y la etiqueta de los pará metros no deben ser declaradas en otra parte del có digo.

RET (retorno) Nº Bytes Con esta Instrucció n regresamos del procedimiento que hemos llamado también lo utilizamos para separar nuestros có digos, como en el primer RET

Page 13: Curso Radasm III

13 [RVLCN]

que esta debajo de la funció n ExitProcess, en el operando Nº Bytes es opcional ahí se especifica cuantos bytes debe retornar. Otro punto importante es que si utilizamos algunos de las variables que hemos declarado en los parámetros del procedimiento de la funció n como por ejemplo MsgT ya no es necesario utilizar addr u offset, como por ejemplo la variable que he utilizado en el 3er parámetro de la Api MessageBox: invoke MessageBox,NULL,MsgT,addr MsgTitulo, \ MB_OK + MB_ICONINFORMATION Ya hemos creando nuestra funció n, y si queremos utilizarla con la directiva invoke como lo hicimos en el video: invoke Funcion,addr MsgTexto Es necesario declarar los prototipos con la directiva PROTO. PROTO.- Sirve para definir los prototipos de las funciones para que se pueda usar el invoke, también informa a MASM el nú mero de argumentos y el tipo de variable que debe emplearse al momento de llamar a la funció n, su sintaxis es de esta manera: Nombre_Funcion PROTO Argumento/s (si lo hubiera) Es similar a la directiva PROC y es por que trabajan juntos pero la diferencia es que solo se declara tipo de variables, el nú mero de variables que declaramos depende de los pará metros de la funció n por ejemplo: invoke Funcion,addr MsgTexto Solo contiene un pará metro y lo definimos de esta manera: Funcion PROTO :DWORD Si nuestra funció n tuviera má s de un pará metro se declara las variables separados por “,” (coma) por ejemplo la funció n MessageBoxA que esta en el archivo user32.inc cuando nosotros la utilizamos nos damos cuenta que tiene 4 pará metros: MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD Nota.-No olvides que se debe respetar las mayú sculas y las minú sculas cuando nos referimos a la cualquier variable o l nombre de la funció n, por que si no lo haces al momento de compilar masm32 nos devolverá error.

Page 14: Curso Radasm III

14 [RVLCN]

2.- Crearemos una funció n que reste 2 cantidades, y ademá s al regresar de la funció n el resultado debe ser devuelto al registro EAX y al final debe mostrar el resultado en decimal.

Prog004a.exe

Dentro de nuestra funció n Resta, hemos puesto 2 instrucciones para poder restar dichas cantidades, nosotros ya sabemos como se utiliza estas instrucciones por lo cual esta de mas explicarlo, luego el resultado es almacenado en EAX y al retornar de la funció n convertimos el valor entero a cadenas de texto (recuerda que la funció n de conversió n esta en la librería masm32.lib), para poder mostrar el resultado con la APi MessageBox. Nota.- En la funció n que hemos creado no solo se puede usar valores, tambié n variables y registros de 8, 16, 32 bits por que todo eso abarca en DWORD. [ Ejercicios ] 1.- Tenemos 3 cantidades 800, 400, 100 (decimales), en cadenas de texto y queremos un programa que haga la siguiente operació n: 800 – 450 = X Y el resultado X debe ser restado100 resultando Y, este resultado debe ser mostrado. 2.- Crear un programa que sume 5 cantidades y la sumatoria de dichas cantidades será restado por 225 en decimal, las 5 cantidades se puede usar cualquier valor entero que se te ocurra ya sea en decimal o hexadecimal, si deseas mostrar el resultado hazlo.

Page 15: Curso Radasm III

15 [RVLCN]

3.- Crear una funció n que tenga 2 pará metros para que muestre un mensaje por lo tanto: El primer pará metro.- Aquí se colocara la direcció n de la etiqueta del Mensaje que se va mostrar. El segundo pará metro.- Se colocara la direcció n de la etiqueta del titulo del mensaje. [ Vocabulario ] Pila o stack.- La pila viene hacer un rango de memoria la cual puede ser utilizada para el almacenamiento temporal de datos, solo 2 instrucciones trabajan con la pila y son el PUSH (guarda) y POP (recupera). [ Recordatorio ] No olvidar preguntar en lista MASM32-RadASM y enviar sus ejemplos del ejercicio que se ha dejado para subirlas al Site RVLCN, la duració n en este caso es de 2 semana la tercera semana empiezan los desafíos de programació n. Dudas, sugerencias, otros, hacerlas en lista. [ El autor puede ser contactado ] eMail: [email protected] [email protected] Lista MASM32-RadASM http://groups.google.es/group/MASM32-RadASM www: http://RVLCN.com www: http://RVLCNsecurity.com www: http://beam.to/RVLCN http://beam.to/REVOLUCION

Julio-2006

Page 16: Curso Radasm III

16 [RVLCN]

Copyright(c) 2005-2006 RVLCN