SoloCodigo
Programación General => C/C++ => Mensaje iniciado por: scatterbrain en Martes 31 de Mayo de 2005, 22:14
-
he sabido que uno en un programa escrito en c (no se si en c++) puede tener partes de codigo en assembly ,mi pregunta va dirigida a que reglas y consideraciones hay que tener cuando uno hace esto ya que he intentado escribir algun trozo en assembly asi:
ams{
//trozo de codigo
}
y los resultados han sido nefastos.alguien tiene experiencia en esto,con algunos consejos quedaria bien.
-
Si te interesa, y lees literatura en inglés de computación, te puedo poner aquí lo que al respecto viene en el MSDN 6 de Microsoft. Te muestro la primera página
------------------------------------
Assembler (Inline): Overview
Home | How Do I | Details
Assembly language serves many purposes, such as improving program speed, reducing memory needs, and controlling hardware. You can use the inline assembler to embed assembly-language instructions directly in your C and C++ source programs without extra assembly and link steps. The inline assembler is built into the compiler — you don't need a separate assembler such as the Microsoft Macro Assembler (MASM).
Note Programs with inline assembler code are not fully portable to other hardware platforms. If you are designing for portability, avoid using inline assembler.
What do you want to know more about?
Inline assembler
The __asm keyword
C or C++ in __asm blocks
Registers
Jumps to labels
C function calls from an __asm block
C++ function calls from an __asm block
__asm blocks as C macros
Optimizing inline assembly code
-
he sabido que uno en un programa escrito en c (no se si en c++) puede tener partes de codigo en assembly ,mi pregunta va dirigida a que reglas y consideraciones hay que tener cuando uno hace esto ya que he intentado escribir algun trozo en assembly asi:
ams{
//trozo de codigo
}
y los resultados han sido nefastos.alguien tiene experiencia en esto,con algunos consejos quedaria bien.
Nunca lo he hecho, pero he visto que cuando quieres programar ASM en C++ debes colocarlo asi:
_asm{
//con el guión bajo
}
Puedo estar equivocado, pero asi he leido las referencias.
Ojala te sirva.
Chao
-
depende el compilador que uses
-
Utilizar asm en c++ es sencillo, te muestro un pedazo de codigo de un programa que hize hace un poco de tiempo:
float Vector::operator * (const Vector& Vec)
{
#if asm3dnow
float total;
_asm
{
femms
movd mm0,dword ptr [ecx]
movd mm1,dword ptr [ecx+4]
movd mm2,dword ptr [ecx+8]
mov eax,dword ptr [esp+8]
movd mm3,dword ptr [eax] //Vec.x
movd mm4,dword ptr [eax+4] //Vec.y
movd mm5,dword ptr [eax+8] //Vec.z
pfmul mm0,mm3
pfmul mm1,mm4
pfmul mm2,mm5
pfadd mm0,mm1
pfadd mm0,mm2
movd total,mm0
femms
}
return total;
#endif
#if asmsse
float total;
_asm
{
movss xmm0,dword ptr [ecx]
movss xmm1,dword ptr [ecx+4]
movss xmm2,dword ptr [ecx+8]
mov eax,dword ptr [esp+8]
movss xmm3,dword ptr [eax]
movss xmm4,dword ptr [eax+4]
movss xmm5,dword ptr [eax+8]
mulss xmm0,xmm3
mulss xmm1,xmm4
mulss xmm2,xmm5
addss xmm0,xmm1
addss xmm0,xmm2
movss total,xmm0
}
return total;
#endif
#if normal
return x*Vec.x+y*Vec.y+z*Vec.z;
#endif
}
Este programa lo compilé en VC++ 6 y VC++ .NET sin ningún problema. Espero te sea de ayuda.
niofis
-
si mal no recuerdo en .NET va
__asm
es decir con doble '_'
por otro lado esa sintaxis como bien lo has dicho no es generica, en compiladores como el DJGPP no funciona.
-
Creo que se refiere a las restricciones:
Por ejemplo:
+ Cuales registros puedes modificar a gusto y cuales tienes que preservar.
+ Si defines toda una función en asm: como acceder a los parámetros y como devolver el resultado.
+ Que pasa si ocurre un error como "dividir entre cero".
Pero esto es mejor saberlo de la ayuda del compilador que uno está utilizando.