查询建设工程施工规范网站,成都住建局官网e蓉,dw网页设计说明,织梦网站手机版怎么做关于不同处理器的函数调用规则 接前面一篇变长参数调用的记录#xff0c;这次从原理上进行了进一步研究。
不同调用规则对对于编译出来的汇编影响很大的#xff0c;这里之前的理解比较粗浅#xff0c;尤其是一般教科书或者网上能看到的内容都比较老#xff0c;这里记录一下…关于不同处理器的函数调用规则 接前面一篇变长参数调用的记录这次从原理上进行了进一步研究。
不同调用规则对对于编译出来的汇编影响很大的这里之前的理解比较粗浅尤其是一般教科书或者网上能看到的内容都比较老这里记录一下。
这里要重点提醒一下之前一直以为函数调用是编译器制定的规则不同编译器的实现不同但是现在发现这个理解是错的其实是处理器架构规定的所以这里和编译器有关系但是不大编译器也是为了符合处理器规定来做的只不过编译器有一定的自由度但自由度不大。
首先是这个网站里面有具体的说明。
还有很多这里只是简单的贴两张图以防网站丢失。
然后是这篇文章里面说明了asmlinkage宏的定义其实这个宏在x86平台上才有效arm平台上没有意义。
这也和我这两天的实验结果相符我尝试给函数增加cdecl或者fastcall之类的属性但是编译器一直会报warning。
warning: ‘cdecl’ attribute directive ignored [-Wattributes]开始还不理解现在看来其实是因为编译器选项是arm64里面没有cdecl这个属性所以才会报这个warning。
另外关于上面提到的ATPCS规则这个网页简单的记录了一下可以作为扫盲。
那么在这个情况下对可变参数的获取要借助编译器自带的一些内联函数比如
__builtin_va_list
__builtin_va_start
__builtin_va_end
__builtin_va_copy
__builtin_next_arg
__builtin_saveregs这里再贴一个别人实验的图和我这边自己观察到的现象也完全一样再aarch64中有名参数和匿名参数在栈中的位置并不是连续的这一点要格外注意这次的错误就是由于这里导致的。 这是别人的
这是我的
所以其实栈空间的分布就是这样的
好了这个问题到这里基本上就结了。