3ds

GodeMode9_if_goto

投稿日:

windows_server_2003さんが、3DSのフルファイルブラウザであるGodMode9のスクリプトにif, else, end, goto, labelコマンドを追加したバージョンを作成しているようです。

ビルド済み

ソースコード

興味のある方はバグを見つけた際、報告していただけると助かります。

簡易的な説明

if – 引数2
else – 引数0
end – 引数0
goto – 引数1
label – 引数1

となっており、簡単な例としてこのように記述できます。

if test test
echo "This will be shown"
else
echo "This will be skipped"
end
goto testlabel
echo "This won’t be shown"
label testlabel

この場合ifの後の二つの文字列が一致するため、その下の行が実行され、elseとendの間の行は実行されません。

そして、gotoはコード内のlabelにより設定されたところまで飛ぶので、その間の行は表示されません。

 

また、gotoでifの中にジャンプした時、ifは評価されず実行されます。

goto label_1
if test test1
label label_1
echo "This will be shown"
else
echo "This won’t be shown"
end

つまり、上記のコードの場合

This will be shown

と表示されます。

※labelをgotoの前に設定すると無限ループに入ることがあるので、その場合は電源ボタンを長押しして終了してください。

 

Sponsored Link

-3ds
-

執筆者:


  1. windows_server_2003 より:

    https://drive.google.com/file/d/1KlQ-GI8AKBGltszCU6emiWhxmp3H_P2N/view?usp=sharing

    危ないものです。
    Godmode9のmemory write permission(青権限)だけでSysNAND lvl3 permission(B9Sアンインストとかに出るアレ)を取るスクリプトです。
    赤権限とった後、悪さはしません。悪用は自己責任で。

    仕組み
    権限は変数に格納されていますからメモリ上のどこかにあるはずです。で、そのアドレスを特定して0xFFで上書きしちゃえっていう考え方です。GodMode9はFull Accessと謳っているようにメモリまでアクセスできるんですねー
    当然変数のメモリ上の絶対位置はバージョンによって変わりますからバージョンごとに違うのがあります。
    F0に焼いたりした場合アドレスが変わるかもしれませんので普通にB9Sから動かしてください。

    絶対に自己責任でお願いします。というのも間違ったバージョンでやるとメモリ上の変なアドレスに書き込んじゃって予期せぬ動作をするかもしれないためです。

    4バイト分書き込んでいるのは権限の変数がu32(32bit符号なし整数型)で4バイト占有しているからです。今は13bit目位までしか使っていませんから後の2バイトは意味がありません。

    くれぐれも青権限取るときは注意してください。

  2. windows_server_2003 より:

    PullRequestが通りました。mergeされたわけではないので開きっぱなしですが。
    本家リポジトリのifelseブランチに取り入れられました。d0k3さんによって僕の下手な英語の修正が入るでしょうw

    • windows_server_2003 より:

      前言撤回
      コードが汚いようでw
      ビルドにv2を追加しましたがバグがたくさんあります。
      ifコマンドの条件を変えました。
      if chk “test” “test”
       echo “This will be shown”
      end

      こんな風に使って後に続くコマンドの成功/失敗が条件となります。
      また、ラベルを@labelのように書くようにしてください。
      goto testlabel
      @testlabel
      みたいな感じです。

      あと少しで期末なので多分少なくともあと2週間はPullReqは閉じません。
      既知のバグ :
      1) ifの後のコマンドにオプションを与えるとエラーが出る。
      2) ifの後に引数3のコマンド(filesel)を与えるとエラーが出る。
      3) ifの後にelseやend, gotoコマンドを与えると動作が予想不能。
      この他にもたくさんバグがあると思うので見つけたら報告お願いします。

      • glänheit より:

        3) ifの後にelseやend, gotoコマンドを与えると動作が予想不能。

        これが強烈な気がしますが…

        • windows_server_2003 より:

          危険ですね。
          ifの条件としてのelse end gotoはgithubでは既に禁止しています。ビルドに反映するのを忘れました。”if”はgithub, ビルドともに禁止しています。
          正確には予想不能ではありませんが、ifの条件としてのコマンドには今のところ-o と -sが強制的に適用されるので文法エラーを無視してその後の処理を続行したり処理するべきところをスキップしたりするので予期せぬ結果になるかもしれません。

          どのバグも簡単に修正可能(2に至ってはソースの1文字変えるだけで修正可能)なので期末終わったらすぐ修正します。

          今気づいたこと : コメントでインデントに全角スペース使えばちゃんとインデントされますね。この前全部半角スペースでやっちゃって大変な読みづらさになってしまいましたが。HTMLの仕様らしいです。

  3. windows_server_2003 より:

    ビルドをアップデートしました。
    主な変更点はgotoコマンドがifブロックの中にジャンプできなくなったことです。ジャンプしようとした場合予期しない動作をする可能性があります。
    ソースコードの可読性のために機能が制限されました。ただgotoがifの中にジャンプできない/予期せぬ動作をするのは多言語共通の仕様で問題はないと思います。

    また、いくつかの文法エラーが検知されなくなりました。
    1) ‘else’ already used
    2) ‘end’ expected

  4. windows_server_2003 より:

    Merged

    わーい
    1か月以上開いていたのが閉じました(笑)
    まだチェック中のようですが。
    確かに自分でもまだどこかにバグがあるなー って感じるためまだテストを続けます。

    もしmasterブランチにmergeされたら記事を削除しても問題ありません。

  5. windows_server_2003 より:

    あれ、12/12にコメント書いたはずなのに出てませんね。
    承認制になったのか、BANされたのか、、、

  6. windows_server_2003 より:

    今度は出てきた。でもさっきコメントしようとしたら今度はダメ ???
    この内容で3回目のチャレンジ :

    PullReqマージされました。ソースコードはチェック中ということです。僕もバグありそうだなーとか感じてるのでテストを続けます。

    masterに取り入れられたら記事削除しても問題ありません。

    • glänheit より:

      (笑)(泣)等はNGワードにしているので、ゴミ箱に直行します。。

      • windows_server_2003 より:

        なるほど。
        でもなんでダメなんですか ?
        並べまくる人がいるからでしょうか ?

        草は馴染みがなくwは相手を少しバカにしてるような感覚があるのであまり使いません。

        • glänheit より:

          ただ単に私の感覚ですけどね。
          wwwは別にいいんですが、(笑)はどうも嫌いなので;;

          個人的にwwwより、(笑)の方がバカにしているように見えてしまうのです。

  7. windows_server_2003 より:

    成功 !!

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  • Loading...



その時その時書こうと思ったものを書いていきます。
yahooブログから始まりFC2を経て今ここです。
皆様の興味がそそる内容は少ないかもしれませんが、よろしくお願いします。