/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

[Ayuda] Programacion Hibrida C/C++ & ASM

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
slayerlp



Registrado: 09 Dic 2011
Mensajes: 3

MensajePublicado: 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

MensajePublicado: 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.

MensajePublicado: 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
Yahoo Messenger
slayerlp



Registrado: 09 Dic 2011
Mensajes: 3

MensajePublicado: 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 Smile
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.

MensajePublicado: 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
Yahoo Messenger
slayerlp



Registrado: 09 Dic 2011
Mensajes: 3

MensajePublicado: 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.

MensajePublicado: 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
Yahoo Messenger
alcaudon



Registrado: 26 Nov 2011
Mensajes: 3

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com