提取ARMv8的指令编码

2012年11月份的资料,之前ARMv8手册还没发布,我想办法从编译器的binutils中提取出了所有ARMv8指令的二进制编码,之前不能随便发,现在相当于解禁了^_^。

问题1:提取ARMv8的指令编码

答:ARMv8指令的opcode可以在支持ARMv8的编译器binutils中找到,该工具能在网上找到,见参考资料[1],或者在[1]中搜索aarch64_opcode_table。

为了说明指令编码细节,现将网页中部分内容摘录如下:

1208 struct aarch64_opcode aarch64_opcode_table[] =

1209 {

1210  /* Add/subtract (with carry).  */

1211
  {"adc", 0x1a000000, 0x7fe0fc00, addsub_carry, 0, CORE, OP3 (Rd, Rn, Rm), QL_I3SAMER, F_SF},

1212  {"adcs", 0x3a000000, 0x7fe0fc00, addsub_carry, 0, CORE, OP3 (Rd, Rn, Rm), QL_I3SAMER, F_SF},

以上结构体中的每一项对应某条指令的操作码等信息,其中aarch64_opcode结构体(见参考文献[2])在,内容摘录如下:

structaarch64_opcode

{

/*The name of the mnemonic.  */

const char *name;

/*The opcode itself.  Those bits which willbe filled in with operands are zeroes. */

aarch64_insn opcode;

/*The opcode mask.  This is used by thedisassembler.  This is a mask containingones indicating those bits which must match the opcode field, and zeroesindicating those bits which need not match (and are presumably filled in byoperands).  */

aarch64_insn mask;

/*Instruction class. */

enum aarch64_insn_class iclass;

/*Enumerator identifier.  */

enum aarch64_op op;

/*Which architecture variant provides this instruction.  */

const aarch64_feature_set *avariant;

/*An array of operand codes.  Each code isan index into the operand table.  Theyappear in the order which the operands must appear in assembly code, and are terminatedby a zero.  */

enum aarch64_opnd operands[AARCH64_MAX_OPND_NUM];

/*A list of operand qualifier code sequence. Each operand qualifier code qualifies the corresponding operandcode.  Each operand qualifier sequencespecifies a valid opcode variant and related constraint on operands.  */

aarch64_opnd_qualifier_seq_t qualifiers_list[AARCH64_MAX_QLF_SEQ_NUM];

/*Flags providing information about this instruction */

uint32_t flags;

}

按照以上信息解释aarch64_opcode_table中的结构体如下表:


"adc",


0x1a000000


0x7fe0fc00


 addsub_carry,


 0


CORE


OP3 (Rd, Rn, Rm)


QL_I3SAMER, 


F_SF


助记符


操作码


操作码掩码


指令所属类


枚举器标识符


提供这种指令的结构体变量


操作数编码数组


操作数限定符的代码序列列表


指令信息标志位

1:Aarch64-opc.c中有关于指令位域的定义。

const aarch64_field fields[] =

{

{  0,  0 },      /*NIL.  */

{  0,  4 },      /*cond2: condition in truly conditional-executed inst.  */

{  0,  4 },      /*nzcv: flag bit specifier, encoded in the "nzcv" field.  */

{  5,  5 },      /*defgh: d:e:f:g:h bits in AdvSIMD modified immediate.  */

{16,  3 },       /*abc: a:b:c bits in AdvSIMD modified immediate. */

{  5, 19 },       /* imm19: e.g. in CBZ. */

{  5, 19 },       /* immhi: e.g. in ADRP. */

{29,  2 },       /*immlo: e.g. in ADRP.  */

{22,  2 },       /*size: in most AdvSIMD and floating-point instructions.  */

{10,  2 },       /*vldst_size: size field in the AdvSIMD load/store inst.  */

{29,  1 },       /*op: in AdvSIMD modified immediate instructions. */

{30,  1 },       /*Q: in most AdvSIMD instructions.  */

{  0,  5 },      /*Rt: in load/store instructions.  */

{  0,  5 },      /*Rd: in many integer instructions.  */

{  5,  5 },      /*Rn: in many integer instructions.  */

{10,  5 },       /*Rt2: in load/store pair instructions.  */

{10,  5 },       /*Ra: in fp instructions.  */

{  5,  3 },      /*op2: in the system instructions.  */

{  8,  4 },      /*CRm: in the system instructions.  */

{12,  4 },       /*CRn: in the system instructions.  */

{16,  3 },       /*op1: in the system instructions.  */

{19,  2 },       /*op0: in the system instructions.  */

{10,  3 },       /*imm3: in add/sub extended reg instructions. */

{12,  4 },       /*cond: condition flags as a source operand. */

{12,  4 },       /*opcode: in advsimd load/store instructions. */

{12,  4 },       /*cmode: in advsimd modified immediate instructions.  */

{13,  3 },       /*asisdlso_opcode: opcode in advsimd ld/st single element.  */

{13,  2 },       /*len: in advsimd tbl/tbx instructions.  */

{16,  5 },       /*Rm: in ld/st reg offset and some integer inst. */

{16,  5 },       /*Rs: in load/store exclusive instructions. */

{13,  3 },       /*option: in ld/st reg offset + add/sub extended reg inst.  */

{12,  1 },       /*S: in load/store reg offset instructions. */

{21,  2 },       /*hw: in move wide constant instructions. */

{22,  2 },       /*opc: in load/store reg offset instructions. */

{23,  1 },       /*opc1: in load/store reg offset instructions. */

{22,  2 },       /*shift: in add/sub reg/imm shifted instructions. */

{22,  2 },       /*type: floating point type field in fp data inst.  */

{30,  2 },       /*ldst_size: size field in ld/st reg offset inst. */

{10,  6 },       /*imm6: in add/sub reg shifted instructions. */

{11,  4 },       /*imm4: in advsimd ext and advsimd ins instructions.  */

{16,  5 },       /*imm5: in conditional compare (immediate) instructions.  */

{15,  7 },       /*imm7: in load/store pair pre/post index instructions.  */

{13,  8 },       /*imm8: in floating-point scalar move immediate inst.  */

{12,  9 },       /*imm9: in load/store pre/post index instructions.  */

{10, 12 },         /* imm12: in ld/stunsigned imm or add/sub shifted inst.  */

{  5, 14 },       /* imm14: in test bit and branch instructions.  */

{  5, 16 },       /* imm16: in exception instructions.  */

{  0, 26 },       /* imm26: in unconditional branch instructions.  */

{ 10, 6 },       /* imms: in bitfield andlogical immediate instructions.  */

{16,  6 },       /*immr: in bitfield and logical immediate instructions.  */

{16,  3 },       /*immb: in advsimd shift by immediate instructions.  */

{19,  4 },       /*immh: in advsimd shift by immediate instructions.  */

{22,  1 },       /*N: in logical (immediate) instructions. */

{11,  1 },       /*index: in ld/st inst deciding the pre/post-index.  */

{24,  1 },       /*index2: in ld/st pair inst deciding the pre/post-index.  */

{31,  1 },       /*sf: in integer data processing instructions. */

{11,  1 },       /*H: in advsimd scalar x indexed element instructions.  */

{21,  1 },       /*L: in advsimd scalar x indexed element instructions.  */

{20,  1 },       /*M: in advsimd scalar x indexed element instructions.  */

{31,  1 },       /*b5: in the test bit and branch instructions. */

{19,  5 },       /*b40: in the test bit and branch instructions. */

{10,  6 },       /*scale: in the fixed-point scalar to fp converting inst.  */

};

2、函数aarch64_opcode_encode用于将操作数插入opcode中

参考资料

[1] ARMv8的编译器binutils,结构体aarch64_opcode_table定义见line 1208

http://kernel.ubuntu.com/git?p=jk/arm64/binutils.git;a=blob;f=opcodes/aarch64-tbl.h;h=d360b1406718257da86050f5b3a760cd02196250;hb=aarch64

[2] 结构体aarch64_opcode定义,line451

http://kernel.ubuntu.com/git?p=jk/arm64/binutils.git;a=blob;f=include/opcode/aarch64.h;h=98529954ea098349eb16572d4915f4edbd2e7b5d;hb=aarch64

[3] 《ARMv8 InstructionSet Overview 》page11

提取ARMv8的指令编码

时间: 2024-11-08 19:09:08

提取ARMv8的指令编码的相关文章

从编译器源代码中提取ARMv8的指令编码

2012年11月份的资料,之前ARMv8手冊还没公布,我想办法从编译器的binutils中提取出了全部ARMv8指令的二进制编码,之前不能随便发,如今相当于解禁了^_^. 问题1:提取ARMv8的指令编码 答:ARMv8指令的opcode能够在支持ARMv8的编译器binutils中找到,该工具能在网上找到,见參考资料[1],或者在[1]中搜索aarch64_opcode_table. 为了说明指令编码细节.现将网页中部分内容摘录例如以下: 1208 struct aarch64_opcode 

ARMv8 Linux内核源码分析:__flush_dcache_all()

1.1 /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY(__flush_dcache_all) //保证之前的访存指令的顺序 dsb sy //读cache level id register mrs x0, clidr_el1           // read clidr //取bits[26:24](Level of Coherency f

ARMv8 架构与指令集.学习笔记

目 录 第1章 ARMv8简介. 3 1.1基础认识. 3 1.2 相关专业名词解释. 3 第2章 Execution State 4 2.1 提供两种Execution State 4 2.2 决定Execution State的条件. 4 第3章 Exception Level 5 3.1 Exception Level 与Security 5 3.1.1 EL3使用AArch64.AArch32的对比. 5 3.2 ELx 和 Execution State 组合. 6 3.3路由控制. 

手机上也可以用的快手和火山小视频提取工具

之前分享过一个火山无水印视频提取软件,但是需要安装到电脑上,很多人觉得很麻烦. 今天分享个网页版,无需安装,并且电脑和手机都可以用的视频提取工具,支持提取快手和火山小视频里的任何视频,就连火山小视频里那种<作者不允许他人下载>的视频都可以解析,并且解析出来的视频都是没有水印的.(是不是觉得这工具特别赞,觉得赞的话,给我的文章点个赞吧??) 工具地址: 快手视频解析下载:http://kuaishou.iiilab.com/ 火山小视频解析下载:http://huoshan.iiilab.com

linux提取指定列字符并打印所有内容(awk)

假设有文件长如下样子: CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  samplename 1 3552841 . G . 32.995 . DP=1;MQ0F=0;AF1=0;AC1=0;DP4=1,0,0,0;MQ=40;FQ=-29.9912 GT:PL:DP 0/0:0:1 1 3552842 . T . 32.995 . DP=1;MQ0F=0;AF1=0;AC1=0;DP4=1,0,0,0

ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(4)- 其它

1. 前言 2.可配置的指令使能/禁用控制和trap控制 指令使能/禁用 当指令被禁用,则这条指令就会变成未定义 指令Trap控制 控制某条或某些指令在运行时进入陷阱,进入陷阱的指令会产生trap异常,路由规则如下: (1)当前为EL1,则陷阱异常传递给EL1(HCR_EL2.TGE定义为1时,会路由到EL2); (2)当前为EL2,则陷阱异常传递给EL2; (3)当前为EL3,则陷阱异常传递给EL3; 3. 系统调用 SVC 默认情况下SVC产生supervisor call,同步异常目标级别

基于单分类器的高分辨率遥感影像道路提取

本人硕士阶段做了很久的高分辨率遥感影像道路提取,颇有心得,在此,本人将最新的研究成果进行开源... 大家都知道,传统的基于机器学习的分类方法通常需要正负样本的同时参与,才能得到目标类,但是负样本的勾选,通常很困难,也非常难获得,根据文献- <Elkan, Charles, and Keith Noto. "Learning classifiers from only positive and unlabeled data." Proceedings of the 14th ACM

提取代码中的部分代码字段

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

【图像处理】提取图片中的交点数据

1. 前言 前两天老板突然给了一幅图像数据, 让我提取出其中的交点信息, 图片是这样的: 由于图像数据实在太大,就传了一张截图上来~~ 2. 处理思路 2.1 基本需求 我们的需求实际上就是, 提取图像中黑色线段相交的部分(简单来说就是相交的点) 2.2 基本思路 检测图像中的黑色直线部分, 根据hough变换提取出相应的直线方程, 根据直线方程求出他们的交点, 即为我们所需要的点.由于处理的时候, 存在一定误差, 所以一般可以分为两个步骤, 先粗略的寻找一个交点, 然后对他的周围进行搜素即可.