Nuevas NORMAS para el foro

Curso Hacker
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación? - Julio 26, 2008, 06:29:39
Boton Buscar
Inicio Ayuda Ingresar Registrarse
Visita: Articulos - Juegos Gratis - Da Foros

Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++  |  Tema: como poner un codigo assambler en un copido en C? 0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: como poner un codigo assambler en un copido en C?  (Leído 1246 veces)
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1357


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« en: Agosto 14, 2007, 05:39:58 »

hola, he leido que se puede, solo tengo que poner asm int 21 y listo (por ejemplo) pero cuando compilo (uso del dev-cpp) me da error en esa parte, como si no lo reconociera, pero lo raro es que ese mismo programa habla sobre esto (se puede cambiar el color de lo que es del assambler), entonces, como se hace?

gracias
En línea

Inside The Source Code




Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Linux Registred User #460377
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #1 en: Agosto 14, 2007, 09:49:14 »

Buenas

Trata poniendo esto:
_asm_( << codigo asm >>);   

No recuerdo si al final tambien se debia poner


Salu2, FreakMind
En línea

Connoisseurs of C semantics find C++ inferior to ++C

DarkIker
Habitual
*****
Desconectado Desconectado

Mensajes: 261


Colombia Underground Team

dark_iker_reign@hotmail.com
Ver Perfil WWW Email
« Respuesta #2 en: Agosto 14, 2007, 10:25:20 »

comenzando por que el asm del dev-c++ es asm AT&T y siguiendo por que es _asm("bla bla");, siguiendo con, si no has seteado los registros debidamente int 21h no hara mucho que digamos, aparte no recuerdo si en at&t solo cambia la sintaxis o tambien las interrupciones.

Att: DarkIker
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> Colombia Underground Team

Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> My Blog
̿̿̿̿̿̿̿̿̿
Miembro
*****
Desconectado Desconectado

Mensajes: 20



Ver Perfil
« Respuesta #3 en: Agosto 15, 2007, 09:07:06 »

aparte no recuerdo si en at&t solo cambia la sintaxis o tambien las interrupciones.

Creo que solo la sintaxis  Wink
En línea
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1357


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #4 en: Agosto 15, 2007, 05:48:03 »

pues lo del int 21 era solo un ejemplo, puse el primer numero que se me ocurrio

salu2
En línea

Inside The Source Code




Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Linux Registred User #460377
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1357


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #5 en: Agosto 15, 2007, 06:42:59 »

hola, intente hacer esto:

