阅读
阅读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。