2010-02-08 12 views
6

Ho una domanda sull'assemblatore in linea. È possibile chiamare un'altra subroutine assemblatore da assemblatore in linea all'interno della stessa funzione? Ad esempio:Chiamata assemblatore in linea per subroutine

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 
    } 
} 

Dove dovrei, e come, scrivere subroutine sub123?

Cheers,
Thomas

+0

Cosa vuoi dire dal " stessa "funzione? Non intendi la ricorsione o la definizione di un punto di ingresso alternativo per un tipo di sub-ricorsione. Sembra che tu voglia semplicemente definire e chiamare una funzione. – Potatoswatter

risposta

2

Se si sta scrivendo un intero subroutine in assemblea, si dovrebbe considerare di usare l'assemblatore a livello di file piuttosto che in linea.

1

Supponiamo di avere una subroutine _func2 scritta in assembler (conosco solo la sintassi NASM).

global _func2 

    section .text 
_func2: 
    ret 

È possibile chiamare questa subroutine dal codice C++ come questo

extern "C" { 
void func2(); 
} 

void func1() 
{ 
    __asm { 
     call func2 
    } 
} 

int main() 
{ 
    func1(); 
} 

Naturalmente func2 può anche essere una funzione C/C++ con un blocco __asm.

0

È possibile farlo creando l'altra funzione proprio come si faceva con la prima e quindi chiamarla con il nome di stordimento come call __GLOBAL__I_sub123;.

Potrebbe essere una buona idea dichiararlo come extern "C" per semplificare le cose.

In gcc, è possibile utilizzare gcc -S file.cpp per vedere qual è il nome del nome alterato della funciton.

1

Dalla sintassi, presumo che il compilatore in uso sia VC++? In tal caso, una funzione nuda (http://msdn.microsoft.com/en-us/library/5ekezyy2(VS.80).aspx) dovrebbe consentire di definire una funzione che può essere facilmente chiamata dal codice del linguaggio assembly.

(funzioni nudi sono visibili anche in C++, in modo da poterli chiamare da C++ come bene e potenzialmente ottenere i risultati sbagliate ... quindi bisogna solo stare attenti!)

Problemi correlati