2010-02-08 20 views
6

Tengo una pregunta sobre el ensamblador en línea. ¿Es posible llamar a otra subrutina de ensamblador desde el ensamblador en línea dentro de la misma función? Por ejemplo:llamada de ensamblador en línea para la subrutina

void FindValidPID(unsigned int &Pid) 
{ 
    __asm 
    { 
     sub esp, 20h 
     mov eax, Pid 
     add eax,eax 
     call sub123 ; another assm subroutine 
     mov Pid, eax 
     add esp, 20h 
    } 
} 

Donde debo, y cómo, escriba subrutina sub123?

Cheers,
Thomas

+0

¿Qué quiere decir por el " misma "función? No se refiere a la recursividad ni a la definición de un punto de entrada alternativo para una especie de sub-recursión. Parece que quiere simplemente definir y llamar a una función. – Potatoswatter

Respuesta

2

Si usted está escribiendo un subprograma entero en el montaje, se debe mirar en el uso del ensamblador a nivel de archivo en lugar de en línea.

1

Supongamos que tiene una subrutina _func2 escrita en ensamblador (solo conozco la sintaxis de NASM).

global _func2 

    section .text 
_func2: 
    ret 

Usted puede llamar a esta subrutina de su código C++ como esto

extern "C" { 
void func2(); 
} 

void func1() 
{ 
    __asm { 
     call func2 
    } 
} 

int main() 
{ 
    func1(); 
} 

Por supuesto func2 también puede ser un/C función C++ con un bloque __asm.

0

Puede hacerlo creando la otra función tal como lo hizo con la primera y luego llámela con su nombre destrozado como call __GLOBAL__I_sub123;.

Podría ser una buena idea declararlo como extern "C" para hacer las cosas más simples.

En gcc, puede usar gcc -S file.cpp para ver cuál es el nombre destrozado del funciton.

1

De la sintaxis, supongo que el compilador utilizado es VC++? Si es así, una función desnuda (http://msdn.microsoft.com/en-us/library/5ekezyy2(VS.80).aspx) debería permitirle definir una función que se pueda llamar fácilmente desde el código de lenguaje ensamblador.

(funciones desnudo también son visibles a C++, por lo que se les puede llamar desde C++, así y potencialmente obtener los resultados equivocados ... lo que sólo hay que tener cuidado!)

Cuestiones relacionadas