問題タブ [jasmin]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 「ldc_w」を使用して「定数プールの不正な型」を回避する方法「ジャスミンで?
Jasmin コードを生成するコンパイラを作成しており、クラスをパラメーターとして受け取るメソッドを呼び出したいと考えています。
したがって、ジャスミンでは、次のようにする必要があると思います。
組み立てて実行すると、次のようになります。
スレッド「メイン」での例外 java.lang.VerifyError: (クラス: CTest2、メソッド: メイン シグネチャ: ([Ljava/lang/String;)V) 定数プールの不正な型
「javap -c -verbose」を使用して CTest.class (Java バージョン) と CTest2.class (Jasmin バージョン) の両方の逆アセンブル コードを見ると、どちらも同じ方法で定数プールを設定しているように見えます。
Jasmin の 2 つのバグは既に修正しましたが、"ldc_w" の定数プールにクラスを配置すると、クラスが "new" や "anewarray 「正しく。
ASM で TraceClassVisitor を使用して .class ファイルを調べてみましたが、定数プールがダンプされません。
次に試すことができるアイデアはありますか?
jvm - JasminのすすバージョンがJasminアセンブリファイルのアセンブルに失敗する
JasminSourceForgeのJasmin2.4のバージョンとSootプロジェクトのJasmin2.4のバージョン(sable.mcgill.caにあり、「jasminclasses」というラベルが付いています)の両方がありますが、Sootバージョン(必要なもの)はそうではないようです。正しく動作しています。
最初にJasminJVMアセンブリにコンパイルし、次にJasminを使用してJVMクラスファイルにアセンブルする単純なコンパイラを作成しました。以前は、JasminのSourceForgeサイトにある通常バージョンのJasminを使用していましたが、うまく機能していました。すべてが正しくコンパイルされ、実行されました。これで、Sootフレームワークを使用して最適化を開始しました。最適化されたコードをクラスファイルに変換し直そうとしない限り、すべてがうまく機能します。
現在Sootを使用しているので、Sootが使用するJasminOutputStreamをサポートするSootバージョンのJasminを使用する必要があります。SootのバージョンのJasminは、入力ストリームを取得する代わりに「.j」ファイルを読み取る「昔ながらの」方法でJasminファイルの処理を処理できるはずのように見えますが、(最初のアセンブルのために)最適化前)、Sootバージョンは失敗します。
私が行った場合
期待どおりに「Generated:MyClass.class」という出力が得られます。
もしそうなら(jasminclassesはJasminのSootバージョンです)
出力を取得します
5行目は.fieldpublicn Iについては何も間違っていません。上に示したように、通常のバージョンのJasminで正常にコンパイルされます。
完全を期すために、その点に関するコードをさらにいくつか示します。
そこにあるものはすべてうまく、通常のジャスミンでうまく組み立てられます。
JasminのSootバージョンが異なる構文を期待しているかどうか誰かが知っていますか?スートとジャスミンに関するほとんどのものと同様に、そもそもWebにはほとんど何もありません。ましてや、私が探しているものはあまりないので、私のグーグルはあまり思いつきません。
よろしくお願いします。ここで本当にイライラしています。次のステップは、SootのJasminパッケージをデバッグし、そこで何が行われているのか、なぜ失敗するのかを確認することですが、これだけのために今のところそれほど遠くまで行く必要はないことを願っています。
java - 'main'メソッドのJVM命令ALOAD_0は、'this'ではなく'args'を指しますか?
学術研究のためにJavaのサブセットを実装しようとしています。さて、私は最終段階(コード生成)にあり、メソッド引数がどのように処理されるかを確認するためのかなり単純なプログラムを作成しました。
それから私はそれを構築し、次の場所で見つけたオンライン逆アセンブラを介して「Main.class」を実行しました: http ://www.cs.cornell.edu/People/egs/kimera/disassembler.html
'main'メソッドの次の実装を取得します:(分解された出力はJasminにあります)
これに関する私の問題は次のとおり
です。1。aload_0
「this」をスタックにプッシュすることになっています(JVM仕様が言っているようです)
2。arraylength
参照がスタックの一番上にある配列の長さを返すことになっています
したがって、私によれば、1と2の組み合わせは機能しないはずです。
それはどのように/なぜ機能していますか?または、逆アセンブラにバグがあり、実際のバイトコードは別のものですか?
java - jsr命令を使用したJava再帰
Jasmin Java アセンブラーを使用しておもちゃの言語をコンパイルしています。しかし、jsr 命令を使用して再帰的にサブルーチンに戻り、Java を使用して Jasmin の出力を実行すると、「jsr エントリへの再帰呼び出し」というエラーが発生します。Jasmin コードは次のとおりです (5 を計算しています! (クラス定義は省略しました。これはすべてメイン メソッド本体にあります)):
java - Jasmin HelloWorld の例の失敗
jasmin-2.4 ディストリビューションから新しくコンパイルされた HelloWorld.j の実行に問題があります。
jasmin-2.4 をダウンロードしました。次を使用して問題なくコンパイルできます。
java -jar jasmin.jar examples\HelloWorld.j
出力は次のとおりです。
生成: NoJad\j.class
新しくコンパイルしたプログラムを実行すると:
java NoJad.j
例外がスローされます:
スレッド「メイン」での例外 java.lang.VerifyError: (クラス: NoJad/j、メソッド: メイン シグネチャ: ([Ljava/lang/String;)V) スタック上のオブジェクト/配列の検索を期待しています メイン クラスが見つかりませんでした: NoJad.j. プログラムは終了します。
これは、HelloWorld.j の例のバグだと思いがちです。おそらく、新しいベリファイアがバグをキャッチしたのでしょうか???
注 1: ディストリビューション内の事前コンパイルされた HelloWorld.class は期待どおりに動作します。
注 2: このバージョンの Java を使用しています Java バージョン "1.6.0_24" Java(TM) SE ランタイム環境 (ビルド 1.6.0_24-b07) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 19.1-b02、混合)モード)
ディストリビューションの HelloWorld.j ファイルは次のとおりです。
java - JVM のアセンブリ言語を標準の高レベル Java コードに統合することは可能ですか?
Java アセンブリ コード (Jasmin (Java のアセンブラー インターフェイス) を使用) を標準の Java コードとマージしようとしています。
これは可能ですか?
java - Jasmin でデータプールを作成するには?
Jasmin には定数プールを指定する機能がありますか? 数千バイトの記述子領域を作成できる必要があります。この領域には、ヌルを含む任意のバイト データが含まれます。バイナリ定数を宣言する典型的なアセンブリ ディレクティブの例を次に示します。
Java クラス ファイルにはこれらの領域が含まれているようですが、Jasmin でそのような大規模な値を宣言する方法が見つかりません。
java - Jasmin Assembler VerifyError:スタック上でオブジェクト/配列が見つかることを期待しています
「Java testphase」の後にこのエラーが発生します。
コード: