我对内联汇编程序有疑问。可以在同一个函数中从内联汇编程序调用另一个汇编程序子程序吗?例如:
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?
干杯,
托马斯
答案 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
查看功能错误的名称是什么。