«前の日(12-15) 最新 次の日(12-17)» 追記

一往確認日記


2020年12月16日

_ PLCでmruby (3) mrbcコマンド

mrubyをPLCで動かせないかな〜という企画です。

前回はmrubyとmirbコマンドを使いましたが、今度はmrbcコマンドを使ってみます。

まずは簡単なmrubyプログラムa.rbを準備します。

a = 1

変数aに整数1を代入するだけのプログラムです。

mrbcコマンドでmrubyの中間表現のmrbファイルを生成します。

% mrbc a.rb

mrbファイルを見てみると何のことかさっぱりわかりません。 先行き不安です。

RITE0101ltUMATZ0000IREP&039gLVARaEN%

mrbのBオプションを使うとC言語でリンクできるバイト列の配列を生成します。

% mrbc -Bcodes a.rb

codes配列のデータはバイト列っぽいですね、これだけ見てもやっぱりさっぱりわかりません。

#include <stdint.h>
#ifdef __cplusplus
extern const uint8_t codes[];
#endif
const uint8_t codes[] = {
0x52,0x49,0x54,0x45,0x30,0x31,0x30,0x31,0x6c,0x74,0x00,0x00,0x00,0x55,0x4d,0x41,
0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0x26,0x30,0x33,
0x30,0x30,0x00,0x00,0x00,0x1a,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x08,
0x08,0x02,0x01,0x01,0x02,0x39,0x02,0x67,0x00,0x00,0x00,0x00,0x4c,0x56,0x41,0x52,
0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x01,0x61,0x00,0x00,0x45,0x4e,0x44,
0x00,0x00,0x00,0x00,0x08,
};

mrbcにverboseオプションを付けて実行してみます。

% mrbc --verbose a.rb
00001 NODE_SCOPE:
00001   local variables:
00001     a
00001   NODE_BEGIN:
00001     NODE_ASGN:
00001       lhs:
00001         NODE_LVAR a
00001       rhs:
00001         NODE_INT 1 base 10
irep 0x7f897b4059c0 nregs=3 nlocals=2 pools=0 syms=0 reps=0 iseq=8
local variable names:
  R1:a
file: a.rb
    1 000 OP_LOADI_1	R2		
    1 002 OP_MOVE	R1	R2		; R1:a
    1 005 OP_RETURN	R2		
    1 007 OP_STOP

なんかアセンブリ言語の様な出力が出てきました。 これなら何とか読んでいけそうな気がします。

つづく


Amazon | レトロアーケード <スペースインベーダー> | その他のゲーム機種本体全般