Pasar un argumento de C a asamblea?
Pregunta
¿Cómo se puede pasar un argumento de una función principal C a una función de montaje? Yo sé que mi función personalizada tiene que ser algo como:
void function(char *somedata) __attribute__((cdecl));
Ahora ¿cómo iba a utilizar somedata
en un archivo de ensamblaje. Mi sistema operativo es Linux Ubuntu y mi procesador es x86.
Solución
yo soy un poco de un novato en esto, pero espero que este ejemplo le permitirá estar en su camino. Lo he probado y funciona, el único problema que puede tener es un software que no están disponibles. Estoy usando nasm para el montaje.
main.c
extern void myFunc(char * somedata);
void main(){
myFunc("Hello World");
}
myFunc.asm
section .text
global myFunc
extern printf
myFunc:
push ebp
mov ebp, esp
push dword [ebp+8]
call printf
mov esp, ebp
pop ebp
ret
COMPILE
nasm -f elf myFunc.asm
gcc main.c myFunc.o -o main
Notas:
Es necesario instalar nasm (ensamblador) (ubuntu es: sudo apt-get install nasm)
¿Qué ocurre básicamente en el código C llama al myFunc con un mensaje. En myFunc.asm obtenemos la dirección del primer carácter de la cadena (que se encuentra en [ebp + 8] Véase aquí para obtener información (http://www.nasm.us/xdoc/2.09.04/html/nasmdoc9.html 9.1.2 ver que describe c convenciones de llamada un tanto.) y se pasa a la función printf (empujándola en la pila). printf está en la biblioteca estándar de C, que gcc automáticamente enlazará en nuestro código por defecto a menos que no decimos a.
Tenemos que exportar myFunc en el archivo de ensamblaje y declarar myFunc como una función extrnal en el archivo main.c. En myFunc.asm también estamos importando la función printf de stdlib de manera que podemos hacer salir el mensaje de forma más sencilla posible.
Espero que esto ayude un poco.