当前位置: 首页 > 知识库问答 >
问题:

Java字节码初学者问题:“iStore”变量使用顺序、“字节使用顺序”等

易阳朔
2023-03-14
public static void fun(int[] a) {

    int min;

    for(int j=0;j<a.length-1;j++) {
        min=j;

        for(int i=j+1;i<a.length;i++) 
            if(a[i]<a[min]) min=i;

        if(min!=j) {
            int temp = a[j];
            a[j] = a[min];
            a[min]=temp;
        }
    }
}

我的问题主要与istore命令有关。如您所见,在“1:”处,生成的字节码是istore2。在本例中,为什么使用Istore2,而不是Istore0Istore1?我们可以看到,稍后在“11:”中使用istore_1,而不使用istore_0。这有什么原因吗,为什么开始时使用变量2,后来使用变量1?

抱歉,如果上面的措辞不好,我现在才开始在大学里学习Java字节码。

此外,我还试图从我们必须学会使用的列表中找出哪些命令使用了一个以上的字节。这是列表,有人能验证下面命令中的“字节用法”(我不确定正确的术语)是否正确吗(我们必须在考试中手工转换,使用下面给出的命令列表,我需要了解每个命令使用多少字节--它在我们的讲座中解释得非常糟糕和迅速,讲师没有在线注释)。

非常感谢你的帮助,我意识到这是一个很长的问题!劳伦

共有1个答案

姜增
2023-03-14

关于字节的用法,您可以参考规范。引用开头的注释:“指令格式图中的每个单元表示一个8位字节”,所以应该很容易得到每个指令的大小。

正如您所看到的,在“1:”处,生成的字节码是“istore_2”。为什么在本例中使用“istore_2”,而不是“istore_0”或“istore_1”?

仅仅是因为在第1行,字节码将一个零值存储到恰好位于索引2的局部变量J。类似地,istore_1将操作数堆栈上的值存储到索引1处的局部变量(在本例中是min)。

BranchByte1

BranchByte2

无符号字节branchbyte1和branchbyte2用于构造有符号的16位branchoffset,其中branchoffset为(branchbyte1<<8)branchbyte2。执行在这个goto指令的操作码地址的偏移量处进行。目标地址必须是包含此goto指令的方法中指令的操作码的地址。

 类似资料:
  • 问题内容: 下面是我的代码,该代码代替了DataInputStream来包装InputStream,但除了读取大字节序类型的常规方法之外,还提供了额外的方法来读取小字节序数据类型。随意使用它。 我有以下几点保留意见。请注意不会更改功能的方法(读取大端类型的功能)。我无法将DataInputStream实现为基类并使用其方法,如read(),readInt(),readChar()等吗? 我的班级层

  • 我正在创建一个这样的GUID 这输出 根据维基百科,guid中有四个部分,这解释了为什么字节顺序在四组中切换。然而,维基百科的文章还指出,所有部分都以大端格式存储。显然前三部分不是Big Endian。guid的GetBytes()方法按照与创建时完全相同的顺序返回字节。这种行为的解释是什么?

  • 问题内容: 下面的程序打印: 首次加载类时,首先要初始化静态块和字段,然后才初始化实例块和字段。因此,应首先初始化变量“ objectName1”和“ objectName2”,然后初始化实例变量“ list”……但输出显然与该理论相矛盾……任何人都可以解释程序行为(我不是在批评程序)。设计本身顺便说一句)? 问题答案: 静态块 按顺序 初始化(因此您可以在下面的代码中依赖上面的代码)。通过在中创

  • 问题内容: 当我运行此代码时,答案是1,我想应该是2。初始化的顺序和每一步中k的值是什么? 编辑1:作为后续的“ k设置为默认值”,那么为什么下一个代码不能编译?出现错误“在定义字段之前无法引用它”。 编辑2:出于某种我不知道的原因,它^可以在其“ Test.k”代替“ k”时使用。 感谢所有的答案。这将满足:D 问题答案: 它们按照您编写它们的顺序执行。如果代码是: 然后输出变为2。 初始化的顺

  • 正如文件所说: 公共接口操作码 定义JVM操作码、访问标志和数组类型代码。此接口没有定义所有JVM操作码,因为某些操作码会自动处理。例如,xLOAD和xSTORE操作码会在可能的情况下自动替换为xLOAD_n和xSTORE_n操作码。因此,xLOAD_n和xSTORE_n操作码不会在此接口中定义。LDC也是如此,必要时自动替换为LDC_W或LDC2_W、WIDE、GOTO_W和JSR_W。 问题:

  • The order in which request variables are registered, similar to variables_order in php.ini 请求变量的顺序在这里配置,类似于php.ini中的变量顺序.