whlll‘s jasmin教程

本文是whlll关于Jasmin的教程,旨在帮助读者搭建Jasmin环境,理解基本编译操作,并通过实例展示如何从Java代码转为Jasmin程序。教程包括Jasmin的环境搭建、编译步骤和Java字节码到Jasmin的转换规则,适合应对课程任务或对汇编语言感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@whlll’s Jasmin

Jasmin

这篇文章主要教你jasmin的环境的搭建,基本编译语法,以及如何从java快速编写jasmin程序,以应付课程任务,鉴于网上相关资源太少,也没什么人研究这个,写自己的第一篇Blog,回忆一下jasmin的学习过程吧0.0

jasmin环境搭建与基本编译操作:
首先您只需要支付5积分便可从我分享的资源下载jasmin并获得本人编写的部分jasmin例程供你学习.链接附文章末尾

准备工作:下载jdk并配置好环境变量,命令行输入java --version检查是否成功jdk安装验证

jasmin内部文件+examples例程:
jasmin软件examples例程

编译步骤:

  1. win+R 输入cmd打开命令行操作界面,打开jasmin文件夹所在目录:这里我将它放在D下方便操作
  2. 输入:java -jar jasmin.jar examples\q2.j(ps:q2.j为笔者所写的冒泡排序)编译,(Generated编译成功)生成class执行文件.编译
  3. 输入: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

部分规则:

  1. ‘#+数字’ 替换为 ‘javap给的注释内容’(#16 // class java/util/Scanner)
  2. 将 . 替换为 /
  3. 去掉 " "(双引号)
    具体参考约瑟夫环案例

最后:
一段jasmin代码就搞定了,快速完成了您的课程任务0.0
只要把它放在examples文件夹目录下,后缀名改为.j,按上述操作即可编译运行啦~

笔者寄语:
jasmin作为java的独立的汇编语言,不同于java的字节码依附于java本身代码而存在,从开发上必然没有高级语言的复用性而带来的简洁优美,但其更有助于初学者学习,了解高级语言的更下层的解释,如何实现上层的功能.jasmin的语法更接近于个人计算机RISIC的体系架构,例如先装载再使用的高并发性…虽然网上都说学这玩意儿没啥意思 笔者也是因为课程要求才涉及它,这点心得希望成为那些觉得它还有点意思的人的一点动力吧0.0

whlll的jasmin软件+样例程序链接:
jasmin+本人写的一些样例程序仅供学习参考

参考书籍:计算机组成及汇编语言原理(第十章) 机械工业出版社 (美)Patrick Juola 著

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值