精华内容
下载资源
问答
  • 指令操作码与地址码

    千次阅读 2019-10-01 01:08:51
    指令字(简称指令)即表示一条指令的机器字。  指令格式则是指令字用二进制代码... 指令系统的每一条指令都有一个操作码,它表示该指令应进行什么性质的操作。不同的指令用操作码字段的不同编码来表示,每一种...

    指令字(简称指令)即表示一条指令的机器字。

      指令格式则是指令字用二进制代码表示的结构形式,由操作码字段和地址码字段组成。操作码字段表征指令的操作特性与功能;地址码字段通常指定参与操作的操作数的地址。

      操作码字段   地址码字段

      指令系统的每一条指令都有一个操作码,它表示该指令应进行什么性质的操作。不同的指令用操作码字段的不同编码来表示,每一种编码代表一种指令。组成操作码字段的位数一般取决于计算机指令系统的规模。例如,一个指令系统只有8条指令,则有3位操作码就够;如果有32条指令,那么就需要5位操作码。

       对于一个机器的指令系统,在指令字中操作码字段和地址字段产读通常是固定的。在单片机中,由于指令字较短,为了充分利用指令字长度,指令字的操作码字段和地址码字段是不固定的,即不同类型的指令有不同的划分,以便尽可能用较短的指令字长来表示越来越多的操作种类,并在越来越多的存储空间中寻址。

    地址码            

      根据一条指令中有几个操作数地址,可将该指令称为几操作数指令或几地址指令。

      一般的操作数有被操作数操作数操作结果这三种数,因而就形成了三地址指令格式。在此基础上,后来又发展成二地址格式、一地址格式和零地址格式

     操作码 A1 A2 A3

     

        三地址指令

     操作码 A1 A2

     

        二地址指令

     操作码  A1

     

        一地址指令

     操作码 

     

        零地址指令

    注意(1)零地址指令的指令字中只有操作码,而没有地址码。

      (2)一地址指令常称为单操作数指令。通常这种指令以运算器中累加寄存器AC中的数据为被操作数,指令字的地址码字段所指明的数为操作数,操作结果又放回累加寄存器AC中。

            (AC) OP (A) -> AC   

       OP表示操作性质;(AC)表示累加寄存器AC中的数;(A)表示内存中地址为A的存储单元中的数或运算器中地址为A的通用寄存器中的数; →表示把操作(运算)结果传送到指定的地方。

      (3)二地址指令常称为双操作数指令,它的两个地址码字段分别指明参与操作的两个数在内存中或运算器中通用寄存器的地址,A1作存放操作结果的地址。

            (A1) OP (A2) -> A1

      (4)三地址指令字中有三个操作数地址。

            (A1) OP (A2) -> A3     

       A1为被操作数地址,也称源操作数地址; A2为操作数地址,也称终点操作数地址; A3为存放结果的地址。 同样,A1,A2,A3以是内存中的单元地址,也可以是运算器中通用寄存器的地址。

      二地址指令格式中,从操作数的物理位置来说,又可归结为三种类型。

    存储器-存储器(SS)型指令:操作时都是涉及内存单元,参与操作的数都放在内存里,从内存某单元中取操作数,操作结果存放至内存另一单元中,因此机器执行这种指令需要多次访问内存。

    寄存器-寄存器(RR)型指令:需要多个通用寄存器或个别专用寄存器,从寄存器中取操作数,把操作结果放到另一寄存器。机器执行寄存器-寄存器型指令的速度很快,因为执行这类指令,不需要访问内存。

    寄存器-寄存器(RS)型指令:执行此类指令时,既要访问内存单元,又要访问寄存器。

    在设计扩展操作码指令格式时,必须注意以下两点:

    1、不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。

    2、各指令的操作码一定不能重复

    转载于:https://www.cnblogs.com/cpoint/archive/2012/11/11/2765634.html

    展开全文
  • MCS-51单片机汇编指令操作码助记符和英文全称对照
  • 指令操作码扩展

    万次阅读 多人点赞 2014-08-26 19:01:01
    题一 某计算机指令字长为16位,指令有双操作数、单操作数和无操作数3种格式,每个操作数字段均用6位二进制表示,该指令系统共有m条(m  A.2^6 B.(2^4-m)*(2^6)-1  C.(2^4-m)*2^6 D.(2^4-m)*(2^6-1) ...
    题一 某计算机指令字长为16位,指令有双操作数、单操作数和无操作数3种格式,每个操作数字段均用6位二进制表示,该指令系统共有m条(m<16)双操作数指令,并存在无操作数指令。若采用扩展操作码技术,那么最多还可设计出()条单操作数指令。
    
        A.2^6                          B.(2^4-m)*(2^6)-1
        C.(2^4-m)*2^6            D.(2^4-m)*(2^6-1)

    答案选B
    分析:
        对于双操作数指令而言,两个长度为6位的操作数共占了12位,剩余的4位用作操作码,所以可以设计出2的四次方个双操作数指令。系统中已经设计出了m条双操作数指令,那么剩余的2^4-m条可以用于设计单操作数的操作码。对于单操作数指令而言,它的操作码长度为16-6=10位。题目中要求使用扩展操作码技术,所以单操作数指令在原来的双操作数指令的4位操作码上可以扩展10-4=6位,所以最多可以设计出(2^4-m)*(2^6)-1条单操作数的指令。减去1的原因是“存在无操作数指令”,所以至少留下一个用来扩展无操作数指令。


        题二 指令字长为16位,采用扩展操作码技术,形成15条三地址指令、12条二地址指令、31条一地址指令和16条零地址指令。
    三地址:(15条)
    0000 **** **** ****
    ... ... ... ...
    1110 **** **** ****

    二地址:(12条)
    1111 0000 **** ****
    ... ... ... ...
    1111 1011 **** ****

    一地址:(31条)
    1111 1100 0000 ****
    ... ... ... ...
    1111 1101 1110 ****

    零地址:(16条)
    1111 1101 1111 0000
    ... ... ... ...
    1111 1101 1111 1111
    展开全文
  • Java二进制指令代码解析 小注:去年在看《深入解析JVM》书的时候做的一些记录,同时参考了《Java虚拟机规范》。只是对指令的一些列举,加入了一些自己的理解。...在字节文件中,指令代码只是其中的一部

    本文为转载记录原文地址:感谢博主分享
    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

     

    释放并退出对象监视器。

    展开全文
  • Dalvik指令一条操作码对应一条唯一的指令格式,而一条指令格式可能对应多个操作码。 例如,7010 0400 0000 0e00 opCode为0x70的操作码,它对应的指令格式是35c,格式35c对应如下几个指令: [A=5] op {vC, vD,...

    Dalvik指令一条操作码对应一条唯一的指令格式,而一条指令格式可能对应多个操作码。


    例如,7010 0400 0000 0e00

    opCode为0x70的操作码,它对应的指令格式是35c,格式35c对应如下几个指令:

    [A=5]  op  {vC, vD, vE, vF, vG},  meth@BBBB

    .........……

    [A=1] op  {vC},  kind@BBBB

    [A=0]  op  {},  kind@BBBB


    这条指令对应于:[A=1] op  {vC},  kind@BBBB


    而opCode为0x6e同样对应于指令格式35c,opCode 0x63对应的汇编指令为invoke-virtual


    指令格式中,"king@"总共有6种类型,分别为:

    meth:

    field:

    type:

    string:

    vtaoff:

    fieldoff:


    有的时候,在指令格式中不会明确说明"king@"是meth或field等,而是只是隐式的说为"kind@",在这种情况下不影响指令确定”kind@“类型,因为每种指令已经约定好了"kind@"是什么类型,比如说opCode 0x70对应的"kind@"为方法类型(meth)




    展开全文
  • 摘自 Java虚拟机规范
  • 正确答案: B操作码和地址码题目:组成计算机指令的两部分是解析:一条指令必须包括操作码和地址码(或“操作数”)两部分,操作码指出该指令完成操作的类型,如加、减、乘、除、传送等。地址码指出参与操作的数据和...
  • 指令格式之操作码地址码

    千次阅读 多人点赞 2020-04-14 06:24:21
    指令格式之操作码地址码 一、指令格式 指令:操作码字段 地址码字段 指令字(简称指令):表示一条指令的机器字。 指令格式:是指令自用二进制代码表示的结构形式,由操作码字段和地址码字段组成。 操作码字段:表征...
  • A:指令寄存器(IR) B:通用寄存器(GR) C:程序计数器(PC) D:状态寄存器(PSW) 答:C
  • 指令系统——扩展操作码指令格式

    千次阅读 2021-05-14 21:37:36
    文章目录扩展操作码扩展操作码举例设计扩展操作码需注意:设计扩展操作码例题:指令操作码操作码分类:定长操作码:扩展操作码(不定长操作码) : 扩展操作码 指令操作码和若干个地址码组成。 PS:先回顾一下指令字...
  • 指令操作码

    千次阅读 2013-11-20 08:22:33
    对处理器来说,指令操作码隐含了如何执行该指令的信息,比如它是做什么的,操作数的类型(是寄存器还是内存地址还是立即数),按字还是字节进行操作,以及怎么去做,同时还告诉处理器这条指令的的字节长度,以便...
  • 指令操作码的扩展2.1 为什么需要对操作码进行扩展2.2 如何扩展 1. 指令 指令是计算机执行某种操作的命令,一条指令中包括: 操作码 操作数地址 操作结果的存储地址 下一条指令的地址 下面详细说明指令的格式: 一...
  • 组成原理——指令格式(操作码

    千次阅读 2020-06-15 15:54:22
    指令操作码OP表示该指令应进行什么性质的操作,如进行加、减、乘、除、取数、存数等等。 组成操作码字段的位数一般取决于计算机指令系统的规模。 定长操作码指令格式 操作码的长度固定 在定长操作码格式下若操作...
  • 扩展操作码的总结

    万次阅读 多人点赞 2016-10-01 13:51:55
    假设指令字长是16位,平均劈开成4份,高位4位用作操作码,低12位分别用作三个地址码。那么操作码的个数就是四个二进制所能表达的离散数目:24=162^4 = 16OK,如果地址码只能做地址码,这是最终的结局了。 但是,...
  • 一条指令实际上包括两种信息即操作码和地址码。操作码(OperationCode,OP)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。 地址码用来描述该指令的操作对象,...
  • 操作码

    万次阅读 2018-01-04 17:56:56
    操作码
  • 指令 就是指挥机器工作的指示和命令, 程序 就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。...通常一条指令包括两方面的内容:操作码和操作数 操作码决定要完成的操作,操...
  • 51单片机的汇编指令操作码)系统

    千次阅读 2020-06-29 16:11:44
    AT89C51汇编语言指令系统有42种助记符和111种指令,按指令长度可分单字节指令、双字节和三字节指令,按执行时间可分为单机器周期指令(64种)、双... 操作码:是由助记符表示的字符串,以规定指令实现何种功能,是...
  • 扩展操作码的C实现,实现16位的扩展操作码的分配,分别为3,2,1,0地址指令描述
  • evm-opcodes:以太坊操作码指令参考
  • 计算机组成原理(唐朔飞第二版)301页,为什么采用扩展操作码技术后,比如说四位操作码就最多只能有15条一地址指令!这么做的主要作用是什么? 这是操作码不固定的指令格式,四位是基本的操作码,还可以扩充,但是...
  • 一条指令实际上包括两种信息即操作码和地址码。操作码(OperationCode,OP)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。 地址码用来描述该指令的操作对象...
  • 80C51单片机指令系统操作码助记符英语原文和汉语含义
  • 扩展操作码

    千次阅读 多人点赞 2018-01-24 09:20:33
    假设指令字长是16位,平均劈开成4份,高位4位用作操作码,低12位分别用作三个地址码。 那么操作码的个数就是四个二进制所能表达的离散数目:24=16 OK,如果地址码只能做地址码,这是最终的结局了。  但是,如果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,036,824
精华内容 414,729
关键字:

指令操作码