6

我对内联汇编器有疑问。可以在同一个函数中从内联汇编器调用另一个汇编器子例程吗?例如:

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

4 回答 4

2

如果您在汇编中编写整个子例程,您应该考虑使用文件级汇编程序而不是内联。

于 2010-02-08T11:16:39.680 回答
1

假设你有一个_func2用汇编程序编写的子程序(我只知道 NASM 语法)。

    global  _func2

    section .text
_func2:
    ret

您可以像这样从 C++ 代码中调用此子例程

extern "C" {
void func2();
}

void func1()
{
    __asm {
        call func2
    }
}

int main()
{
    func1();
}

当然func2也可以是带有__asm块的 C/C++ 函数。

于 2010-02-08T13:01:11.610 回答
1

从语法来看,我假设正在使用的编译器是 VC++?如果是这样,裸函数 ( http://msdn.microsoft.com/en-us/library/5ekezyy2(VS.80).aspx ) 应该让您定义一个可以从汇编语言代码中轻松调用的函数。

(裸函数对 C++ 也是可见的,因此您也可以从 C++ 调用它们,并且可能会得到错误的结果......所以您必须小心!)

于 2010-02-08T13:14:42.357 回答
0

您可以像创建第一个函数一样创建另一个函数,然后使用其损坏的名称调用它,例如call __GLOBAL__I_sub123;.

声明它extern "C"以使事情更简单可能是一个好主意。

在 gcc 中,您可以使用gcc -S file.cpp来查看函数的错位名称是什么。

于 2010-02-08T13:09:46.073 回答