精华内容
下载资源
问答
  • 条件码助记符
    千次阅读
    2020-08-19 10:11:50

    ARM指令介绍(助记符+条件码)

    ARM微处理器的指令的分类与格式
    ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果
    都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。
    ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、
    加载/存储指令、协处理器指令和异常产生指令六大类。

    助记符 指令功能描述

    ADC 带进位的加法指令
    ADD 加法指令
    AND 逻辑与指令
    B 跳转指令
    BIC 位清零指令
    BL 带返回的跳转指令
    BLX 带返回和状态切换的跳转指令
    BX 带状态切换的跳转指令

    CDP 协处理器数据操作指令
    CMN 比较反值指令
    CMP 比较指令
    EOR 异或指令
    LDC 存储器到协处理器的数据传输指令
    LDM 加载多个寄存器指令
    LDR 存储器到寄存器的数据传输指令
    MCR 从ARM寄存器到协处理器寄存器的数据传输指令
    MLA 乘加运算指令
    MOV 数据传送指令
    MRC 从协处理器寄存器到ARM寄存器的数据传输指令
    MRS 传送CPSR或SPSR的内容到通用寄存器指令
    MSR 传送通用寄存器到CPSR或SPSR的指令
    MUL 32位乘法指令
    MLA 32位乘加指令

    MVN 数据取反传送指令
    ORR 逻辑或指令
    RSB 逆向减法指令
    RSC 带借位的逆向减法指令
    SBC 带借位减法指令
    STC 协处理器寄存器写入存储器指令
    STM 批量内存字写入指令
    STR 寄存器到存储器的数据传输指令
    SUB 减法指令
    SWI 软件中断指令
    SWP 交换指令
    TEQ 相等测试指令
    TST 位测试指令

    指令的条件码
    当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有
    条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。
    每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码
    可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B
    可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。
    在16种条件标志码中,只有15种可以使用

    		**指令的条件码**
    

    条件码 助记符后缀 标 志 含 义
    0000 EQ Z置位 相等
    0001 NE Z清零 不相等
    0010 CS C置位 无符号数大于或等于
    0011 CC C清零 无符号数小于
    0100 MI N置位 负数
    0101 PL N清零 正数或零
    0110 VS V置位 溢出
    0111 VC V清零 未溢出
    1000 HI C置位Z清零 无符号数大于
    1001 LS C清零Z置位 无符号数小于或等于
    1010 GE N等于V 带符号数大于或等于
    1011 LT N不等于V 带符号数小于
    1100 GT Z清零且(N等于V) 带符号数大于
    1101 LE Z置位或(N不等于V) 带符号数小于或等于
    1110 AL 忽略 无条件执行

    原文章:http://blog.sina.com.cn/s/blog_62714d6a0100qmnw.html

    更多相关内容
  • 条件码助记符

    千次阅读 2007-08-14 15:22:00
    EQ(等于,Equal) ==NE(不等于,Not Equal) !=CS(高于或同于,进

    EQ(等于,Equal)                                                                                    ==
    NE(不等于,Not Equal)                                                                         !=
    CS(高于或同于,进位设置,Carry Set)                                                >=
    CC(低于,进位清除,Carry Clear)                                                         <

    MI(负号,MInus)                                                                                    < 0
    PL(正号,PLus)                                                                                    >=0
    VS(溢出设置,oVerflow Set)
    VC(溢出清除,oVerflow Clear)

    HI(高于,HIgher)                                                                                    >
    LS(低于或同于,Lower or Same)                                                      <=
    GE(大于等于,Greater or equal)                                                        >=
    LT(小于,Less Than)                                                                           <
    GT(大于,Greater Than)                                                                      >
    LE(小于等于,Less or equal)                                                            <=
    AL(总是,Always)                                                                                永真
    NV(从不,Never )                                                                                永假

     

    展开全文
  • Java 虚拟机的指令由以下格式的字节指令构成:操作(Opcode 1 字节)[操作数(Oprand)],具有以下两个特点: 由于 Java 虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个...

    Java 虚拟机的指令由以下格式的字节码指令构成:操作码(Opcode 1 字节)[操作数(Oprand)],具有以下两个特点:

    • 由于 Java 虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作码。
    • class 文件中放弃了对操作数的长度做对齐,节约了填充和间隔符号需要的空间,但是为了在运行时从字节中重建出具体数据的结构,损失了一些执行效率。

    下面对所有指令做个总结(在查找时直接ctrl+F找相应命令):

    • 变量到操作数栈:iload,iload_,lload,lload_,fload,fload_,dload,dload_,aload,aload_

    • 操作数栈到变量:istore,istore_,lstore,lstore_,fstore,fstore_,dstore,dstor_,astore,astore_

    • 常数到操作数栈:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_,lconst_,fconst_,dconst_

    • 加:iadd,ladd,fadd,dadd

    • 减:isub,lsub,fsub,dsub

    • 乘:imul,lmul,fmul,dmul

    • 除:idiv,ldiv,fdiv,ddiv

    • 余数:irem,lrem,frem,drem

    • 取负:ineg,lneg,fneg,dneg

    • 移位:ishl,lshr,iushr,lshl,lshr,lushr

    • 按位或:ior,lor

    • 按位与:iand,land

    • 按位异或:ixor,lxor

    • 类型转换:

      • i2l,i2f,i2d,l2f,l2d,f2d(放宽数值转换)
      • i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(缩窄数值转换)
    • 创建类实便:new

    • 创建新数组:newarray,anewarray,multianwarray

    • 访问类的域和类实例域:getfield,putfield,getstatic,putstatic

    • 把数据装载到操作数栈:baload,caload,saload,iaload,laload,faload,daload,aaload

    • 从操作数栈存存储到数组:bastore,castore,sastore,iastore,lastore,fastore,dastore,aastore

    • 获取数组长度:arraylength

    • 检相类实例或数组属性:instanceof,checkcast

    • 操作数栈管理:pop,pop2,dup,dup2,dup_xl,dup2_xl,dup_x2,dup2_x2,swap

    • 有条件转移:

      • ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpene,

      • if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne,lcmp,fcmpl

      • fcmpg,dcmpl,dcmpg

    • 复合条件转移:tableswitch,lookupswitch

    • 无条件转移:goto,goto_w,jsr,jsr_w,ret

    • 调度对象的实便方法:invokevirtual

    • 调用由接口实现的方法:invokeinterface

    • 调用需要特殊处理的实例方法:invokespecial

    • 调用命名类中的静态方法:invokestatic

    • 方法返回:ireturn,lreturn,freturn,dreturn,areturn,return

    • 异常:athrow

    • finally关键字的实现使用:jsr,jsr_w,ret


    1.栈和局部变量操作

    1.1 将常量压入栈的指令

    aconst_null 将null对象引用压入栈

    iconst_m1 将int类型常量-1压入栈

    iconst_0 将int类型常量0压入栈

    iconst_1 将int类型常量1压入栈

    iconst_2 将int类型常量2压入栈

    iconst_3 将int类型常量3压入栈

    iconst_4 将int类型常量4压入栈

    iconst_5 将int类型常量5压入栈

    lconst_0 将long类型常量0压入栈

    lconst_1 将long类型常量1压入栈

    fconst_0 将float类型常量0压入栈

    fconst_1 将float类型常量1压入栈

    dconst_0 将double类型常量0压入栈

    dconst_1 将double类型常量1压入栈

    bipush 将一个8位带符号整数压入栈

    sipush 将16位带符号整数压入栈

    ldc 把常量池中的项压入栈

    ldc_w 把常量池中的项压入栈(使用宽索引)

    ldc2_w 把常量池中long类型或者double类型的项压入栈(使用宽索引)

    1.2 从栈中的局部变量中装载值的指令

    iload 从局部变量中装载int类型值

    lload 从局部变量中装载long类型值

    fload 从局部变量中装载float类型值

    dload 从局部变量中装载double类型值

    aload 从局部变量中装载引用类型值(refernce)

    iload_0 从局部变量0中装载int类型值

    iload_1 从局部变量1中装载int类型值

    iload_2 从局部变量2中装载int类型值

    iload_3 从局部变量3中装载int类型值

    lload_0 从局部变量0中装载long类型值

    lload_1 从局部变量1中装载long类型值

    lload_2 从局部变量2中装载long类型值

    lload_3 从局部变量3中装载long类型值

    fload_0 从局部变量0中装载float类型值

    fload_1 从局部变量1中装载float类型值

    fload_2 从局部变量2中装载float类型值

    fload_3 从局部变量3中装载float类型值

    dload_0 从局部变量0中装载double类型值

    dload_1 从局部变量1中装载double类型值

    dload_2 从局部变量2中装载double类型值

    dload_3 从局部变量3中装载double类型值

    aload_0 从局部变量0中装载引用类型值

    aload_1 从局部变量1中装载引用类型值

    aload_2 从局部变量2中装载引用类型值

    aload_3 从局部变量3中装载引用类型值

    iaload 从数组中装载int类型值

    laload 从数组中装载long类型值

    faload 从数组中装载float类型值

    daload 从数组中装载double类型值

    aaload 从数组中装载引用类型值

    baload 从数组中装载byte类型或boolean类型值

    caload 从数组中装载char类型值

    saload 从数组中装载short类型值

    将栈中的值存入局部变量的指令

    istore 将int类型值存入局部变量

    lstore 将long类型值存入局部变量

    fstore 将float类型值存入局部变量

    dstore 将double类型值存入局部变量

    astore 将将引用类型或returnAddress类型值存入局部变量

    istore_0 将int类型值存入局部变量0

    istore_1 将int类型值存入局部变量1

    istore_2 将int类型值存入局部变量2

    istore_3 将int类型值存入局部变量3

    lstore_0 将long类型值存入局部变量0

    lstore_1 将long类型值存入局部变量1

    lstore_2 将long类型值存入局部变量2

    lstore_3 将long类型值存入局部变量3

    fstore_0 将float类型值存入局部变量0

    fstore_1 将float类型值存入局部变量1

    fstore_2 将float类型值存入局部变量2

    fstore_3 将float类型值存入局部变量3

    dstore_0 将double类型值存入局部变量0

    dstore_1 将double类型值存入局部变量1

    dstore_2 将double类型值存入局部变量2

    dstore_3 将double类型值存入局部变量3

    astore_0 将引用类型或returnAddress类型值存入局部变量0

    astore_1 将引用类型或returnAddress类型值存入局部变量1

    astore_2 将引用类型或returnAddress类型值存入局部变量2

    astore_3 将引用类型或returnAddress类型值存入局部变量3

    iastore 将int类型值存入数组中

    lastore 将long类型值存入数组中

    fastore 将float类型值存入数组中

    dastore 将double类型值存入数组中

    aastore 将引用类型值存入数组中

    bastore 将byte类型或者boolean类型值存入数组中

    castore 将char类型值存入数组中

    sastore 将short类型值存入数组中

    wide指令

    wide 使用附加字节扩展局部变量索引

    1.3 通用(无类型)栈操作

    nop 不做任何操作

    pop 弹出栈顶端一个字长的内容

    pop2 弹出栈顶端两个字长的内容

    dup 复制栈顶部一个字长内容

    dup_x1 复制栈顶部一个字长的内容,然后将复制内容及原来弹出的两个字长的内容压入栈

    dup_x2 复制栈顶部一个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈

    dup2 复制栈顶部两个字长内容

    dup2_x1 复制栈顶部两个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈

    dup2_x2 复制栈顶部两个字长的内容,然后将复制内容及原来弹出的四个字长的内容压入栈

    swap 交换栈顶部两个字长内容

    1.4 类型转换

    i2l 把int类型的数据转化为long类型

    i2f 把int类型的数据转化为float类型

    i2d 把int类型的数据转化为double类型

    l2i 把long类型的数据转化为int类型

    l2f 把long类型的数据转化为float类型

    l2d 把long类型的数据转化为double类型

    f2i 把float类型的数据转化为int类型

    f2l 把float类型的数据转化为long类型

    f2d 把float类型的数据转化为double类型

    d2i 把double类型的数据转化为int类型

    d2l 把double类型的数据转化为long类型

    d2f 把double类型的数据转化为float类型

    i2b 把int类型的数据转化为byte类型

    i2c 把int类型的数据转化为char类型

    i2s 把int类型的数据转化为short类型

    1.5 整数运算

    iadd 执行int类型的加法

    ladd 执行long类型的加法

    isub 执行int类型的减法

    lsub 执行long类型的减法

    imul 执行int类型的乘法

    lmul 执行long类型的乘法

    idiv 执行int类型的除法

    ldiv 执行long类型的除法

    irem 计算int类型除法的余数

    lrem 计算long类型除法的余数

    ineg 对一个int类型值进行取反操作

    lneg 对一个long类型值进行取反操作

    iinc 把一个常量值加到一个int类型的局部变量上

    1.6 逻辑运算

    移位操作

    ishl 执行int类型的向左移位操作

    lshl 执行long类型的向左移位操作

    ishr 执行int类型的向右移位操作

    lshr 执行long类型的向右移位操作

    iushr 执行int类型的向右逻辑移位操作

    lushr 执行long类型的向右逻辑移位操作

    按位布尔运算

    iand 对int类型值进行“逻辑与”操作

    land 对long类型值进行“逻辑与”操作

    ior 对int类型值进行“逻辑或”操作

    lor 对long类型值进行“逻辑或”操作

    ixor 对int类型值进行“逻辑异或”操作

    lxor 对long类型值进行“逻辑异或”操作

    1.7 浮点运算

    fadd 执行float类型的加法

    dadd 执行double类型的加法

    fsub 执行float类型的减法

    dsub 执行double类型的减法

    fmul 执行float类型的乘法

    dmul 执行double类型的乘法

    fdiv 执行float类型的除法

    ddiv 执行double类型的除法

    frem 计算float类型除法的余数

    drem 计算double类型除法的余数

    fneg 将一个float类型的数值取反

    dneg 将一个double类型的数值取反

    2.对象和数组

    2.1 对象操作指令

    new 创建一个新对象

    checkcast 确定对象为所给定的类型

    getfield 从对象中获取字段

    putfield 设置对象中字段的值

    getstatic 从类中获取静态字段

    putstatic 设置类中静态字段的值

    instanceof 判断对象是否为给定的类型

    2.2 数组操作指令

    newarray 分配数据成员类型为基本上数据类型的新数组

    anewarray 分配数据成员类型为引用类型的新数组

    arraylength 获取数组长度

    multianewarray 分配新的多维数组

    3.控制流

    3.1 条件分支指令

    ifeq 如果等于0,则跳转

    ifne 如果不等于0,则跳转

    iflt 如果小于0,则跳转

    ifge 如果大于等于0,则跳转

    ifgt 如果大于0,则跳转

    ifle 如果小于等于0,则跳转

    if_icmpcq 如果两个int值相等,则跳转

    if_icmpne 如果两个int类型值不相等,则跳转

    if_icmplt 如果一个int类型值小于另外一个int类型值,则跳转

    if_icmpge 如果一个int类型值大于或者等于另外一个int类型值,则跳转

    if_icmpgt 如果一个int类型值大于另外一个int类型值,则跳转

    if_icmple 如果一个int类型值小于或者等于另外一个int类型值,则跳转

    ifnull 如果等于null,则跳转

    ifnonnull 如果不等于null,则跳转

    if_acmpeq 如果两个对象引用相等,则跳转

    if_acmpnc 如果两个对象引用不相等,则跳转

    3.2 比较指令

    lcmp 比较long类型值

    fcmpl 比较float类型值(当遇到NaN时,返回-1)

    fcmpg 比较float类型值(当遇到NaN时,返回1)

    dcmpl 比较double类型值(当遇到NaN时,返回-1)

    dcmpg 比较double类型值(当遇到NaN时,返回1)

    3.3 无条件转移指令

    goto 无条件跳转

    goto_w 无条件跳转(宽索引)

    3.4 表跳转指令

    tableswitch 通过索引访问跳转表,并跳转

    lookupswitch 通过键值匹配访问跳转表,并执行跳转操作

    3.5 异常

    athrow 抛出异常或错误

    finally子句

    jsr 跳转到子例程

    jsr_w 跳转到子例程(宽索引)

    rct 从子例程返回

    4.方法调用与返回

    4.1 方法调用指令

    invokcvirtual 运行时按照对象的类来调用实例方法

    invokespecial 根据编译时类型来调用实例方法

    invokestatic 调用类(静态)方法

    invokcinterface 调用接口方法

    4.2 方法返回指令

    ireturn 从方法中返回int类型的数据

    lreturn 从方法中返回long类型的数据

    freturn 从方法中返回float类型的数据

    dreturn 从方法中返回double类型的数据

    areturn 从方法中返回引用类型的数据

    return 从方法中返回,返回值为void

    5.线程同步

    montiorenter 进入并获取对象监视器

    monitorexit 释放并退出对象监视器

    展开全文
  • Java二进制指令代码解析 小注:去年在看《深入解析JVM》书的时候做的一些...Java源码在运行之前都要编译成为字节格式(如.class文件),然后由ClassLoader将字节载入运行。在字节文件中,指令代码只是其中的一部

    本文为转载记录原文地址:感谢博主分享
    Java二进制指令代码解析
    小注:去年在看《深入解析JVM》书的时候做的一些记录,同时参考了《Java虚拟机规范》。只是对指令的一些列举,加入了一些自己的理解。可以用来查询。
    Java二进制指令代码解析
    Java源码在运行之前都要编译成为字节码格式(如.class文件),然后由ClassLoader将字节码载入运行。在字节码文件中,指令代码只是其中的一部分,里面还记录了字节码文件的编译版本、常量池、访问权限、所有成员变量和成员方法等信息(详见Java字节码格式详解)。本文主要简单介绍不同Java指令的功能以及在代码中如何解析二进制指令。

    Java指令是基于栈的体系结构,大部分的指令默认的操作数在栈中。映像中ARM是基于寄存器的操作指令,而x86好像是混合寄存器和存储器的,发现基于栈的操作指令确实简单,学起来很快。不过不知道这种操作的效率怎么样,以我自己的推测应该是不太好的。对这方面不太了解,随便扯几句。

    Java总共有200多条指令,不过很多都是重复的。我的理解,网络是Java一个非常重要的特性,而且Java在设计之初就认为字节码是要在网络中传输的,为了减少网络传输流量,字节码就要尽量设计精简、紧凑。因而Java增加了很多重复指令,比如尽量减少操作数,因而我们会发现Java的很多指令都是没有操作数的;并且指令中的操作数基本上都是当无法将值放到栈中的数据,比如局部变量的索引号和常量池中的索引号。

    还有一点需要注意的是,在运行过程中,所有boolean、byte、char、short都是以int类型值存在,因而对这些类型的指令操作很少。然而好像sun实现的虚拟机中。这些类型的数组据说不是以int类型的形式保存的,这个很奇怪。我的理解,以字对齐方式的操作效率会比较高,因而做了这种转换,以空间换时间。

    Java指令集(按功能分类)

    网上找的没有指令码这列  自己把它加上 更方便查阅 

    指令从0x00-0xc9 没有0xba

    常量入栈指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x01

    aconst_null

     

    null值入栈。

    0x02

    iconst_m1

     

    -1(int)值入栈。

    0x03

    iconst_0

     

    0(int)值入栈。

    0x04

    iconst_1

     

    1(int)值入栈。

    0x05

    iconst_2

     

    2(int)值入栈。

    0x06

    iconst_3

     

    3(int)值入栈。

    0x07

    iconst_4

     

    4(int)值入栈。

    0x08

    iconst_5

     

    5(int)值入栈。

    0x09

    lconst_0

     

    0(long)值入栈。

    0x0a

    lconst_1

     

    1(long)值入栈。

    0x0b

    fconst_0

     

    0(float)值入栈。

    0x0c

    fconst_1

     

    1(float)值入栈。

    0x0d

    fconst_2

     

    2(float)值入栈。

    0x0e

    dconst_0

     

    0(double)值入栈。

    0x0f

    dconst_1

     

    1(double)值入栈。

    0x10

    bipush

    valuebyte

    valuebyte值带符号扩展成int值入栈。

    0x11

    sipush

    valuebyte1

    valuebyte2

    (valuebyte1 << 8) | valuebyte2 值带符号扩展成int值入栈。

    0x12

    ldc

    indexbyte1

    常量池中的常量值(int, float, string reference, object reference)入栈。

    0x13

    ldc_w

    indexbyte1

    indexbyte2

    常量池中常量(int, float, string reference, object reference)入栈。

    0x14

    ldc2_w

    indexbyte1

    indexbyte2

    常量池中常量(long, double)入栈。

     

    局部变量值转载到栈中指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x19

    (wide)aload

    indexbyte

    从局部变量indexbyte中装载引用类型值入栈。

    0x2a

    aload_0

     

    从局部变量0中装载引用类型值入栈。

    0x2b

    aload_1

     

    从局部变量1中装载引用类型值入栈。

    0x2c

    aload_2

     

    从局部变量2中装载引用类型值入栈。

    0x2d

    aload_3

     

    从局部变量3中装载引用类型值入栈。

    0x15

    (wide)iload

    indexbyte

    从局部变量indexbyte中装载int类型值入栈。

    0x1a

    iload_0

     

    从局部变量0中装载int类型值入栈。

    0x1b

    iload_1

     

    从局部变量1中装载int类型值入栈。

    0x1c

    iload_2

     

    从局部变量2中装载int类型值入栈。

    0x1d

    iload_3

     

    从局部变量3中装载int类型值入栈。

    0x16

    (wide)lload

    indexbyte

    从局部变量indexbyte中装载long类型值入栈。

    0x1e

    lload_0

     

    从局部变量0中装载int类型值入栈。

    0x1f

    lload_1

     

    从局部变量1中装载int类型值入栈。

    0x20

    lload_2

     

    从局部变量2中装载int类型值入栈。

    0x21

    lload_3

     

    从局部变量3中装载int类型值入栈。

    0x17

    (wide)fload

    indexbyte

    从局部变量indexbyte中装载float类型值入栈。

    0x22

    fload_0

     

    从局部变量0中装载float类型值入栈。

    0x23

    fload_1

     

    从局部变量1中装载float类型值入栈。

    0x24

    fload_2

     

    从局部变量2中装载float类型值入栈。

    0x25

    fload_3

     

    从局部变量3中装载float类型值入栈。

    0x18

    (wide)dload

    indexbyte

    从局部变量indexbyte中装载double类型值入栈。

    0x26

    dload_0

     

    从局部变量0中装载double类型值入栈。

    0x27

    dload_1

     

    从局部变量1中装载double类型值入栈。

    0x28

    dload_2

     

    从局部变量2中装载double类型值入栈。

    0x29

    dload_3

     

    从局部变量3中装载double类型值入栈。

    0x32

    aaload

     

    从引用类型数组中装载指定项的值。

    0x2e

    iaload

     

    从int类型数组中装载指定项的值。

    0x2f

    laload

     

    从long类型数组中装载指定项的值。

    0x30

    faload

     

    从float类型数组中装载指定项的值。

    0x31

    daload

     

    从double类型数组中装载指定项的值。

    0x33

    baload

     

    从boolean类型数组或byte类型数组中装载指定项的值(先转换为int类型值,后压栈)。

    0x34

    caload

     

    从char类型数组中装载指定项的值(先转换为int类型值,后压栈)。

    0x35

    saload

     

    从short类型数组中装载指定项的值(先转换为int类型值,后压栈)。

     

    将栈顶值保存到局部变量中指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x3a

    (wide)astore

    indexbyte

    将栈顶引用类型值保存到局部变量indexbyte中。

    0x4b

    astroe_0

     

    将栈顶引用类型值保存到局部变量0中。

    0x4c

    astore_1

     

    将栈顶引用类型值保存到局部变量1中。

    0x4d

    astore_2

     

    将栈顶引用类型值保存到局部变量2中。

    0x4e

    astore_3

     

    将栈顶引用类型值保存到局部变量3中。

    0x36

    (wide)istore

    indexbyte

    将栈顶int类型值保存到局部变量indexbyte中。

    0x3b

    istore_0

     

    将栈顶int类型值保存到局部变量0中。

    0x3c

    istore_1

     

    将栈顶int类型值保存到局部变量1中。

    0x3d

    istore_2

     

    将栈顶int类型值保存到局部变量2中。

    0x3e

    istore_3

     

    将栈顶int类型值保存到局部变量3中。

    0x37

    (wide)lstore

    indexbyte

    将栈顶long类型值保存到局部变量indexbyte中。

    0x3f

    lstore_0

     

    将栈顶long类型值保存到局部变量0中。

    0x40

    lstore_1

     

    将栈顶long类型值保存到局部变量1中。

    0x41

    lstore_2

     

    将栈顶long类型值保存到局部变量2中。

    0x42

    lstroe_3

     

    将栈顶long类型值保存到局部变量3中。

    0x38

    (wide)fstore

    indexbyte

    将栈顶float类型值保存到局部变量indexbyte中。

    0x43

    fstore_0

     

    将栈顶float类型值保存到局部变量0中。

    0x44

    fstore_1

     

    将栈顶float类型值保存到局部变量1中。

    0x45

    fstore_2

     

    将栈顶float类型值保存到局部变量2中。

    0x46

    fstore_3

     

    将栈顶float类型值保存到局部变量3中。

    0x39

    (wide)dstore

    indexbyte

    将栈顶double类型值保存到局部变量indexbyte中。

    0x47

    dstore_0

     

    将栈顶double类型值保存到局部变量0中。

    0x48

    dstore_1

     

    将栈顶double类型值保存到局部变量1中。

    0x49

    dstore_2

     

    将栈顶double类型值保存到局部变量2中。

    0x4a

    dstore_3

     

    将栈顶double类型值保存到局部变量3中。

    0x53

    aastore

     

    将栈顶引用类型值保存到指定引用类型数组的指定项。

    0x4f

    iastore

     

    将栈顶int类型值保存到指定int类型数组的指定项。

    0x50

    lastore

     

    将栈顶long类型值保存到指定long类型数组的指定项。

    0x51

    fastore

     

    将栈顶float类型值保存到指定float类型数组的指定项。

    0x52

    dastore

     

    将栈顶double类型值保存到指定double类型数组的指定项。

    0x54

    bastroe

     

    将栈顶boolean类型值或byte类型值保存到指定boolean类型数组或byte类型数组的指定项。

    0x55

    castore

     

    将栈顶char类型值保存到指定char类型数组的指定项。

    0x56

    sastore

     

    将栈顶short类型值保存到指定short类型数组的指定项。

     

    wide指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xc4

    wide

     

    使用附加字节扩展局部变量索引(iinc指令特殊)。

     

    通用(无类型)栈操作指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x00

    nop

     

    空操作。

    0x57

    pop

     

    从栈顶弹出一个字长的数据。

    0x58

    pop2

     

    从栈顶弹出两个字长的数据。

    0x59

    dup

     

    复制栈顶一个字长的数据,将复制后的数据压栈。

    0x5a

    dup_x1

     

    复制栈顶一个字长的数据,弹出栈顶两个字长数据,先将复制后的数据压栈,再将弹出的两个字长数据压栈。

    0x5b

    dup_x2

     

    复制栈顶一个字长的数据,弹出栈顶三个字长的数据,将复制后的数据压栈,再将弹出的三个字长的数据压栈。

    0x5c

    dup2

     

    复制栈顶两个字长的数据,将复制后的两个字长的数据压栈。

    0x5d

    dup2_x1

     

    复制栈顶两个字长的数据,弹出栈顶三个字长的数据,将复制后的两个字长的数据压栈,再将弹出的三个字长的数据压栈。

    0x5e

    dup2_x2

     

    复制栈顶两个字长的数据,弹出栈顶四个字长的数据,将复制后的两个字长的数据压栈,再将弹出的四个字长的数据压栈。

    0x5f

    swap

     

    交换栈顶两个字长的数据的位置。Java指令中没有提供以两个字长为单位的交换指令。

     

    类型转换指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x86

    i2f

     

    将栈顶int类型值转换为float类型值。

    0x85

    i2l

     

    将栈顶int类型值转换为long类型值。

    0x87

    i2d

     

    将栈顶int类型值转换为double类型值。

    0x8b

    f2i

     

    将栈顶float类型值转换为int类型值。

    0x8c

    f2l

     

    将栈顶float类型值转换为long类型值。

    0x8d

    f2d

     

    将栈顶float类型值转换为double类型值。

    0x88

    l2i

     

    将栈顶long类型值转换为int类型值。

    0x89

    l2f

     

    将栈顶long类型值转换为float类型值。

    0x8a

    l2d

     

    将栈顶long类型值转换double类型值。

    0x8e

    d2i

     

    将栈顶double类型值转换为int类型值。

    0x90

    d2f

     

    将栈顶double类型值转换为float类型值。

    0x8f

    d2l

     

    将栈顶double类型值转换为long类型值。

    0x91

    i2b

     

    将栈顶int类型值截断成byte类型,后带符号扩展成int类型值入栈。

    0x92

    i2c

     

    将栈顶int类型值截断成char类型值,后带符号扩展成int类型值入栈。

    0x93

    i2s

     

    将栈顶int类型值截断成short类型值,后带符号扩展成int类型值入栈。

     

    整数运算

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x60

    iadd

     

    将栈顶两int类型数相加,结果入栈。

    0x64

    isub

     

    将栈顶两int类型数相减,结果入栈。

    0x68

    imul

     

    将栈顶两int类型数相乘,结果入栈。

    0x6c

    idiv

     

    将栈顶两int类型数相除,结果入栈。

    0x70

    irem

     

    将栈顶两int类型数取模,结果入栈。

    0x74

    ineg

     

    将栈顶int类型值取负,结果入栈。

    0x61

    ladd

     

    将栈顶两long类型数相加,结果入栈。

    0x65

    lsub

     

    将栈顶两long类型数相减,结果入栈。

    0x69

    lmul

     

    将栈顶两long类型数相乘,结果入栈。

    0x6d

    ldiv

     

    将栈顶两long类型数相除,结果入栈。

    0x71

    lrem

     

    将栈顶两long类型数取模,结果入栈。

    0x75

    lneg

     

    将栈顶long类型值取负,结果入栈。

    0x84

    (wide)iinc

    indexbyte

    constbyte

    将整数值constbyte加到indexbyte指定的int类型的局部变量中。

     

    浮点运算

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x62

    fadd

     

    将栈顶两float类型数相加,结果入栈。

    0x66

    fsub

     

    将栈顶两float类型数相减,结果入栈。

    0x6a

    fmul

     

    将栈顶两float类型数相乘,结果入栈。

    0x6e

    fdiv

     

    将栈顶两float类型数相除,结果入栈。

    0x72

    frem

     

    将栈顶两float类型数取模,结果入栈。

    0x76

    fneg

     

    将栈顶float类型值取反,结果入栈。

    0x63

    dadd

     

    将栈顶两double类型数相加,结果入栈。

    0x67

    dsub

     

    将栈顶两double类型数相减,结果入栈。

    0x6b

    dmul

     

    将栈顶两double类型数相乘,结果入栈。

    0x6f

    ddiv

     

    将栈顶两double类型数相除,结果入栈。

    0x73

    drem

     

    将栈顶两double类型数取模,结果入栈。

    0x77

    dneg

     

    将栈顶double类型值取负,结果入栈。

     

    逻辑运算——移位运算

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x78

    ishl

     

    左移int类型值。

    0x79

    lshl

     

    左移long类型值。

    0x7a

    ishr

     

    算术右移int类型值。

    0x7b

    lshr

     

    算术右移long类型值。

    0x7c

    iushr

     

    逻辑右移int类型值。

    0x7d

    lushr

     

    逻辑右移long类型值。

     

    逻辑运算——按位布尔运算

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x73

    iand

     

    对int类型按位与运算。

    0x7f

    land

     

    对long类型的按位与运算。

    0x80

    ior

     

    对int类型的按位或运算。

    0x81

    lor

     

    对long类型的按位或运算。

    0x82

    ixor

     

    对int类型的按位异或运算。

    0x83

    lxor

     

    对long类型的按位异或运算。

     

    控制流指令——条件跳转指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x99

    ifeq

    branchbyte1

    branchbyte2

    若栈顶int类型值为0则跳转。

    0x9a

    ifne

    branchbyte1

    branchbyte2

    若栈顶int类型值不为0则跳转。

    0x9b

    iflt

    branchbyte1

    branchbyte2

    若栈顶int类型值小于0则跳转。

    0x9e

    ifle

    branchbyte1

    branchbyte2

    若栈顶int类型值小于等于0则跳转。

    0x9d

    ifgt

    branchbyte1

    branchbyte2

    若栈顶int类型值大于0则跳转。

    0x9c

    ifge

    branchbyte1

    branchbyte2

    若栈顶int类型值大于等于0则跳转。

    0x9f

    if_icmpeq

    branchbyte1

    branchbyte2

    若栈顶两int类型值相等则跳转。

    0xa0

    if_icmpne

    branchbyte1

    branchbyte2

    若栈顶两int类型值不相等则跳转。

    0xa1

    if_icmplt

    branchbyte1

    branchbyte2

    若栈顶两int类型值前小于后则跳转。

    0xa4

    if_icmple

    branchbyte1

    branchbyte2

    若栈顶两int类型值前小于等于后则跳转。

    0xa3

    if_icmpgt

    branchbyte1

    branchbyte2

    若栈顶两int类型值前大于后则跳转。

    0xa2

    if_icmpge

    branchbyte1

    branchbyte2

    若栈顶两int类型值前大于等于后则跳转。

    0xc6

    ifnull

    branchbyte1

    branchbyte2

    若栈顶引用值为null则跳转。

    0xc7

    ifnonnull

    branchbyte1

    branchbyte2

    若栈顶引用值不为null则跳转。

    0xa5

    if_acmpeq

    branchbyte1

    branchbyte2

    若栈顶两引用类型值相等则跳转。

    0xa6

    if_acmpne

    branchbyte1

    branchbyte2

    若栈顶两引用类型值不相等则跳转。

     

    控制流指令——比较指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x94

    lcmp

     

    比较栈顶两long类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈。

    0x95

    fcmpl

     

    比较栈顶两float类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

    0x96

    fcmpg

     

    比较栈顶两float类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

    0x97

    dcmpl

     

    比较栈顶两double类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

    0x98

    dcmpg

     

    比较栈顶两double类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

     

    控制流指令——无条件跳转指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xa7

    goto

    branchbyte1

    branchbyte2

    无条件跳转到指定位置。

    0xc8

    goto_w

    branchbyte1

    branchbyte2

    branchbyte3

    branchbyte4

    无条件跳转到指定位置(宽索引)。

     

    控制流指令——表跳转指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xaa

    tableswitch

    <0-3bytepad>

    defaultbyte1

    defaultbyte2

    defaultbyte3

    defaultbyte4

    lowbyte1

    lowbyte2

    lowbyte3

    lowbyte4

    highbyte1

    highbyte2

    highbyte3

    highbyte4

    jump offsets…

    通过索引访问跳转表,并跳转。

    0xab

    lookupswitch

    <0-3bytepad>

    defaultbyte1

    defaultbyte2

    defaultbyte3

    defaultbyte4

    npairs1

    npairs2

    npairs3

    npairs4

    match offsets

    通过键值访问跳转表,并跳转。

     

    控制流指令——异常和finally

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xbf

    athrow

     

    抛出异常。

    0xa8

    jsr

    branchbyte1

    branchbyte2

    跳转到子例程序。

    0xc9

    jsr_w

    branchbyte1

    branchbyte2

    branchbyte3

    branchbyte4

    跳转到子例程序(宽索引)。

    0xa9

    (wide)ret

    indexbyte

    返回子例程序。

     

    对象操作指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xbb

    new

    indexbyte1

    indexbyte2

    创建新的对象实例。

    0xc0

    checkcast

    indexbyte1

    indexbyte

    类型强转。

    0xc1

    instanceof

    indexbyte1

    indexbyte2

    判断类型。

    0xb4

    getfield

    indexbyte1

    indexbyte2

    获取对象字段的值。

    0xb5

    putfield

    indexbyte1

    indexbyte2

    给对象字段赋值。

    0xb2

    getstatic

    indexbyte1

    indexbyte2

    获取静态字段的值。

    0xb3

    putstatic

    indexbyte1

    indexbyte2

    给静态字段赋值。

     

    数组操作指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xbc

    newarray

    atype

    创建type类型的数组。

    0xbd

    anewarray

    indexbyte1

    indexbyte2

    创建引用类型的数组。

    0xbe

    arraylength

     

    获取一维数组的长度。

    0xc5

    multianewarray

    indexbyte1

    indexbyte2

    dimension

    创建dimension维度的数组。

     

    方法调用指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xb7

    invokespecial

    indexbyte1

    indexbyte2

    编译时方法绑定调用方法。

    0xb6

    invokevirtual

    indexbyte1

    indexbyte2

    运行时方法绑定调用方法。

    0xb8

    invokestatic

    indexbyte1

    indexbyte2

    调用静态方法。

    0xb9

    invokeinterface

    indexbyte1

    indexbyte2

    count

    0

    调用接口方法。

     

    方法返回指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xac

    ireturn

     

    返回int类型值。

    0xad

    lreturn

     

    返回long类型值。

    0xae

    freturn

     

    返回float类型值。

    0xaf

    dreturn

     

    返回double类型值。

    0xb0

    areturn

     

    返回引用类型值。

    0xb1

    return

     

    void函数返回。

     

    线程同步指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xc2

    monitorenter

     

    进入并获得对象监视器。

    0xc3

    monitorexit

     

    释放并退出对象监视器。

    展开全文
  • 常见 Java 字节 指令 助记符

    千次阅读 2016-01-28 13:45:27
    转自: 常见java字节 有时候为了能理解JVM对程序所做的优化等,需要查看程序的字节,...助记符 说明 0x00 nop 什么都不做 0x01 aconst_null
  • Java 虚拟机的指令由以下格式的字节指令构成:操作(Opcode 1 字节)[操作数(Oprand)],具有以下两个特点: 由于 Java 虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个...
  • 操作码助记符~temp

    千次阅读 2012-07-03 23:11:40
    助记符 指令含义 0x00 nop 什么都不做。 0x01 aconst_null 将 null 推送至栈顶。 0x02 iconst_m1 将 int 型-1 推送至栈顶。 0x03 iconst_0 将 int 型 0 推送至栈顶。 0x04 iconst_1 将 int 型 1 推送至栈顶。 ...
  • ARM指令条件码

    千次阅读 2011-09-03 11:00:17
    条件码 助记符后缀 标 志 含 义 0000 EQ Z置位 相等 0001 NE Z清零 不相等 0010 CS C置位 无符号数大于或等于 0011 CC C清零 无符号数小于 0100 MI N置位 负数 0101 PL N
  • 汇编语言基础.doc

    千次阅读 2021-07-16 01:47:03
    助记符是根据机器指令不同的功能和操作对象来描述指令的符号。用助记符形式来表示的机器指令称为汇编语言指令。汇编指令的格式MCS-51汇编语言的语句格式表示如下: 〔〕:〔〕;〔〕即一条汇编语句是由标号、操作、...
  •  JVM指令集(指令助记符、功能描述) 指令 助记符 功能描述 0x00 nop 无操作   0x01 aconst_null   指令格式: aconst_null   ...
  • ARM常见汇编指令和条件码列表

    千次阅读 2019-08-27 11:52:26
    操作码 条件码助记符 标志 含义 0000 EQ Z = 1 相等 0001 NE ( Not Equal ) Z = 0 不相等 0010 CS/HS ( Carry Set/High or Same ) C = 1 无符号数大于或等于 0011 CC/LO ( Carry Clear/LOwer ) C = 0 无符号...
  • ARM 指令的条件码

    千次阅读 2017-04-22 15:47:03
    1.程序状态寄存器的条件标志位 N 运算结果的b31位值。对于有符号二进制补码,结果为负数时N=1,结果为正数或零时N=0; Z 指令结果为0时Z=1,否则Z=0; C 使用加法运算(包括CMN指令),b31位产生进位...
  • ARM汇编助记码

    2011-11-20 10:23:25
    条件码助记符 缩写原版 CPSR标志 含义 EQ Equal Z=1 相等 NE Not Equal Z=0 不相等 CS Carry Set ...
  • JVM字节指令集大全及其介绍

    千次阅读 多人点赞 2019-08-22 23:39:48
    JVM字节指令介绍 字节与数据类型 加载和存储指令 算术指令 类型转换指令 对象创建与访问指令 操作数栈管理指令 控制转移指令 方法调用和返回指令 异常处理指令 同步指令 JVM指令集大全 Java是怎么跨...
  • 每种条件码可用两个字符表示,这两个字符可以作为后缀添加在指令助记符的后面和指令同时使用。 例如: 跳转指令B可以加上后缀EQ变为BEQ,表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。 2) :操作码域 ...
  • 能把它想象成一串数字,然后在本子上或者保存在电子设备中吗?答案是否定的。比特币的体现就是区块链上的一个个交易,在交易中承担了支付功能。而启用交易的唯一条件就是提供正确的签名,签名所需要的就是私钥。...
  • Android 进阶之路:ASM 修改字节,这样学就对了!

    千次阅读 热门讨论 2021-08-23 23:36:08
    没错,看了很多 ASM 入门的文章,都感觉文章写的很轻松,站立的高度都太高了,我个人觉得想要能够编写 ASM 相关代码,能看懂字节是必不可少的,所以本文会以字节为切入点,带大家简单的入门一下 ASM。...
  • 在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作,通常称这些特殊指令助记符为伪指令,它们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序做...
  • 这里就涉及到invokevirtual指令的多态查找过程: 找到操作数栈顶的第一个元素所指向的对象的实际类型,做M 如果在类型M中找到与常量中的描述和简单名称都相符的方法,则进行访问权限校验,若通过则返回这个方法...
  • 汇编语言笔记-ARM架构指令集

    千次阅读 2022-02-17 20:50:22
    .64,.F64 指定64位单精度运算,对于多数工具链,64后缀是可选的 可以通过S后缀的指令影响状态寄存器的标志位,再通过各类条件码后缀执行相应判断 条件码助记符 条件码 标志 含义 EQ 0000 Z=1 相等 NE 0001 Z=0 不相等...
  • 嵌入式作业七

    2019-12-13 23:34:17
    2.下列( )表示有符号数小于或等于条件码助记符。 I. GE II. LE III. LT IV. LS 3.下列指令助记符中,( )表示读取一 个半字。 A. LDRH B. STRH C. LDRB D. LDRM 4.下列( )执行时间最短。 A. MOV ...
  • Java 字节指令是 JVM 体系中非常难啃的一块硬骨头,我估计有些读者会有这样的疑惑,“Java 字节难学吗?我能不能学会啊?” 讲良心话,不是我谦虚,一开始学 Java 字节和 Java 虚拟机方面的知识我也感觉头大!...
  • 本文代码实现基本按照《数据结构》课本目录顺序,外加大量的复杂算法实现,一篇文章足够。能换你一个收藏了吧?
  • ARM 汇编指令学习[0]:编码格式与条件码域一、ARM指令的编码格式 31 28 27 21 20 19 16 15 12 11 0 cond opcode S Rn Rd shifter_operand 其中: cond [31-28] 4-bit 指令执行的条件编码 opcode ...
  • arm汇编条件码

    千次阅读 2014-06-27 10:08:22
     条件码助记符  标志  含义  0000  EQ  Z=1  相等  0001  NE(Not Equal)  Z=0  不相等  0010  CS/HS(Carry Set/High or Same)  C=1  无符号数大于或等于  0011  ...
  • boost库asio错误

    千次阅读 2018-10-24 16:53:55
    boost库asio常见错误 boost::asio::error::bad_descriptor (10009) 在一个已经关闭了的套接字上执行async_receive() boost::asio::error::operation_aborted (995) 正在async_receive()异步任务等待时,本端关闭...
  • 深入理解Java虚拟机 - 字节指令集

    千次阅读 2017-12-22 13:38:05
    Java虚拟机的指令由一个字节长度的、 代表着某种特定操作含义的数字(称为操作,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。 字节与数据类型 在Java虚拟机的指令...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,164
精华内容 14,065
热门标签
关键字:

条件码助记符