main()
{
      int b, a = 9;
      asm ("mov AX,a");
      asm ("mov b,AX);
      printf("%d", b);
      getchar();
}

pero me selan 2 errores iguales al compilar:
"too many memory references for `mov' "

que hago? que hice mal?
En línea

Inside The Source Code




Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Linux Registred User #460377
DarkIker
Habitual
*****
Desconectado Desconectado

Mensajes: 261


Colombia Underground Team

dark_iker_reign@hotmail.com
Ver Perfil WWW Email
« Respuesta #6 en: Agosto 15, 2007, 10:22:25 »

aprende asm AT&T eso debes de hacer Tongue, ya que lo intentaste hacer en asm intel.

Att: DarkIker
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> Colombia Underground Team

Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> My Blog
̿̿̿̿̿̿̿̿̿
Miembro
*****
Desconectado Desconectado

Mensajes: 20



Ver Perfil
« Respuesta #7 en: Agosto 16, 2007, 11:24:30 »

Aparte tienes que meter punteros hacia la posición de memoria que quieres mover....No e programado nunca en AT&T, pero creo que es asi.

En línea
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1357


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #8 en: Agosto 16, 2007, 02:47:51 »

hola, gracias a todos por responder, busque eso de asm at&t y aprendi algo, lo intente hacer pero...

el codigo queda asi:

main()
{
      int b, a = 9;
      asm ("mov a,%ax"); //tambien intente mov %a
      asm ("mov %ax,b); //tambien intente mov %b
      printf("%d", b);
      getchar();
}

pero me da bad registrer name %a

un dia lei que se podia poner el nombre de las variables directamente, pero veo que no puedo Sad, como se hace?

gracias
En línea

Inside The Source Code




Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Linux Registred User #460377
DarkIker
Habitual
*****
Desconectado Desconectado

Mensajes: 261


Colombia Underground Team

dark_iker_reign@hotmail.com
Ver Perfil WWW Email
« Respuesta #9 en: Agosto 16, 2007, 08:57:13 »

bueno tio aca te dejo un ejemplo de restar dos numeros ya de hay vos vez que haces, pero te recomendari buscar mas:

Código:
#include <stdio.h>

int main( void )
{
int ret;
_asm("movl $5, %eax");
_asm("subl $4, %eax");
_asm("movl %eax, %ret");
printf("ret %d\n",ret);
return 0;
}

Att: DarkIker
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> Colombia Underground Team

Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> My Blog
lann
Habitual
*****
Desconectado Desconectado

Mensajes: 309


maamamma

migue1990@gmail.com
Ver Perfil Email
« Respuesta #10 en: Agosto 16, 2007, 09:28:03 »

16. How to use assembly with Dev-C++ ?

The assembler uses AT&T (not Intel). Here's an example of such a syntax :

// 2 global variables

int AdrIO ;
static char ValIO ;

void MyFunction(..........)
{
__asm("mov %dx,_AdrIO") ; // loading 16 bits register
__asm("mov %al,_ValIO") ; // loading 8 bits register

/*
!!!!!!!!!! Don't forget the underscore _ before each global variable names !!!!!!!!!!
*/
__asm("mov %dx,%ax") ; // AX --> DX
}
En línea

am
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1357


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #11 en: Agosto 17, 2007, 05:13:25 »

bueno, ninguna de las 2 respuestas funcionan, si uso %a (como dije que habia usado pero = me dijeron que lo haga) sale el error:   bad register name `%a'
(lo mismo para b)

si uso _a, sale:
  [Linker error] undefined reference to `a'

entonces.... como se hace??
ya lo dije, pero lo digo de neuvo, uso del dev-cpp,
por ahora solo sirvio eso de asm AT&T, pero lo de usar las variables ya registradas, no

gracias de todas formas, y otra cosa, con el dev-cpp uso asm("") no _asm("")
En línea

Inside The Source Code




Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Linux Registred User #460377
DarkIker
Habitual
*****
Desconectado Desconectado

Mensajes: 261


Colombia Underground Team

dark_iker_reign@hotmail.com
Ver Perfil WWW Email
« Respuesta #12 en: Agosto 17, 2007, 07:13:39 »

Acabo de compilar:

Código:
#include <stdio.h>

int ret;

int main()
{   
    asm("movl $5, %eax");
    asm("subl $4, %eax");
    asm("movl %eax, _ret");
    printf("ret %d\n",ret);
    return 0;
}

y me funciona perfecto.

Att: DarkIker
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> Colombia Underground Team

Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> My Blog
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1357


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #13 en: Agosto 18, 2007, 06:18:27 »

hola, gracias a todos, FUNCIONO!!!, tengo que poner _(la variable), pero porque antes me daba error??
es estupido, pero era porque declaraba en la funcion main, miren:
mi programa era asi:
main()
{
      int b, a = 9; //aca declaro a a y a b
      asm ("mov _a,%ax");
      asm ("mov %ax,_b);
      printf("%d", b);
      getchar();
}

y el de DarkIker es:

int ret;//aca declara a ret

int main()
{   
    asm("movl $5, %eax");
    asm("subl $4, %eax");
    asm("movl %eax, _ret");
    printf("ret %d\n",ret);
    return 0;
}

mas alla de si uso subl y movl y yo mov, la direferencia estaba en donde se declaraban las variables, listo, ahora ya puedo poner un codigo assambler en C gracias a ustedes.

salu2
« Última modificación: Agosto 18, 2007, 06:21:31 por swatnio » En línea

Inside The Source Code




Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Linux Registred User #460377
ven0m
Colaborador
*****
Desconectado Desconectado

Mensajes: 782


Christina...Eat me, drink me...

x_0@hotmail.de
Ver Perfil Email
« Respuesta #14 en: Diciembre 16, 2007, 08:39:01 »

He estado buscando ya que no quiero usar la AT&T sintasis.. y me he encontrado con el MSVC++ de microsoft.. con el cual puedes escribir Inline asm en Intel.. osea algo asi:

Código:
#include <stdio.h>

void hola()
{
   puts("hola");
}
int main()
{
  __asm{
                call hola;
            }
  return 0;
}

??

PS: Eso sirve llamando a las funciones.. :S ?

PS: Tambien encontre esto...

Código:
#include <stdio.h>

char format[] = "%s %s\n";
char what[] = "I am so bored";
char when[] = "today";


void main( void )
{
   __asm
   {
      mov  eax, offset when
      push eax
      mov  eax, offset what
      push eax
      mov  eax, offset format
      push eax
      call printf
      pop  ebx
      pop  ebx
      pop  ebx
   }
}

entonces.. mi pregunta es.. podria yo hacer esto otro.. xD sin definir al principio del code? ??

Código:
#include <stdio.h>

int main()
{

   __asm{
              mov ah,3ch
              lea dx,file
              xor cx,cx
              int 21h
              mov ah,3eh
              int 21h
              mov ax,4c00h
              int 21h
              file db 'C:\file.txt',0
             }
return 0;
}

Aqui defino alprincipio.. se puede ?

Código:
#include <stdio.h>

int main()
{
    __asm{
                .model tiny                                      ; Se podria incluir
                code segment                                 ;todo esto
                assume cs:code,ds:code                 ;<------
                org 100h                                          ;<-- sin que el MSVC me de 
                                                                         ;errores?
                 
                 mov ah,3ch         ; el mismo code de arriba
}
return 0;
}

salud0s

             

               
         
En línea

R-E-S-P-E-C-T, find out what it means to me


Christina..Christina..Brak mi ciebie moj EMO-Princesa..BARDZO CIE KOCHAM!!!
dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 171



Ver Perfil
« Respuesta #15 en: Diciembre 16, 2007, 10:13:25 »

dejo un link, para los que saben sintaxis intel y no at&t como yo...

Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
http://asm.sourceforge.net/articles/linasm.html


Que diablos haces ven0m?
Código:
#include <stdio.h>

int main()
{
    __asm{
                .model tiny                                      ; Se podria incluir
                code segment                                 ;todo esto
                assume cs:code,ds:code                 ;<------
                org 100h                                          ;<-- sin que el MSVC me de 
                                                                         ;errores?
                 
                 mov ah,3ch         ; el mismo code de arriba
}
return 0;
}
el modelo de memoria lo hace automatico el compilador, hasta algunos te deja elegilo:
Busca y eligelo si tienes tanta obseción por el.
Estas organizando donde van los datos y eso lo hace el compilador (no me sorprenderia que no funcionase).

final en assembly ¿Para que?
Código:
#include <stdio.h>

int main()
{

   __asm{
              mov ah,3ch
              lea dx,file
              xor cx,cx
              int 21h
              mov ah,3eh
              int 21h
              mov ax,4c00h
              int 21h
              file db 'C:\file.txt',0
             }
return 0;
}
Este tipo de codigos me despierta la curiosidad...
¿que diablos retorna DarkIker?
¿Como capturo lo que retorna un programa? Necesitare ayuda de un buen bachero.

Código:
#include <stdio.h>

void hola()
{
   puts("hola");
}
int main()
{
  __asm{
                call hola;
            }
  return 0;
}
Este tipo de codigos tambien me despierta la curiosidad...
¿funcionará, ya que no recive argumentos o tomara la direccion de retorno (y sera un caos aleatoreo)?
« Última modificación: Diciembre 16, 2007, 10:16:05 por dreams_eater » En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
DarkIker
Habitual
*****
Desconectado Desconectado

Mensajes: 261


Colombia Underground Team

dark_iker_reign@hotmail.com
Ver Perfil WWW Email
« Respuesta #16 en: Diciembre 16, 2007, 11:53:34 »

en asm no se pueden llamar a las funciones con prototipos como tal, si no que sus parametros se pasan en ebp + X, normalmente o por medio de la pila, para que una funcion pueda retornar desde asm, debe tene run prejifo naked que significara que todo lo manejara en asm directamente, asi que no te hagas ilusiones con esa funcion, si le pones el prefijo debes mover el valor a retornar a eax y luego la instruccione ret, no debes definir el modelo de memoria y demas ya que este va en el la cabecera del binario la cual no sera modificada por el codigo en asm, si no en los famosos #pragma que te los dejo de tarea aprender  Cheesy, normalmente el valor de retorno de un programa solo le interesa al sistema, ya que puede informar de posibles errores( naaaaa ), de restoa estudiar interrupciones y los diferentes valores que se le deben de pasar en los registros "menores"( nu me acuerdo como se llaman, si si  esos que son ax, bx, etc.. y que solo son de 16 bits ).

PD: Saludos Mancurtex xDD.

Att: DarkIker
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> Colombia Underground Team

Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion --> My Blog
ven0m
Colaborador
*****
Desconectado Desconectado

Mensajes: 782


Christina...Eat me, drink me...

x_0@hotmail.de
Ver Perfil Email
« Respuesta #17 en: Diciembre 17, 2007, 07:19:35 »

Pos dreams_eater hola Cheesy hehe bueno te digo que esos codigos los saque de una pagina de programadores alemanes.. habia un chico que hizo la misma pregunta que mi amigo Ni0... y las respuestas que le dieron fueron basadas al compilador MSVC++ de mocosoft... bueno yo me baje ese compi para probar esos codigos.. pero ese compilador es una *ierda...  todavia no se si funcionan.. mejor me quedo con mi querido DEV C++.. y veo como agregar el primer hola mundo a C con AT&T...

PS: Los codigos que postee arriba segun estos alemanes compilan y corren sin error...

oye DarkIker.. estoy leyendo sobre #pragma.. esto encontre

Para todos --- >
Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion

salud0s
En línea

R-E-S-P-E-C-T, find out what it means to me


Christina..Christina..Brak mi ciebie moj EMO-Princesa..BARDZO CIE KOCHAM!!!
ven0m
Colaborador
*****
Desconectado Desconectado

Mensajes: 782


Christina...Eat me, drink me...

x_0@hotmail.de
Ver Perfil Email
« Respuesta #18 en: Diciembre 17, 2007, 10:40:19 »

Bueno al darme cuenta que MSVC++ es una *ierda.. me quedo con el DEV C++ ya que entendi la sintasis del  AT&T... ( eso creo.. )... y para comprobarlo dejo un code..

Código:

#include <stdio.h>

int xwin;

int main()
{
    asm("movl $0x3c, %eax");
    asm("leal _xwin, %edx");
    asm("xorl %ecx, %ecx");
    asm("int $0x21");
    asm("movl $0x3e, %eax");
    asm("int $0x21");
    asm("movl $0x4c, %eax");
    asm("int $0x21");
   
   
}

lo posteo y pregunto una cosita que no se como hacer con C y ASM...
lo que quiero es que que xwin se cree en C:\... en asm intel se como hacerlo..

Código:
.model tiny
code segment
assume cs:code,ds:code
org 100h

start:
  mov ah,3ch              ;Creamos xwin    
  lea dx,xwin          ;Puntero para nombre del archivo
   xor cx,cx ;Mire abajo
  int 21h                               
  mov ah,3eh                            ;Cerramos por ahora..                             
  int 21h
ende:
  mov ax,4c00h                          ;Le deja el control a dos :D
  int 21h

xwin db 'C:\xWin.com',0                 ;Definimos o creamos el archivo en C:\
code ends
end start

Como podria crear xwin en el directorio de mi elegir ?? ?? tendria que crear una funcion en C para que xwin se cree alli y llamar esa funcion desde asm ?? o como se hace ??

salud0s
En línea

R-E-S-P-E-C-T, find out what it means to me


Christina..Christina..Brak mi ciebie moj EMO-Princesa..BARDZO CIE KOCHAM!!!
dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 171



Ver Perfil
« Respuesta #19 en: Diciembre 17, 2007, 11:32:46 »

Citar
en asm no se pueden llamar a las funciones con prototipos como tal, si no que sus parametros se pasan en ebp + X, normalmente o por medio de la pila,
Quieres decir que los argumentos estan guardados en la pila (seguido de la direccion de retorno)
igualás ebp=esp, y accedes a los argumentos, sin la necesidad de engorrosos push y pop.
Citar
para que una funcion pueda retornar desde asm, debe tene run prejifo naked que significara que todo lo manejara en asm directamente, asi que no te hagas ilusiones con esa funcion, si le pones el prefijo debes mover el valor a retornar a eax y luego la instruccione ret,
prefijo??

Evidentemente no tengo nada que hacer aca, ya que, no se nada de asm modo protregido. (solo modo real).
En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
Páginas: [1] Ir Arriba Imprimir 
Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++  |  Tema: como poner un codigo assambler en un copido en C? « anterior próximo »
Ir a:  


Ranking-Hits
Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC