Jasmin
这篇文章主要教你jasmin的环境的搭建,基本编译语法,以及如何从java快速编写jasmin程序,以应付课程任务,鉴于网上相关资源太少,也没什么人研究这个,写自己的第一篇Blog,回忆一下jasmin的学习过程吧0.0
jasmin环境搭建与基本编译操作:
首先您只需要支付5积分便可从我分享的资源下载jasmin并获得本人编写的部分jasmin例程供你学习.链接附文章末尾
准备工作:下载jdk并配置好环境变量,命令行输入java --version检查是否成功
jasmin内部文件+examples例程:
编译步骤:
- win+R 输入cmd打开命令行操作界面,打开jasmin文件夹所在目录:这里我将它放在D下方便操作
- 输入:java -jar jasmin.jar examples\q2.j(ps:q2.j为笔者所写的冒泡排序)编译,(Generated编译成功)生成class执行文件.
- 输入:java q2运行(q2对应代码中的q2类,如果代码中你给debug,那么它编译之后便生产的debug.class可执行文件)
.class public q2
.super java/lang/Object
.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method
.method public static main([Ljava/lang/String;)V
.limit locals 20
.limit stack 10
new java/util/Scanner
dup
getstatic java/lang/System.in Ljava/io/InputStream;
invokespecial java/util/Scanner/<init>(Ljava/io/InputStream;)V
astore_0
bipush 10
newarray int
astore_1
iconst_0
istore_2
ldc "input:"
getstatic java/lang/System/out Ljava/io/PrintStream;
swap
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
Loadarray:
aload_0
invokevirtual java/util/Scanner/nextInt()I
istore_3
aload_1
iload_2
iload_3
iastore
iinc 2 1
iload_2
bipush 10
if_icmplt Loadarray
bubsort:
aload_1
arraylength
istore 4
iload 4
bipush 1
isub
istore 11
iconst_0
istore 5
Loop_1:
iconst_0
istore 6
iload 5
iload 4
if_icmplt Loop_2
goto output
Loop_2:
iload 11
iload 5
isub
istore 10
iload 6
iload 10
if_icmplt exchange_judge
goto else_1
exchange_judge:
aload_1
iload 6
iaload
iload 6
bipush 1
iadd
istore 7
aload_1
iload 7
iaload
if_icmpgt exchange
goto else_2
exchange:
aload_1
iload 6
iaload
istore 8
aload_1
iload 7
iaload
istore 9
aload_1
iload 6
iload 9
iastore
aload_1
iload 7
iload 8
iastore
goto else_2
else_1:
iinc 5 1
goto Loop_1
else_2:
iinc 6 1
goto Loop_2
output:
ldc "order:"
jsr Print
iconst_0
istore 12
Loop_3:
aload_1
iload 12
iaload
istore 13
getstatic java/lang/System.out Ljava/io/PrintStream;
iload 13
invokevirtual java/io/PrintStream/print(I)V
ldc " "
jsr Print
iinc 12 1
iload 12
bipush 10
if_icmplt Loop_3
ldc " whlll "
jsr Print
ldc " 19041420 "
jsr Print
return
Print:
astore 2
getstatic java/lang/System/out Ljava/io/PrintStream;
swap
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
ret 2
.end method
请忽视笔者的学号姓名0.0
4.运行结果:
So easy!
当你会java后,情况就变得不一样了:
当你有一个约瑟夫环的java代码+javap
约瑟夫环 java:
package YSF;
import java.util.Iterator;
import java.util.Scanner;
/*
* 500个小孩围一圈,数到3的退出,问剩下最后的小孩原来是多少号?
* author@
* */
public class YueSeFuHuan
{
public static void main(String[] args)
{
Scanner sca = new Scanner(System.in);
System.out.println("输入该游戏的参与人数:");
int n = sca.nextInt();
System.out.println("输入数到退出的数字:");
int m = sca.nextInt();
sca.close();
int len = n;
int[] a = new int[n];
for (int i = 0; i < n; i++)
{
a[i] = i + 1;
}
int i = 0;
int j = 1;
while (len >= m)
{
if (a[i % n] > 0)
{ // 这里判断是否被圈出去
if (j % m == 0)
{ // 这里判断是否报的数相同,是则退出该位置,且下一位重新报数
// System.out.print(a[i%n]+",");
a[i % n] = -1;
i++;
j = 1;
len--;
} else
{ // 不相同则继续
i++;
j++;
}
} else
{ // 表示该位置已被圈出,跳向下一位
i++;
}
}
for (int k = 0; k < n; k++)
{
if (a[k] > 0)
System.out.print(a[k] + ",");
}
System.out.println(" whllll 19041420");
}
}
eclipse配置好javap插件(java提供的一个用来查看java字节码的工具),那么你将得到:
Compiled from "YueSeFuHuan.java"
public class YSF.YueSeFuHuan {
public YSF.YueSeFuHuan();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #16 // class java/util/Scanner
3: dup
4: getstatic #18 // Field java/lang/System.in:Ljava/io/InputStream;
7: invokespecial #24 // Method java/util/Scanner."<init>":(Ljava/io/InputStream;)V
10: astore_1
11: getstatic #27 // Field java/lang/System.out:Ljava/io/PrintStream;
14: ldc #31 // String 输入该游戏的参与人数:
16: invokevirtual #33 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
19: aload_1
20: invokevirtual #39 // Method java/util/Scanner.nextInt:()I
23: istore_2
24: getstatic #27 // Field java/lang/System.out:Ljava/io/PrintStream;
27: ldc #43 // String 输入数到退出的数字:
29: invokevirtual #33 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
32: aload_1
33: invokevirtual #39 // Method java/util/Scanner.nextInt:()I
36: istore_3
37: aload_1
38: invokevirtual #45 // Method java/util/Scanner.close:()V
41: iload_2
42: istore 4
44: iload_2
45: newarray int
47: astore 5
49: iconst_0
50: istore 6
52: goto 67
55: aload 5
57: iload 6
59: iload 6
61: iconst_1
62: iadd
63: iastore
64: iinc 6, 1
67: iload 6
69: iload_2
70: if_icmplt 55
73: iconst_0
74: istore 6
76: iconst_1
77: istore 7
79: goto 131
82: aload 5
84: iload 6
86: iload_2
87: irem
88: iaload
89: ifle 128
92: iload 7
94: iload_3
95: irem
96: ifne 119
99: aload 5
101: iload 6
103: iload_2
104: irem
105: iconst_m1
106: iastore
107: iinc 6, 1
110: iconst_1
111: istore 7
113: iinc 4, -1
116: goto 131
119: iinc 6, 1
122: iinc 7, 1
125: goto 131
128: iinc 6, 1
131: iload 4
133: iload_3
134: if_icmpge 82
137: iconst_0
138: istore 8
140: goto 183
143: aload 5
145: iload 8
147: iaload
148: ifle 180
151: getstatic #27 // Field java/lang/System.out:Ljava/io/PrintStream;
154: new #48 // class java/lang/StringBuilder
157: dup
158: aload 5
160: iload 8
162: iaload
163: invokestatic #50 // Method java/lang/String.valueOf:(I)Ljava/lang/String;
166: invokespecial #56 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
169: ldc #58 // String ,
171: invokevirtual #60 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
174: invokevirtual #64 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
177: invokevirtual #68 // Method java/io/PrintStream.print:(Ljava/lang/String;)V
180: iinc 8, 1
183: iload 8
185: iload_2
186: if_icmplt 143
189: getstatic #27 // Field java/lang/System.out:Ljava/io/PrintStream;
192: ldc #71 // String whllll 19041420
194: invokevirtual #33 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
197: return
}
**下一步:**修改为jasmin的标准代码以及结构
.class public YSF
.super java/lang/Object
.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method
.method public static main([Ljava/lang/String;)V
.limit locals 10
.limit stack 10
0: new java/util/Scanner
3: dup
4: getstatic java/lang/System.in Ljava/io/InputStream;
7: invokespecial java/util/Scanner/<init>(Ljava/io/InputStream;)V
10: astore_1
11: getstatic java/lang/System/out Ljava/io/PrintStream;
14: ldc "Enter the number of players in the game: "
16: invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
19: aload_1
20: invokevirtual java/util/Scanner/nextInt()I
23: istore_2
24: getstatic java/lang/System/out Ljava/io/PrintStream;
27: ldc "Enter the number to the exit number:"
29: invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
32: aload_1
33: invokevirtual java/util/Scanner/nextInt()I
36: istore_3
37: aload_1
38: invokevirtual java/util/Scanner/close()V
41: iload_2
42: istore 4
44: iload_2
45: newarray int
47: astore 5
49: iconst_0
50: istore 6
52: goto 67
55: aload 5
57: iload 6
59: iload 6
61: iconst_1
62: iadd
63: iastore
64: iinc 6 1
67: iload 6
69: iload_2
70: if_icmplt 55
73: iconst_0
74: istore 6
76: iconst_1
77: istore 7
79: goto 131
82: aload 5
84: iload 6
86: iload_2
87: irem
88: iaload
89: ifle 128
92: iload 7
94: iload_3
95: irem
96: ifne 119
99: aload 5
101: iload 6
103: iload_2
104: irem
105: iconst_m1
106: iastore
107: iinc 6 1
110: iconst_1
111: istore 7
113: iinc 4 -1
116: goto 131
119: iinc 6 1
122: iinc 7 1
125: goto 131
128: iinc 6 1
131: iload 4
133: iload_3
134: if_icmpge 82
137: iconst_0
138: istore 8
140: goto 183
143: aload 5
145: iload 8
147: iaload
148: ifle 180
151: getstatic java/lang/System/out Ljava/io/PrintStream;
154: new java/lang/StringBuilder
157: dup
158: aload 5
160: iload 8
162: iaload
163: invokestatic java/lang/String/valueOf(I)Ljava/lang/String;
166: invokespecial java/lang/StringBuilder/<init>(Ljava/lang/String;)V
169: ldc ","
171: invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
174: invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String;
177: invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
180: iinc 8 1
183: iload 8
185: iload_2
186: if_icmplt 143
189: getstatic java/lang/System/out Ljava/io/PrintStream;
192: ldc " whllll 19041420"
194: invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
197: return
.end method
部分规则:
- ‘#+数字’ 替换为 ‘javap给的注释内容’(#16 // class java/util/Scanner)
- 将 . 替换为 /
- 去掉 " "(双引号)
具体参考约瑟夫环案例
最后:
一段jasmin代码就搞定了,快速完成了您的课程任务0.0
只要把它放在examples文件夹目录下,后缀名改为.j,按上述操作即可编译运行啦~
笔者寄语:
jasmin作为java的独立的汇编语言,不同于java的字节码依附于java本身代码而存在,从开发上必然没有高级语言的复用性而带来的简洁优美,但其更有助于初学者学习,了解高级语言的更下层的解释,如何实现上层的功能.jasmin的语法更接近于个人计算机RISIC的体系架构,例如先装载再使用的高并发性…虽然网上都说学这玩意儿没啥意思 笔者也是因为课程要求才涉及它,这点心得希望成为那些觉得它还有点意思的人的一点动力吧0.0
whlll的jasmin软件+样例程序链接:
jasmin+本人写的一些样例程序仅供学习参考
参考书籍:计算机组成及汇编语言原理(第十章) 机械工业出版社 (美)Patrick Juola 著