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

发布者:心灵律动最新更新时间:2020-01-20 来源: eefocus关键字:编译器  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中的结构体如下表:

image.png

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  指令编码 引用地址:从编译器源码中提取ARMv8的指令编码

上一篇:ARMv8 Linux内核异常处理过程分析
下一篇:关于ARMv8指令的几个问题

推荐阅读最新更新时间:2024-10-24 01:20

编译器源码中提取ARMv8指令编码
问题1:提取ARMv8的指令编码 答:ARMv8指令的opcode可以在支持ARMv8的编译器binutils中找到,该工具能在网上找到,见参考资料 ,或者在 中搜索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_I3
[单片机]
从<font color='red'>编译器</font>源码中提取<font color='red'>ARMv8</font>的<font color='red'>指令</font><font color='red'>编码</font>
关于ARMv8指令的几个问题
NOTE:以下内容只针对ARMv8。 问题一:ARMv8 branch指令格式及用法(《ARMv8ISA overview》中 page 25有相关叙述): 1、无条件分支+立即数:直接跳转到某地址,不能跳转到寄存器 指令有两个:”b label” ”bl label”。在编译过程,编译器会将label翻译成立即数。 举例:编写汇编代码如下 main: label: nop b label ret 编译并且反汇编后: 0000000000400510 main : label(): 400510: d503201f nop 400514: 1
[单片机]
ARMv8中branch指令分类、格式及用法
ARMv8虽然还没有出商用芯片,但是ARM内部已经有成型的模拟器了,其中ARMv8的Fast Models已经内测,虽然还没上市。目前已有ARMv8的Foundation Model可以用来测试ARMv8的应用程序。 一:ARMv8 Branch指令分类: 1、 无条件分支+立即数:直接跳转到某地址,不能跳转到寄存器 指令有两个:”b label” ”bl label”。在编译过程,编译器会将label翻译成立即数。 举例:编写汇编代码如下 main: label: nop b label ret 编译并且反汇编后: 0000000000400510 main : lab
[单片机]
ARMv8指令学习(1)
1. TBNZ / TBZ / CBZ / CBNZ (1) TBNZ x0, #uimm6, label Test and branch Not zero. 如果x0 != 0 , then jump to label位置处执行. (2) TBZ x0, #uimm6, label Test and branch Zero. 如果x0 == 0 , then jump to label位置处执行. (3) CBZ x0, label Compare and Branch Zero 如果x0 == 0 , then jump to l
[单片机]
ARMv8指令学习(2)
1. UXTB ---- Unsigned extend byte UXTB Wd , Wn 等同于 UBFM Wd , Wn ,#0,#7 即:Wd = ZeroExtend(Wn 7:0 ) 从Wn中取出一个byte,赋给Wd,并把Wd的高3 bytes,用0填充。 2. UXTH ---- Unsigned extend halfword UXTB Wd , Wn 等同于 UBFM Wd , Wn ,#0,#15 即:Wd = ZeroExtend(Wn 15:0 ) 从Wn中取出2个byte,赋给Wd,并把Wd的高2 bytes,用0填充。 3. Bitfield m
[单片机]
基于MSP430f5529 编码电机测速 接收脉冲数 PWM调速 CCS编译器 代码分析
前言:2022年TI杯大学生电子设计竞赛,小车跟随行驶系统(C题)要求:设计一套小车跟随行驶系统,采用TI的MCU,由一辆领头小车和一辆跟随小车组成,要求小车具有循迹功能,且速度在0.3~1m/s可调......本文着重介绍速度在0.3~1m/s可调的一种实现方式。 正文: 一、首先了解编码电机测速的原理(移步下方链接,不过多赘述) 霍尔增量式编码器左右车轮线速度的计算_许你一世阳光yyds的博客-CSDN博客 二、获取关键参数,及oled使用 由此我们得知,我们需要获取的关键数据为编码电机 轮子转动一个脉冲走过的距离(m/脉) 这个参数可以是 1. 从你所购买电机的店铺获得;2. 自己做实验测出来。下面我们从
[单片机]
浅谈SIMATICS7-1500解码指令编码指令
电工知识—SIMATICS7-1500 解码、编码指令 字逻辑运算指令 字的逻辑运算指令包括:与运算(AND)、或运算(OR)、异或运算(XOR)、求反码(INVERT)、解码(DECO)、编码(ENCO)、选择(SEL)、多路复用(MUX)和多路分用(DEMUX)等。 字逻辑指令就是对16字或者32双字等逐位进行逻辑运算,一个操作数在累加器1,另一个操作数在累加器2,指令中也允许有立即数(常数)的形式输出。 (2)解码指令(DECO) “解码”指令读取输入IN的值,并将输出值中位号与读取值对应的那个位置位。输出值中的其他位以零填充。解码指令(DECO)和参数见下图1。 图1 注意:可以从指令框的“>”下拉列表中选择该指令的数
[嵌入式]
浅谈SIMATICS7-1500解码<font color='red'>指令</font>和<font color='red'>编码</font><font color='red'>指令</font>
ARM Cortex-M 分支指令编码
B cond . qualifier lable -- Branch causes a branch to a target address if ConditionPassed(cond) then { EncodingSpecificOperations(PC, lable); BranchWritePC(PC + imm32); } // All versions of the Thumb instruction set T1 : B cond lable : not allowed in IT block T2 : B cond lable : outside or last in IT block // Al
[单片机]
ARM Cortex-M 分支<font color='red'>指令</font><font color='red'>编码</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved