Вызов подпрограммы на встроенном ассемблере

У меня вопрос по встроенному ассемблеру. Можно ли вызвать другую подпрограмму ассемблера из встроенного ассемблера в той же функции? Например:

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

Где и как мне написать подпрограмму sub123?

С уважением,
Томас


person Thomas    schedule 08.02.2010    source источник
comment
Что вы подразумеваете под одной и той же функцией? Вы не имеете в виду рекурсию или определение альтернативной точки входа для своего рода подрекурсии. Похоже, вы хотите просто определить и вызвать функцию.   -  person Potatoswatter    schedule 08.02.2010


Ответы (4)


Если вы пишете всю подпрограмму на ассемблере, вам следует использовать ассемблер на уровне файлов, а не встроенный.

person Potatoswatter    schedule 08.02.2010

Предположим, у вас есть подпрограмма _func2, написанная на ассемблере (я знаю только синтаксис NASM).

    global  _func2

    section .text
_func2:
    ret

Вы можете вызвать эту подпрограмму из своего кода C++ следующим образом

extern "C" {
void func2();
}

void func1()
{
    __asm {
        call func2
    }
}

int main()
{
    func1();
}

Конечно, func2 также может быть функцией C/C++ с блоком __asm.

person Jan Deinhard    schedule 08.02.2010

Из синтаксиса я предполагаю, что используется компилятор VC++? Если это так, голая функция (http://msdn.microsoft.com/en-us/library/5ekezy2(VS.80).aspx) должен позволить вам определить функцию, которую можно легко вызвать из кода на языке ассемблера.

(Голые функции также видны для C++, поэтому вы можете вызывать их и из C++ и потенциально получать неверные результаты... так что вам просто нужно быть осторожным!)

person Community    schedule 08.02.2010

Вы можете сделать это, создав другую функцию так же, как вы сделали с первой, а затем вызвать ее с искаженным именем, например call __GLOBAL__I_sub123;.

Возможно, было бы неплохо объявить его как extern "C", чтобы упростить задачу.

В gcc вы можете использовать gcc -S file.cpp, чтобы увидеть искаженное имя функции.

person Gianni    schedule 08.02.2010