Curso Radasm III
Curso Radasm III
Curso Radasm III
[RVLCN]
C l a ses de P r o gr a m a c iO n C O N M A SM + Ra da sm
C a pi tu l o I I I :R e g i s tro s de lM i c ro Pro c e 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.
[RVLCN]
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 EAX (Acumulador) Descripci n
Es utilizado para operaciones aritmticas (suma, resta, divisi n, multiplicaci n). Algunas Funciones despus de ser utilizadas devuelven un valor a EAX. EBX (Base) Se utiliza para direccionar el acceso a datos, situados en la memoria, tambin se puede utilizar para operaciones aritmticas. ECX (Contador) Se utiliza como contador por algunas instrucciones, tambin es utilizado para operaciones aritmticas. 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 tambin 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.
[RVLCN]
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) DEC (Decrementa 1) Destino 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.
[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 fica) para Instrucciones L gicas: Utiliza la calculadora de Windows (modo cient 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
5 Ejemplo: 1110 (14 en decimal o E hexadecimal). 1101 (13 en decimal o D hexadecimal). 1111 (15 en decimal o F hexadecimal). NOT Destino
[RVLCN]
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.
6 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
[RVLCN]
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
7 Haremos un programa que haga la siguiente operaci n: 1Ah + 500 = X El resultado X restamos 1C2h: X 1C2 = Y
[RVLCN]
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.
[RVLCN]
[ Mostrando Resultados ]
En nuestro c digo anterior no mostramos el resultado de la operaci n aritmtica, 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.
9 Librer a MAsm32.lib
[RVLCN]
2.- Haremos un programa que sume cadenas de texto con cantidades decimal y hexadecimal, al final debe mostrar el resultado:
prog003.exe
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.
11 Esquema de trabajo:
[RVLCN]
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.
prog004.exe
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.- Aquescribimos 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 tambin lo utilizamos para separar nuestros c digos, como en el primer RET
13
[RVLCN]
que esta debajo de la funci n ExitProcess, en el operando N Bytes opcional ah se especifica cuantos bytes debe retornar.
es
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, tambin 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 devolvererror.
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.
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.
Julio-2006
[RVLCN]