RE_lab3
组长 | 组员 | 组员 |
---|---|---|
E41714007 | E41714001 | E41714020 |
Question 1
1.1 题目要求
- 阅读
然后回答问题:
What does this code do?
一样的代码,只不过换成了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
1: bipush 97
3: if_icmplt 14
6: iload_1
7: bipush 122
9: if_icmpgt 14
12: iconst_1
13: ireturn
14: iload_1
15: bipush 65
17: if_icmplt 28
20: iload_1
21: bipush 90
23: if_icmpgt 28
26: iconst_1
27: ireturn
28: iconst_0
29: ireturn
1.2 解答
由于Java语言类似,故以下只解释一种
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) //代码大小 26(0x1a)
.maxstack 8 //计算出计算堆栈的能存几个值(8个)
IL_0000: ldarg.0 //把this指针压入栈中
IL_0001: ldc.i4.s 97 //把int32的值(97)推送到计算堆栈
IL_0003: blt.s IL_000c //如果第一个值<第二个值,跳转到IL_000c位置
IL_0005: ldarg.0 //把this指针压入栈中
IL_0006: ldc.i4.s 122 //把int32的值(122)推送到计算堆栈
IL_0008: bgt.s IL_000c //如果第一个值>第二个值,跳转到IL_000c位置
IL_000a: ldc.i4.1 //把int32的值(1)推送到计算堆栈
IL_000b: ret //把1从调用方的计算堆栈推送到被调用方的计算堆栈上
IL_000c: ldarg.0 //把this指针压入栈中
IL_000d: ldc.i4.s 65 //把int32的值(65)推送到计算堆栈
IL_000f: blt.s IL_0018 //如果第一个值<第二个值,跳转到IL_0018位置
IL_0011: ldarg.0 //把this指针压入栈中
IL_0012: ldc.i4.s 90 //把int32的值(90)推送到计算堆栈
IL_0014: bgt.s IL_0018 //如果第一个值>第二个值,跳转到IL_0018位置
IL_0016: ldc.i4.1 //把int32的值(1)推送到计算堆栈
IL_0017: ret //把1从调用方的计算堆栈推送到被调用方的计算堆栈上
IL_0018: ldc.i4