.NET的MSIL和Java的字节码比较

阅读

阅读https://blog.csdn.net/cnhk1225/article/details/53568996 然后回答问题: What does this code do?

通过比较输入字符的ASCII码,来确定它是不是字母,如果输入的是字母则程序返回1,否则返回0。

这是.NET框架下编译后的MSIL(微软中间语言):

Optimizing csc .NET compiler from MSVS 2015 (/o switch), ildasm output:


  .method public hidebysig static bool  f(char a) cil managed
  {
    // Code size       26 (0x1a)
    .maxstack  8   // 计算出计算堆栈的能存几个值
    IL_0000:  ldarg.0    //将索引为 0 的参数加载到计算堆栈上
    IL_0001:  ldc.i4.s   97  //将提供的值作为int32推送到计算堆栈上(短格式)
    IL_0003:  blt.s      IL_000c    //如果第一个值小于第二个值97,则将控制转移到目标指令(短格式)
    IL_0005:  ldarg.0   //将索引为 0 的参数加载到计算堆栈上
    IL_0006:  ldc.i4.s   122   //将提供的 int8 值作为 int32 推送到计算堆栈上(短格式)
    IL_0008:  bgt.s      IL_000c   //如果第一个值大于第二个值122,则将控制转移到目标指令(短格式)
    IL_000a:  ldc.i4.1   //将整数值 1 作为 int32 推送到计算堆栈上
    IL_000b:  ret  //返回
//上面这一段代码的意思是,当输入的值小于97或大于122时,跳转到IL_000c,否则返回1。
    IL_000c:  ldarg.0   //将索引为 0 的参数加载到计算堆栈上
    IL_000d:  ldc.i4.s   65   //将提供的 int8 值作为 int32 推送到计算堆栈上(短格式)
    IL_000f:  blt.s      IL_0018   //如果第一个值小于第二个值65,则将控制转移到目标指令(短格式)
    IL_0011:  ldarg.0   //将索引为 0 的参数加载到计算堆栈上
    IL_0012:  ldc.i4.s   90   //将提供的 int8 值作为 int32 推送到计算堆栈上(短格式)
    IL_0014:  bgt.s      IL_0018   //如果第一个值大于第二个值90,则将控制转移到目标指令(短格式)
    IL_0016:  ldc.i4.1   //将整数值 1 作为 int32 推送到计算堆栈上
    IL_0017:  ret  //返回
    IL_0018:  ldc.i4.0  //将整数值 0 作为 int32 推送到计算堆栈上
    IL_0019:  ret  //返回
  } // end of method some_class::f
//上面这一段代码的意思是,当输入的值小于65或大于90时,跳转到IL_0018:返回0;否则返回1。

所以整段代码的意思就是:通过比较输入字符的ASCII码,来确定它是不是字母,如果输入的是字母则程序返回1,否则返回0。

一样的代码,只不过换成了Java字节码
Java 1.8 compiler:

public boolean f(char);
    descriptor: (C)Z
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: iload_1        //第二个int型局部变量进栈顶
         1: bipush        97    //将一个byte型常量值97作为一个int整型值推送至栈顶
         3: if_icmplt     14     //比较栈顶两int型数值大小,当结果小于0时跳转到位置14
         6: iload_1         //第二个int型局部变量进栈
         7: bipush        122   //将一个byte型常量122值作为一个int整型值推送至栈顶
         9: if_icmpgt     14    //比较栈顶两int型数值大小,当结果大于0时跳转到位置14
        12: iconst_1       //int型常量值1进栈
        13: ireturn         //当前方法返回int
        14: iload_1          //第二个int型局部变量进栈
        15: bipush        65   //将一个byte型常量值65作为一个int整型值推送至栈顶
        17: if_icmplt     28    //比较栈顶两int型数值大小,当结果小于0时跳转到位置28
        20: iload_1         //第二个int型局部变量进栈
        21: bipush        90    //将一个byte型常量值90作为一个int整型值推送至栈顶
        23: if_icmpgt     28    //比较栈顶两int型数值大小,当结果大于0时跳转到位置28
        26: iconst_1      //int型常量值1进栈
        27: ireturn       //当前方法返回int值
        28: iconst_0      //int型常量值0进栈
        29: ireturn       //当前方法返回int值

这段指令集的作用和第一段一样,通过比较输入字符的ASCII码,来确定它是不是字母,如果输入的是字母则程序返回1,否则返回0。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值