Встроенный вызов ассемблера для подпрограммы - PullRequest
6 голосов
/ 08 февраля 2010

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

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?

Приветствия
Томас

Ответы [ 4 ]

2 голосов
/ 08 февраля 2010

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

1 голос
/ 08 февраля 2010

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

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

1 голос
/ 08 февраля 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.

0 голосов
/ 08 февраля 2010

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

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

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

...