在c语言中调用汇编语言程序有哪些方法,汇编程序调用c程序
本文中目录C函数相互调用,C程序调用汇编程序,汇编程序调用C程序。
赵炯;《Linux 内核完全注释 0.11 修正版 V3.0》第三章。
c函数互相调用。CPU上的大多数程序使用堆栈来支持函数调用操作。堆栈用于传递函数参数,存储返回信息,临时保存寄存器的初始值以备恢复,以及存储本地数据。
单个函数调用操作使用的堆栈部分称为堆栈帧结构。在函数执行过程中,堆栈指针esp会随着数据进出堆栈而移动,所以函数中的大部分数据都是基于帧指针ebp来访问的:
Ebp:帧指针;esp堆栈指针;
对于函数A调用函数B的情况,传递给B的参数包含在A的堆栈帧中,当A调用B时,函数A的返回地址(调用返回后继续执行的指令的地址)被推入堆栈,堆栈中的这个位置也明确表示A的堆栈帧结束,B的堆栈帧从后续的堆栈部分开始。
为了保证某个时刻只有一个函数在执行,当调用者调用其他函数时,被调用者不会修改或覆盖调用者以后要使用的寄存器内容。Intel CPU采用所有函数必须遵守的寄存器用法:1。寄存器eax、edx和ecx的内容必须由调用者自己保存;2.ebx、esi、edi必须由被叫方保管;3.ebp和esp也需要被调用者保存。
void swap(int* a,int* b)
{
int c;
c=*a,*a=*b,* b=c;
}
int main()
{
int a,b;
a=16b=32
互换(a,b);
返回a-b;
}主堆栈框架。保存局部变量a和b,函数调用的参数b和a,返回地址。交换堆栈帧。按照约定,形成堆栈框架(保存ebp,esp),用add/sub取函数参数,一步到位离开堆栈框架。
c语言在调用函数时,将被调用函数的参数值临时存储在堆栈上。
堆栈上的最后一个参数,越靠近C函数的参数左侧。
c程序调用汇编程序。C程序调用汇编函数的方法与汇编程序调用C函数的原理相同,但在Linux内核程序中不常用。调用方法的重点还是在确定函数参数在栈中的位置。如果调用的汇编语言程序很短,可以在C程序中直接使用内联汇编。
汇编程序调用C,在汇编中调用C函数相对自由。只要栈中适当位置的内容可以作为C函数的参数。
如果您直接调用func(),而没有按下专门用于调用它的参数,func()函数仍将使用堆栈中EIP位置上方的其他内容作为自己的参数。
调用函数返回后,汇编器需要清除之前推入堆栈的函数参数。
,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。