elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
27 Mayo 2012, 21:58  


Tema destacado: Nueva página de elhacker.net en Google+ Google+

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Combinar C y ASM
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Combinar C y ASM  (Leído 3,529 veces)
Thylzos

Desconectado Desconectado

Mensajes: 147


Ver Perfil
Combinar C y ASM
« en: 29 Septiembre 2007, 11:46 »

Hola, quiero hacer un programa en el que tengo pensado utilizar casi todo el código en C y agregarle algunos detalles en ASM, ¿Podrían decirme cómo debo hacerlo?


En línea
Hendrix
In The Kernel Land
Colaborador
***
Desconectado Desconectado

Mensajes: 2.271



Ver Perfil WWW
Re: Combinar C y ASM
« Respuesta #1 en: 29 Septiembre 2007, 11:56 »

Primero di que compilador vas a usar, ya que no es lo mismo agregar ASM en Dev que en VC++, el VC++ usa asm Intel y el otro AT&T  :)





En línea

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián
Thylzos

Desconectado Desconectado

Mensajes: 147


Ver Perfil
Re: Combinar C y ASM
« Respuesta #2 en: 29 Septiembre 2007, 12:14 »

USo el Dev, ¿cómo hago para hacerlo? ¿qué es AT&T?
En línea
Hendrix
In The Kernel Land
Colaborador
***
Desconectado Desconectado

Mensajes: 2.271



Ver Perfil WWW
Re: Combinar C y ASM
« Respuesta #3 en: 29 Septiembre 2007, 12:38 »

Para mi es mejor utilizar asm en VC++ que no en Dev (por eso del AT&T, que es algo diferente al de Intel).

Te paso algo de info:

http://www.bloodshed.net/dev/faq.html#asm

http://bulma.net/impresion.phtml?nIdNoticia=941

http://sig9.com/articles/att-syntax

http://www.gnu.org/software/binutils/manual/gas-2.9.1/html_mono/as.html

http://ares.x25zine.org/Docs/0x4553-Asm_tutor.html

creo que ya hay suficiente info  :)

En línea

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián
P[i]


Desconectado Desconectado

Mensajes: 472


Ver Perfil
Re: Combinar C y ASM
« Respuesta #4 en: 29 Septiembre 2007, 18:27 »


en dev (bueno en gcc) se utiliza asm con sintaxis de AT&T y se implementa asi en C:

Código:
int main()
{

__asm__ (
    "...intruccion 1 terminado en \n"
    "...intrccion n \n"
    "ultima instruccion"
    : //variables de salida
    : //variable de entrada
    : //registros que se van a modificar (esto tiene grandes excepciones)
     );
}

Pero de todas formas busca en google "inline assembly gcc".

Una sugerencia la mayoria de la gente recomienda poner "__asm__ __volatile__" en ocasiones ayuda a mejorar la efectividad del programa.

Tambien hay que tener en cuenta que en asm inline los registros no son %eax sino %%eax

Bueno una pagina que aun esplica bien el inline es esta:
http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html

Saludos.
En línea
Thylzos

Desconectado Desconectado

Mensajes: 147


Ver Perfil
Re: Combinar C y ASM
« Respuesta #5 en: 30 Septiembre 2007, 11:38 »

Muchas gracias a los dos, me son de mucha ayuda.
En línea
Ferсhu


Desconectado Desconectado

Mensajes: 1.213

Menos palabras y Mas codigos.


Ver Perfil WWW
Re: Combinar C y ASM
« Respuesta #6 en: 1 Octubre 2007, 01:53 »

Un poco colgada esta pregunta pero el asm de turbo c++ es AT&T?

Código:
asm{
     ...
     ...
     ...
}
En línea

Rozor

Desconectado Desconectado

Mensajes: 269


As I Walk Through The Valley Of The Shadow Of Dead


Ver Perfil WWW
Re: Combinar C y ASM
« Respuesta #7 en: 1 Octubre 2007, 02:31 »

Ejemplo para visual c++ 6.


No he probado el codigo por que ahora mismo estoy descargando el vc del emule.

Código:

#include <windows.h>

#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")

char txt[] = "Fuck you";
char cap[] = "!Sub_Level";

int main(void)
{
 
        __asm {

                       push 0
                       push offset cap
                       push offset txt
                       push 0 // o HWND
                       call MessageBox
                       popa
                       leave
                       ret
                  }

   

      ExitProcess();

   return 0;
}


No se si TASM o tubo asm, puede usar at, yo lo he usado con intel, asique me imagino que turbo c usara como ensamblador el mismo que tasm.
En línea

out in the streets they call it murder....
byebye


Desconectado Desconectado

Mensajes: 5.093



Ver Perfil
Re: Combinar C y ASM
« Respuesta #8 en: 1 Octubre 2007, 13:16 »

rozor no es la primera vez que lo veo en un codigo que escribes ¿pq leches popeas los registros?
En línea
Rozor

Desconectado Desconectado

Mensajes: 269


As I Walk Through The Valley Of The Shadow Of Dead


Ver Perfil WWW
Re: Combinar C y ASM
« Respuesta #9 en: 2 Octubre 2007, 12:23 »

por que descargo en nadie todos los registros, me ha pasado veces sobre todo en linea de ensamblador bajo vc que si no popeas da error en tiempo de ejecucion. Asique antes de acabar popeo , en el otro codigo si era erroneo por que al popear me cargaba un registro necesario se me fue la pelota, suelo ponerlo al final entes de leave
En línea

out in the streets they call it murder....
byebye


Desconectado Desconectado

Mensajes: 5.093



Ver Perfil
Re: Combinar C y ASM
« Respuesta #10 en: 2 Octubre 2007, 13:17 »

yo lo veo extraño, si da ese error que dices digo yo que es por usar algun registro y no restaurarlo. la verdad lo veo extraño.
En línea
MazarD
Colaborador
***
Desconectado Desconectado

Mensajes: 880


mazard.info


Ver Perfil WWW
Re: Combinar C y ASM
« Respuesta #11 en: 2 Octubre 2007, 18:59 »

En principio dado que es solo una llamada a una api y es __stdcall no es necesario quitar de la pila los parametros que pusheas ya que lo hace la propia función si la función fuera __cdecl entonces si habría que hacerlo, son convenciones.
Pero ahún así hacer un popa no es correcto puesto que solo tienes que popear el valor de retorno de la función no "todos los registros".

Imaginemos la pila al salir de la función:
valor de retorno
cosas que sabe dios
cosas que sabe dios2

Si haces un popa estás quitando de la pila y guardando en registros a parte del retorno valores que en teoria se popearán mas adelante en el programa.
El código no te peta gracias al leave que dado que no te cargas ebp con el popa hace un mov esp,ebp y restablece el punto correcto de la pila antes de salir a la función.

El vc en modo debug en principio lo normal sería que petara tal y como está el código gracias a una función que introduce llamada chkesp que te detecta este error concreto y te lo muestra en tiempo de ejecución (los msgbox esos que salen a veces en lugar del "no enviar"). En modo release como no mete estos checks te salvarás y correrá perfectamente.
En teoria creo que se comporta así el vc pero de todos modos el código no es correcto.
« Última modificación: 2 Octubre 2007, 19:01 por MazarD » En línea

-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines