Assembly Arm
关于X86 与 arm的寄存器的区别写在了arm那篇下
arm
https://developer.arm.com/documentation/dui0068/b/CIHEDHIF
Arm 的四种寻址方式
Aarch64
Arm A64 Instruction Set Architecture
https://modexp.wordpress.com/2018/10/30/arm64-assembly/
直接阅读文档 Arm® A64 Instruction Set Architecture
Armv8, for Armv8-A architecture profile最有效
指令后缀说明
read from ARMv8 Instruction Set Overview 4.2 Instruction Mnemonics
The container is one of:
The subtype is one of:
combine
1 | <name>{<subtype>} <container> |
注意后缀的作用主体
指令速查
官网查找指令: https://developer.arm.com/architectures/instruction-sets/intrinsics
https://armconverter.com/?disasm&code=0786b04e
SIMD/vector
几乎每个指令都可以同时作用在不同寄存器和vector或者scalar上。比如add指令,并没有像X86一样设计vadd或者addps等单独
的指令,如果一定要区分,只能从寄存器是不是vector下手。
根据这个图,确实是有做向量操作的add,FADD是float-add的意思,ADDP是将相邻的寄存器相加放入目的寄存器的意思。不影响是标量scalar还是向量vector的操作。addv是将一个向量寄存器里的每个分量归约求和的意思,确实只能用在向量指令。
由于需要满足64或者128位只有下面几种情况
需要额外注意的是另外一种写法,位操作指令,不在乎寄存器形状shape
1 | # 128位and |
是同一个意思,但是不支持and v3.8h, v3.8h, v7.8h
1 | DUP //Duplicate general-purpose register to vector.or Duplicate vector element to vector or scalar. |
calculate
1 | add |
Address
1 | ADRP // Form PC-relative address to 4KB page. |
Branch
1 | b.cond // branch condition eg. b.ne |
Load/Store
1 | ldrb // b是byte的意思 |
Control/conditional
1 | ccmp // comdition compare |
Logic&Move
1 | ASRV //Arithmetic Shift Right Variable |
Modifier
1 | uxtb // zero extend byte 无符号(Unsigned)扩展一个字节(Byte)到 32位 |
system
1 | dmb //data memory barrier |
ARM no push/pop
1 | PUSH {r3} |
are aliases for
1 | str r3, [sp, #-4]! |
需要进一步的研究学习
暂无
遇到的问题
暂无