zoukankan      html  css  js  c++  java
  • ARM汇编学习笔记

    ARM  RISC  (Reduced Instruction Set Computers) 

    X86   CISC  (Complex Instruction Set Computers)   

     

    ARMv3--ARMv7支持32位, ARMv8-A 开始支持64位

    32bit ARM汇编有16个32位寄存器:
    - r0-r3 主要用来传递函数调用第1到第4个参数(a0-a3),更多的参数须通过栈来传递。
    - r0-r1 也作为结果寄存器,保存函数返回结果;被调用的子程序在返回前无须恢复这些寄存器的内容。
    - r4-r9 为被调保存(callee-save)寄存器,一般保存内部局部变量(local variables)。
    - r7 大部分情况用来保存系统调用号(syscall number)。
    - r9 某些变体可能当作特殊寄存器。
    - r10(SL)被调保存寄存器,Stack Limit。
    - r11(FP)被调保存寄存器, 帧指针(Flame Pointer)。
    - r12(IP)特殊寄存器,栈寄存器(Intra Procedure)。
    - r13(SP)特殊寄存器,栈指针,类似x86_64中的RSP。
    - r14(LR)特殊寄存器。Link Register.
    - r15(PC)特殊寄存器。Program Counter (like RIP in x86_64 & EIP in x86).

    CPSR((当前程序状态寄存器):

    常见的指令条件码:

    根据“ARM-thumb 过程调用标准”:
    r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。
    被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。
    r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。
    r12内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。
    在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。
    r13栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。
    r14链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复
    r15程序计数器 PC。它不能用于任何其它用途。
    注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护R4~R11

    NEON指令集:

    Q0~Q15: 128 bit 

    D0~D31: 64 bit

    S0~S31: 32bit  == D0~D15

    64位下NEON寄存器:

    32个B寄存器(B0~B31),8bit
    32个H寄存器(H0~H31),半字 16bit
    32个S寄存器(S0~S31),单字 32bit
    32个D寄存器(D0~D31),双字 64bit
    32个Q寄存器(V0~V31),四字 128bit
    不同位数下寄存器之间的关系如下图所示:

    其中S0是D0的低半部分,D0是V0的低半部分 。

     http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/ch01s03s02.html

     

    v0~v32 向量寄存器的使用:http://www.lujun.org.cn/?p=1637

     

    Arm32--Arm64指令对应关系

     

    NEON基本指令集

    NEON指令按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。

    正常指令:生成大小相同且类型通常与操作数向量相同到结果向量。

    长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度到两倍,并属于同一类型。L标记,如VMOVL。

    宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果。W标记,如VADDW。

    窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半。N标记,如VMOVN。

    饱和指令:当超过数据类型指定到范围则自动限制在该范围内。Q标记,如VQSHRUN

    NEON指令按照作用可以分为:加载数据、存储数据、加减乘除运算、逻辑AND/OR/XOR运算、比较大小运算等,具体信息参考资料[1]中附录C和附录D部分。

  • 相关阅读:
    字节跳动总监知乎5716赞的Java开发笔记
    刚面完阿里Java高级岗40K的offer,这些技术你必须要掌握!
    HDOJ 1253 胜利大逃亡(bfs)
    swjtu 1962 A+B(模拟)
    swjtu 2213 A Game About Cards(模拟题)
    HDU 1544 Palindromes(回文子串)
    第八章 异常控制流
    第四讲 深入介绍信号与槽
    第三讲 对话框的创建
    第二讲 窗口部件的布局与通信
  • 原文地址:https://www.cnblogs.com/awiki/p/6897392.html
Copyright © 2011-2022 走看看