| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
slayerlp
Registrado: 09 Dic 2011 Mensajes: 3
| Publicado: 09/12/2011 5:08 pm | | | Título: [Ayuda] Programacion Hibrida C/C++ & ASM |
| Alguien me podría ayudar con el tema de la programación híbrida?
necesito invocar un procedimiento de ensamblador desde C ó C++ sin usar la directiva _asm { [instrucciones en ASM] } es decir, hacer el link del obj en C/C++ y ASM.
He estado invstigando sobre el tema y he podido crear hasta el ejecutable. Pero en el Visual Studio 2010, me da un error a la hora de ejecutarlo: Run-Time Check Failure #2 - Stack around the variable 'numero' was corrupted.
y no se por que :S
este es el codigo en C:
| Código: | #include <stdio.h> extern short sqrte(short n); int main(){ short numero; printf("¿numero!!?"); scanf("%d",&numero); printf("%d",sqrte(numero)); }
|
y este es el del ensamblador:
| Código: | .model small .code public _sqrte _sqrte proc push bp mov bp,sp mov cx,[bp+4] mov bx,cx mov ax,1 jmp short cero lazo1: sub cx,ax add ax,2 cero: cmp cx,ax jge lazo1
sar ax,1 mov cx,ax imul cx add ax,cx inc ax cmp ax,cx jg fin inc cx fin: mov ax,cx pop bp ret _sqrte endp end |
Espero alguien me pueda ayudar :/ |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 6586 Ubicación: Mexico
| Publicado: 09/12/2011 8:12 pm | | | Título: |
| El programa en C tiene errores. La palabra reservada "extern" no es necesaria en la declaración de la funcion "sqrte", falta el valor de retorno de la función "main" y el especificador de formato para el tipo "signed short" es "%hd".
Ese programa con las correcciones es:
| Código: | #include <stdio.h>
short sqrte(short n);
int main() { short numero; puts("Numero:"); scanf("%hd", &numero); printf("%d", sqrte(numero)); return 0; } |
Para revisar el código fuente en ensamblador habrá que esperar a alguien mas.
Un saludo _________________ Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short. -- Mentat Handbook |
| | Volver arriba | |  | untio

Registrado: 17 Sep 2008 Mensajes: 290 Ubicación: MICA S.A.
| Publicado: 10/12/2011 6:14 am | | | Título: |
| Hola,
Sí que es curioso el proyecto.
Creo entender que quieres mezclar código de Visual Studio 2010 (32 ó 64 bits), con código de 16 bits. ¡Menudo lío! ¡Cómo se te ocurre eso!
Puedes decirme si el código ha de ser de 16, 32 ó 64 bits y qué tiene que hacer la función sqrte para ayudarte.
Espero respuesta. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | | slayerlp
Registrado: 09 Dic 2011 Mensajes: 3
| Publicado: 10/12/2011 5:00 pm | | | Título: |
| Hola, muchisimas gracias miren, la funcion sqrte saca la raiz cuadrada de un numero.
el proyecto tendrá que ser de 16 bits, ya que solo manejo dichos registros  y si, a la hora de compilar me dice que hay un error a la hora de hacer el link entre los dos .obj, por que estoy tratando de compilarlos con un compilador de 32 bits y no con uno de 16 bits :S |
| | Volver arriba | |  | untio

Registrado: 17 Sep 2008 Mensajes: 290 Ubicación: MICA S.A.
| Publicado: 11/12/2011 2:50 am | | | Título: |
| Hola de nuevo:
Tienes 2 opciones:
1. Cambiar el código en assembly a 32 bits:
No es tan complicado como te puede parecer:
Los registros de 32 bits se llaman igual pero anteponiendo una "e": eax, ebx, ecx, edx, edi, esi, ebp ... La mitad de menor peso se llama como la versión de 16 bits. Dentro de la mitad de menor peso la cosa funciona como en 16 bits. Me explico: La mitad de menor peso de eax se llama ax y dentro de ax el byte de menor peso se llama al y el de mayor ah. Las instrucciones son exactamente las mismas. El primer parámetro no está en ebp + 4 sino en ebp + 8. Has de cambiar .model small a .model flat Si has de especificar un procesador, has de poner de .486 para arriba. Si has de retornar un byte lo haces en al Si has de retornar una palabra en ax Si has de retornar una doble palabra en eax Si has de retornar una cuadruple palabra en edx:eax
2. Cambiar a un compilador C de 16 bits:
Por internet tienes una versión gratuita de Turbo C de Borland. Es cuestión de buscar.
Otra cosa es que tu procedimiento en assembly está obligado a devolver intactos los registros que no sean eax, ebx, ecx y edx. Esto lo especifica la convención de llamada C.
Espero que te sea útil.
Reeditado:
Ah, se me olvidaba decirte que en el modelo flat todos los registros de segmento apuntan al mismo segmento, por lo que te olvidas de ellos. Ese segmento tiene un tamaño de 4GBs. Sería raro que necesitaras más memoria.
Por ello, en este modelo de memoria no he escrito todavía el nombre de un registro de segmento.
Como puedes imaginar, es más fácil trabajar con el modelo flat de lo que era en modo 32 bits. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | slayerlp
Registrado: 09 Dic 2011 Mensajes: 3
| Publicado: 13/12/2011 12:37 pm | | | Título: |
| Muchisimas gracias amigo!!! no habia encontrado esta información en ningun lado! Gracias!! PD: Que libro de ASM me recomiendas leer?? |
| | Volver arriba | |  | | untio

Registrado: 17 Sep 2008 Mensajes: 290 Ubicación: MICA S.A.
| Publicado: 14/12/2011 5:15 am | | | Título: |
| Hola nuevamente,
Hace unos años se podía recomendar un libro de aquellos gordotes a alguien que estaba empezando a conocer un lenguaje de programación, pero con Internet todo ha cambiado.
Ten en cuenta que para programar a fondo con un lenguaje, api o librería lo que necesitas es una documentación exhaustiva de cada opción. Para ello, lo ideal es conseguir la referencia completa o buscarla en la red.
Naturalmente, para empezar desde cero lo ideal es comprar un libro no muy caro o leerse un buen tutorial en la red. Pero esto para conocer el método, no los detalles.
Concretamente, para saber qué hace cada opcode de assembly, o para hacer programas win32 con él, lo ideal es descargarse el sdk de masm32:
[url] http://www.masm32.com/ [/url]
Con él, vienen los ficheros de inclusión, las librerías y la documentación que necesitas.
Yo aprendí a usar el fpu (coprocesador) gracias a unos archivos de ayuda que vienen con él.
Además, tienen un foro con auténticos hackers.
Espero que te sea útil. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | alcaudon
Registrado: 26 Nov 2011 Mensajes: 3
| Publicado: 16/12/2011 2:44 pm | | | Título: |
| | slayerlp escribió: | Muchisimas gracias amigo!!! no habia encontrado esta información en ningun lado! Gracias!! PD: Que libro de ASM me recomiendas leer?? |
Sin duda recomiendo el libro de "El universo digital", de Ciriaco García de Celis (un verdadero genio de la programación). Ameno y completamente didáctico, y que además puede conseguirse de forma gratuita en formato digital.
|
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |