内联汇编程序调用子程序

时间:2010-02-08 10:13:21

标签: c++ assembly inline-assembly

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

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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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 ++函数。

答案 2 :(得分:1)

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

(Naked函数对C ++也是可见的,所以你也可以用C ++调用它们,并且可能得到错误的结果......所以你必须要小心!)

答案 3 :(得分:0)

你可以像创建第一个函数一样创建另一个函数,然后使用像call __GLOBAL__I_sub123;这样的错位名称来调用它。

将其声明为extern "C"以使事情变得更简单可能是个好主意。

在gcc中,您可以使用gcc -S file.cpp查看功能错误的名称是什么。