zoukankan      html  css  js  c++  java
  • C C++ ARM X86 函数 方法 的调用约定

    参考:https://bbs.pediy.com/thread-224583.htm

    整理成表格方便查询

    cdecl(C规范),

    stdcall(WinAPI默认),

    fastcall,

    ATPCS(ARM-Thumb Procedure Call Standard/ARM-Thumb过程调用标准) ,

    thiscall(用于C++中类成员函数)

    调用约定架构 X86 X64 ARM AARCH64
    cdecl 参数从右往左依次入栈,调用者实现栈平衡,返回值存放在 EAX 中。 X X X
    stdcall 参数从右往左依次入栈,被调用者实现栈平衡,返回值存放在 EAX 中。 X X X
    fastcall 

    参数1~参数2 分别保存在 ECX、EDX ,

    剩下的参数从右往左依次入栈,

    被调用者实现栈平衡,

    返回值存放在 EAX 中。

    参数1~参数4 分别保存在 RCX、RDX、R8D、R9D ,

    剩下的参数从右往左依次入栈,

    被调用者实现栈平衡,

    返回值存放在 RAX 中。

    X X
    thiscall

    参数从右往左依次入栈,

    this指针存放ECX中,

    被调用者实现栈平衡,

    返回值存放在 EAX 中。

    参数1~参数3 分别保存在RDX、R8D、R9D中,

    this指针存放RCX中,

    剩下的参数从右往左依次入栈,

    被调用者实现栈平衡,

    返回值存放在 RAX 中。

    (C++)

    参数1~参数3 分别保存在R1~R3中,

    this指针存放R0中,

    剩下的参数从右往左依次入栈,

    被调用者实现栈平衡,

    返回值存放在 R0 中。

    (C++)

    参数1~参数7 分别保存到 X1~X7 寄存器中,

    this指针存放X0中,

    剩下的参数从右往左依次入栈,

    被调用者实现栈平衡,

    返回值存放在 X0 中。

    ATPCS X X

    (C语言)

    参数1~参数4 分别保存到 R0~R3 寄存器中 ,

    剩下的参数从右往左依次入栈,

    被调用者实现栈平衡,

    返回值存放在 R0 中。

    (C语言)

    参数1~参数8 分别保存到 X0~X7 寄存器中 ,

    剩下的参数从右往左依次入栈,

    被调用者实现栈平衡,

    返回值存放在 X0 中。

    ARM相关的杂项记录:

    ARM 32 64位 指令 B BL BX BR BLX BLR 的区别

    2種跳法

    立即数跳(标记的地址為指令的參數)

    寄存器跳(PC的值由參數寄存器給出)

         
    指令集 A32/A64 A32/A64 A64  

    保存LR(返回地址)

    類似X86的CALL

    BL

    立即数相對跳

    效果:

    X30=PC + 4

    PC=PC+LABEL

    BLX

    立即数相對跳

    效果:

    X30=PC + 4

    PC=PC+LABEL

    切換指令集

    寄存器跳

    效果:

    X30=PC + 4

    PC=Xn

    切換指令集

    BLR

    寄存器跳

    效果:

    X30=PC + 4

    PC=Xn

     

    不保存LR(返回地址)

    類似X86的JMP

    B

    立即数相對跳

    效果:

    PC=PC+LABEL

    BX

    寄存器跳

    效果:

    PC=Xn

    切換指令集

    BR

    寄存器跳

    效果:

    PC=Xn

     

    带X 的:BX  BLX 会根据给出的地址的最后一位[0]判断  =0切换为ARM指令模式,=1切换为Thumb指令模式

    64位的 RET指令 = mov pc,x30.    x30=LR, 一般配合带L的跳转,如BL,BLX,BLR

    立即數相對跳中 ,LABEL相對當前PC的地址範圍 在 A64  LABEL = ±128MB   ,在 A32 下  LABEL = ±32MB

    參考:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0802b/Cihfddaf.html

    執行狀態切換

    对于A32来说,ARM和thumb的切换,通过bx指令即可切换。但是对于A64和A32两种执行状态,只能通过异常,进行切换。

    • 切换到低EL,执行状态要么保持,要么切换到A32
    • 切换到高EL,执行状态要么保持,要么切换到A64

    如操作系統在EL1是 A32,那麽應用程序在EL0的話,只能是A32狀態,即使你的芯片支持A64

    如操作系統在EL1是 A64,那麽應用程序在EL0的話,能是A32或A64狀態 ,如android 的 linker (A32) 和 linker64(A64)

    參考:http://www.lujun.org.cn/?p=688

  • 相关阅读:
    METHODS OF AND APPARATUS FOR USING TEXTURES IN GRAPHICS PROCESSING SYSTEMS
    Display controller
    Graphics processing architecture employing a unified shader
    Graphics-Processing Architecture Based on Approximate Rendering
    Architectures for concurrent graphics processing operations
    Procedural graphics architectures and techniques
    DYNAMIC CONTEXT SWITCHING BETWEEN ARCHITECTURALLY DISTINCT GRAPHICS PROCESSORS
    Thermal zone monitoring in an electronic device
    System and method for dynamically adjusting to CPU performance changes
    Framework for Graphics Animation and Compositing Operations
  • 原文地址:https://www.cnblogs.com/cyy12/p/11546367.html
Copyright © 2011-2022 走看看