- Qué son
- Ejemplo
2. Subprocesos
- La pila
- Argumentos de pila
- Llamada y retorno
3. Sintaxis NASM
- Funciones globales
- Carga de funciones externas
- Secciones
- Etiquetas
- Esqueleto de un programa
4. NASM y GCC
- Ejemplos
- Ejercicio final
Estructuras de control de proceso
Qué son:
Las estructuras de control son procesos a alto nivel que realiza el compilador, con las que no contamos en ASM (A bajo nivel).
Estas estructuras pueden ser bucles (While, For, ...), comparaciones (if’s) y de ramificación.
Ejemplo:
Ejemplo de estos tres últimos tipos, en un comparador de cadenas:
global main extern printf segment .data smal DB `Diferentes\0` sbien DB `Iguales\0` Cadena1 DB `aaaa\0` Cadena2 DB `aaaa\0` segment .bss len1 resb 12 len2 resb 12 segment .text main: PUSH EBP MOV EBP,ESP MOV [ESP],dword Cadena1 CALL longitud MOV dword[len1],EAX MOV [ESP],dword Cadena2 CALL longitud MOV dword[len2],EAX MOV EAX,dword[len1] MOV ECX,dword[len2] CMP EAX,ECX JNE Mal XOR ECX,ECX MOV EDX,dword[len1] Buclecmp: CMP EDX,ECX JE Bien MOV AL,byte[Cadena1+ecx] MOV BL,byte[Cadena2+ecx] CMP AL,BL JNE Mal INC ECX JMP Buclecmp Mal: PUSH smal CALL printf LEAVE RET Bien: PUSH sbien CALL printf LEAVE RET longitud: PUSH EBP MOV EBP,ESP SUB ESP,4 XOR ECX,ECX BUCLE: LEA EAX,[EBP+8] MOV EAX,DWORD [EAX] MOV BL,byte[EAX+ECX] CMP BL,0 JE Retornar INC ECX JMP BUCLE Retornar: MOV EAX,ECX LEAVE RET
Subprocesos
Estamos por conocer más de cerca las instrucciones PUSH y POP.
La pila es una lista de memoria en la que podemos manejarnos. Para que no se creen confusiones, se trata del Stack. Cuando realizamos PUSH estamos cargando datos a la pila, mientras que con POP lo descargamos. PUSH empuja un dato, mientras que POP se encarga del último (L.I.F.O)
La instrucción PHSA empuja el contenido de los registros a la pila.
Al realizar una llamada a un subproceso (Función) mediante CALL, éstos deben estar de acuerdo en el número y valor de parámetros que vamos a precisar (Argumentos).
Los argumentos se almacenan en EBP+8, EBP+0xC y sucesivamente. Más allá de los parámetros recividos estaríamos tocando cosas que no deberíamos, y ya podrías imaginar el resultado.
Un ejemplo de esto lo podemos ver en el ejemplo anterior, en la llamada al subproceso longitud (Función longitud)
MOV [ESP],dword Cadena1 ;Cargar argumento, PUSH CALL longitud
longitud: PUSH EBP MOV EBP,ESP SUB ESP,4 XOR ECX,ECX BUCLE: LEA EAX,[EBP+8] ;Obtenemos direccion MOV EAX,DWORD [EAX] ;Leemos puntero MOV BL,byte[EAX+ECX] CMP BL,0 JE Retornar INC ECX JMP BUCLE Retornar: MOV EAX,ECX LEAVE RET
El valor retornado siempre es almacenado en EAX. Realmente depende del programador, pero por regla general es así
Sintaxis NASM
Funciones declaradas como globales, por ejemplo al usar C y NASM
Global main ;Obligatorio Global funcion
Cargar funciones externas.
Extern printf Extern scanf Extern funcionpropia
Son muchas, pero aquí van las más comunes.
.BSS – Datos no inicializados (Variables) .DATA – Datos inicializados (Constantes) .TEXT – Texto .CODE – Código
Son labels que usamos para determinar el salto hacia otra línea de código (o dirección). Recuerda a GOTO, todo un clásico
Bucle: CMP EAX,0 JNE Bucle JMP Fin Fin: RET
Esqueleto de un programa
global main extern Funcionacargar segment .data constante DB `Valor\0` segment .bss variable resb 1024 ;Longitud segment .text main: PUSH EBP MOV EBP,ESP SUB ESP,4 LEAVE RET
NASM y GCC, Ejemplo de uso
Subprocesos externos:
b.asm:
global main extern longitud extern printf segment .data ftoi DB `%i caracteres\0` Cadena DB `aaaaaaa\0` segment .text main: PUSH EBP MOV EBP,ESP MOV [ESP],dword Cadena CALL longitud PUSH EAX PUSH ftoi CALL printf LEAVE RET
b.c:
#include <stdio.h> int longitud(char *s1) { return strlen(s1); }
nasm -f win32 -Wall --prefix _ b.asm
gcc -o b b.obj b.c
gcc -o b b.obj b.c
Realizar una calculadora utilizando GCC y NASM, utilizando estructuras de control, subprocesos, retornos y la pila
Datos finales: Esperen la siguiente versión. Puntos flotantes, estructuras, matrices, ...
Agradecimientos: Jep, Swash, 11Sep, Shadowbyte, Mr.Blood, ...
Creado por: Yo-Mismo (Para oversec.org)
Las dudas las resuelvo por privado, no en el hilo (Mejor abrir tema nuevo.)
Un saludo!
No hay comentarios:
Publicar un comentario