ZKX's LAB

我主程序是用汇编语言编写的,现在我要调用一段用C语言编写的子程序我该怎么调用?用什么语句? 汇编调用c语言原理

2021-04-04知识3

如何用汇编实现C语言函数调用 1。对于“汇编调用”:我知道你要调用func,而不是它本身,但如果这个函数比较复杂时是必须用逆向先分析func这个函数,然后再确定参数列表和返回值的…2。对于你的内联汇编的代码:这里到底要不要用add%3,%rsp;还是一个问题,因为要看函数使用的是什么调用标准,有标准C的,VB的,Pascal的,包括fastcall,stdcall,cdecl等…3。对于“知道函数参数的起始地址和长度”:这个的话,除了参数中有字符数组和直接结构体什么的,所有的基本变量基本都是每8字节(64位)一个,并且Intel一般都用bigendian的,也就是说,在内存中 01 02 03 04 05 06 07 08 读入寄存器后会变为:0x0807060504030201所以说对于简单的函数,用8字节一个参数来做就好了…而对于有字符数组什么的就必须用逆向分析了…这个…只能进行逆向分析了…反正你知道了函数的地址和长度…就是你把编译为机器码的程序用反编译工具翻译成汇编,然后分析一下就好了,C语言的汇编还是比较简单…比如这个函数:int func(int a,int*b){float要用到CPU的FPU,指令记不得,要查下为了简单就改为int*printf(\"a=d,b=d\\n\",a,*b);return a;}编译成机器码后,反编译,如果不加优化,一般都会这样:(假设。

汇编语言是怎么调用c语言的程序的? 一、参数传递的基本规则(ATPCS(ARM—ThumbProcedureCallStandard))1、参数传递二、汇编程序32313133353236313431303231363533e59b9ee7ad9431333433633531、C程序相互调用举例1、C程序调用汇编程序汇编程序的设计要遵守ATPCS(ARM—ThumbProcedureCallStandard),保证程序调用时参数的正确传递。在汇编程序中使用EXPORT伪操作声明本程序,使得本程序可以被别的程序调用。在C程序使用extern声明该汇编程序。下面是一个C程序调用汇编程序的例子。其中汇编程序strcopy实现字符串复制功能,C程序调用strcopy完成字符串复制的工作。C程序includeexternvoidstrcopy(chard,constchars);intmain{constcharsrcstr=”Firststring-source”;chardststrSecondstring-destination”;printf(“Beforecopying:\\n”);printf(“%s\\ns\\n”,srcstr,dststr);strcopy(dststr,srcstr);printf(“Aftercopying:\\n”);printf(“%s\\ns\\n“,srcstr,dststr);while(1)}汇编程序AREAScopy,CODE,READONLYEXPORTstrcopyStrcopyLDRBR2,[R1],1STRBR2,[R0],1CMPR2,#0BNEStrcopyMOVPC,LREND2、汇编程序调用C程序汇编程序的设计要遵守。

关于汇编调用C语言子程序的大大疑问。有图的 并没有统一规定,这取决于编译器规则,以及所用的CPU内核类型,C语言用于很多编程环境的CPU,不同的CPU方式不同,你的貌似是ARM,ARM的规定就是前4个寄存器存参数,超过4个就要入栈,具体位置取决于SP入栈时的位置,第5个也就是e,就在栈顶位置,第6个就是栈顶+4(ARM的SP增长方向貌似是-,所以应该+4),以此类推。其实你的参数表就是一长串数据,超过4*4字节的部分数据就入栈。这个规则只适合于ARM芯片,用是keil gcc等编译器都符合这个规则,对于其他芯片因为内核构造就不同,比如我们电脑用的i86,根本不存在r0-rn这样的寄存器,自然不是这样,所以原则不同。

#汇编调用c函数#汇编调用c语言原理

随机阅读

qrcode
访问手机版