Malbolgeの高級アセンブリ言語への加算命令の追加

1
日本ソフトウェア科学会第 28 回大会 (2011 年度) 講演論文集
Malbolge の高級アセンブリ言語への加算命令の追加
安藤 聡 酒井 正彦 坂部 俊樹 草刈 圭一朗 西田 直樹
Malbolge は最も 難解な プロ グ ラ ミ ン グ 言語の一つと し て 知ら れて おり , その難解性から Malbolge を 用いて プ
ロ グ ラ ミ ン グ を 行う こ と 自体がプロ グ ラ ム 難読化になり 得る こ と が飯澤ら によ っ て提案さ れた. その中で, Malbolge
プロ グ ラ ミ ン グ を よ り 効率よ く 行う ための高級ア セン ブリ 言語が設計さ れたが, 高級ア セン ブリ 言語の算術命令には
イ ン ク リ メ ン ト と デク リ メ ン ト し か存在せず, 加算を 行う にはイ ン ク リ メ ン ト を 繰り 返し 用いる 必要があ っ た. 本論
文では, 高級ア セン ブリ 言語への加算命令の追加を 行う . こ れを 処理する ために, Malbolge 向き の加算ア ルゴ リ ズ
ム が何かを 考え , そのア ルゴ リ ズム を 低級ア セン ブリ 言語で実装する .
1 はじめに
作成し た プロ グ ラ ム を 不特定多数のユーザーに配
布する 場合, プロ グ ラ ム の改ざ ん防止やア ルゴ リ ズ
(=<‘$9]7<5YXz7wT.3,+O/o’K%$H"’~D|#z@b=‘{^Lx8%$X
mrkpohm-kNi;gsedcba‘_^]\[ZYXWVUTSRQPONMLKJIHGFE
DCBA@?>=<;:9876543s+O<oLm
図1
HEllO WORld 出力プログラム
ム な ど の知的財産の保護を 目的と し て , プロ グ ラ ム
の内部を 解析困難にする よ う に求めら れる 場合があ
る . そのよ う な場合には, プロ グ ラ ム を 解析が困難に
な る よ う に変換する 手法が有用であ る と 考え ら れる .
こ のよ う な同一言語上のプロ グ ラ ム の等価変換は, こ
れま でプログラム難読化と 呼ばれている [1].
こ れに対し , 難解プロ グ ラ ミ ン グ 言語を 用いて プ
れている Malbolge [3] が用いら れている .
本研究の目的は, 飯澤ら の成果を 基に Malbolge プ
ロ グ ラ ミ ン グ を さ ら に容易にする こ と であ る .
Malbolge は, その難解性から プロ グ ラ ム の解析だ
けでなく プロ グ ラ ム の作成さ え 非常に困難であ り ,
“人類が 設計し う る 最も 邪悪な 言語” な ど ど 称さ れ
ロ グ ラ ミ ン グ を 行う こ と がプロ グ ラ ム 難読化の手法
る . 図 1 に, Malbolge プロ グ ラ ム のサン プルと し て
の一つにな り え る こ と が飯澤ら によ り 提案さ れた [2].
“HEllO WORld” を 出力する プロ グ ラ ム ソ ース [4] を
難解プロ グ ラ ミ ン グ 言語( 以降, 難解言語) と は, 意
示す. Malbolge プロ グ ラ ミ ン グ を 困難にし ている 理
図的にその言語でのプロ グ ラ ミ ン グ が困難になる よ う
由と し ては, 次の三点が主に挙げら れる .
に設計さ れた言語であ り , こ のよ う な言語で書かれた
プロ グ ラ ム は解析困難性を も つため, ソ フ ト ウ ェ アプ
ロ テ ク ショ ン に関し て 有益であ る と 考え ら れて いる .
文献 [2] では, 難解言語の中でも 特に難解と し て 知ら
Introducing Addition Instruction into High-Level Assembly Language for Malbolge.
Satoshi Ando Masahiko Sakai Toshiki Sakabe Keiichirou Kusakari Naoki Nishida, 名古屋大学 大
学院情報科学研究科, Graduate School of Information
Science, Nagoya University.
• プロ グ ラ ム ロ ード 時のメ モリ の初期値に著し い
制約があ る
• 命令の強制的な 動的書き 換え によ り , コ ード の
反復実行が困難であ る
• 演算用・ 制御用と も に極めて 限定的な 命令し か
持たない
こ れら の各問題点に対し 飯澤ら は解決策を 提案し , そ
れに基づき Malbolge のための言語と し て, Malbolge
の演算命令を 拡張し た 疑似命令, ループプロ グ ラ ム
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
2
が作成可能な低級アセン ブリ 言語, なら びに, 低級ア
セ ン ブリ プロ グ ラ ム を 用いて 基本モジュ ール方式で
実現さ れる 高級ア セン ブリ 言語を 設計し た . し かし ,
const char xlat1[] =
"+b(29e*j1VMEKLyC})8&m#~W>qxdRp0w"
"krUo[D7,XTcA\"lI.v%{gJh4G\\-=O@5"
"‘_3i<?Z’;FNQuY]szf$!BS/|t:Pn6^Ha";
こ れら の言語の中で最も 命令が豊かであ る 高級ア セ
図2
ン ブリ 言語においても , 算術命令にはイ ン ク リ メ ン ト
と デク リ メ ン ト し か存在し ておら ず, こ れま で加算を
行う た めにはイ ン ク リ メ ン ト を 繰り 返し 用いら な け
ればなら なかっ た.
const char xlat2[] =
"5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+"
"Q;>U!pJS72FhOA1C"B6v^=I_0/8|jsb9"
"m<.TVac‘uY*MK’X~xDl}REokN:#?G\"i@";
本論文では, 高級アセン ブリ 言語へ加算命令を 追加
図3
し , 次のよ う に実現し た.
• 低級ア セン ブリ 言語での加算モジュ ールの作成.
変換表 xlat1
変換表 xlat2
Malbolge プロ グ ラ ム は 59048 文字未満の印字可能
こ れは飯澤ら の提案し た プロ グ ラ ミ ン グ 手法に
文字( ASCII 値:33 ∼126) の列であ り , ス ペース と
従い, 以下の順に行っ た
改行は無視さ れる . ま た , 各 p 文字目におけ る 印字
Step1 Malbolge 向き の加算ア ルゴ リ ズ ム の
検討
Step2 Step1 のアルゴ リ ズム の疑似命令列で
の実現
Step3 Step2 の疑似命令列の低級アセン ブリ
可能文字 c は, 変換表 xlat1[(c-33+p)%94)] によ る
解釈で i, j, p, *, /, <, v, o の 8 文字のいずれか
に該当せねばなら ず, それ以外の場合はロ ード 時にエ
ラ ーと な る . こ こ で xlat1 は図 2 のよ う に定義さ れ
ている . ま た実行ス テッ プ中に実行さ れた命令 c は,
プロ グ ラ ム へのコ ーディ ン グ
変換表 xlat2[c-33] によ っ て置換さ れ別の文字( 値)
• 加算モジュ ールを 用いた加算命令の実現
に書き 換え ら れる . こ こ で xlat2 は図 3 のよ う に定
本論文の構成も こ の過程の順に従い, 第 2 節で Mal-
bolge と 飯澤ら が設計し た 言語ついて 述べた のち に,
義さ れている .
Malbolge の 仮想機械はメ モ リ ( mem) と 3 つの
第 3 節で Step1 について , 第 4 節で上記の Step2 で
レ ジ ス タ ( コ ー ド ポ イ ン タ C, デ ー タ ポ イ ン タ
用いる , Malbolge プロ グ ラ ミ ン グ で重要と な る 二引
D, ア キ ュ ム レ ー タ A) を 持 ち , 1 ワ ー ド は 三 進
数三値関数を 実現する 疑似命令列の探索手法につい
数十桁( 10trits) で あ る た め メ モ リ 領域も 10trits
て, 第 5 節で Step2, Step3 について述べる . そし て
で 表現さ れる . こ の た め 値の 範囲は, 三進数表
第 6 節で作成し た 加算モジュ ールを 用いた 加算命令
現 で 0000000000t∼2222222222t, 十 進 数 表 現 で は
の実現について述べ, 最後に第 7 節で本論文で行っ た
0∼59048( = 310 − 1) と な る . こ こ で , 三進数表
こ と ・ 明ら かになっ たこ と を ま と める .
現の末尾に t を 用いている のは十進数と 区別する ため
であ る .
2 Malbolge とその関連する言語について
表 1 に Malbolge の各命令について の説明と そ の
本節では Malbolge の仕様についてその重要な部分
ニ ーモニッ ク 表記を 示す. こ れ以降では, Malbolge
を 説明する . ま た飯澤ら が設計し た Malbolge のため
の命令を 便宜的にニ ーモニッ ク 表記で記述する . こ
の言語であ る , 疑似命令, 低級アセン ブリ 言語, 高級
こ で, mem[p] は, ア ド レ ス p のメ モリ 値を 表し てい
ア セン ブリ 言語のそれぞれについて概説する .
る . OPR 命令の演算 op(X,Y ) は, 三進数で表さ れた
二引数 X = x1 x2 · · · x10 と Y = y1 y2 · · · y10 の各桁
2. 1 Malbolge
xi , yi 同士で表 2 に従っ て 計算を 行う . こ のよ う に
Malbolge [3] は仮想機械上で動作する 機械語と し
三進数で表さ れた二引数の各桁であ る 表に基づき 計算
て 定義さ れ, 開発者が C 言語で実装し た イ ン タ プリ
を 行う 関数を 二引数三値関数と 呼ぶ. 文献 [2] におい
タ によ っ てその意味が定めら れている .
て , op 関数を 合成する こ と によ っ て 任意の二引数三
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
表1
命令
i
j
p
*
/
<
o
v
ROT
OPR
OPR
OPR
OPR
Malbolge の命令とその説明
説明と ニーモニッ ク 表記
ジャ ン プ. C:=mem[D].’JMP’
D レ ジス タ の更新. D:=mem[D].’MOV D’
演算命令. A,mem[D]:=op(A,mem[D]).’OPR’
右ロ ーテート . A,mem[D]:=rotr(mem[D]).’ROT’
入力. A:=getchar().’INPUT’
出力. putchar(A).’OUTPUT’
無操作. 何も 行わない. ’NOP’
終了. プロ グ ラ ム の実行を 停止. ’HALT’
表2
op(X,Y ) の各桁の演算
0
1
1
2
0
1
2
yi
表3
xi
1
0
0
2
2
0
2
1
疑似命令
命令
操作
ROT X
OPR X
INPUT
OUTPUT
A,X := rotr(X)
A,X := op(A,X)
A := getchar()
putchar(A)
CON1
Y
Y
X
X
図4
表4
3
INPUT
OPR Y
OPR X
OUTPUT
疑似命令列の例
命令・フラグとその操作
命令
操作
ROT label
A,[label] := rotr([label])
REV ROT
ROT 命令の復元
OPR label
A,[label] := op(A,[label])
REV OPR
OPR 命令の復元
JMP label
PC:= [label] MOV PC label
PC:= [label]
REV MOV PC
MOV PC 命令の復元
INPUT UNIT
A:=getchr()
REV INPUT
INPUT 命令の復元
OUTPUT UNIT
putchr(A)
REV OUTPUT
OUTPUT 命令の復元
FLAG label
命令が MOV PC であ る 場合 (ON):MOV PC と 同様
命令が NOP であ る 場合 (OFF):何も し ない
命令実行後には FLAG がフ リ ッ プさ れる
FLAG+1
FLAG がフ リ ッ プさ れる (ON↔OFF)
の値を 出力する 疑似命令列を 示す. こ こ で, 各変数
X , Y の初期値は任意の値と する .
値関数を 実現でき る こ と が示さ れて いる . 以下に op
演算の例を 示す.
2. 3 低級アセンブリ言語
op(0120120120t, 0001112222t) = 1001022212t
低級アセンブリ言語 [2] は, 強制的な 命令の動的書
ROT 命令の演算子 rotr は引数の 10trits の値に対し て
き 換え によ り Malbolge で ループプロ グ ラ ム 作成が
右ロ ーテート を 行う . 以下に例を 示す.
困難と いう 問題を 解決する た めに設計さ れた 言語で
rotr(0001112222t) = 2000111222t
ある .
低級アセン ブリ 言語は Malbolge と 同じ メ モリ 空間
2. 2 疑似命令
を 持つ仮想機械と し て定義さ れる . レ ジス タ は PC と
疑似命令 [2] は, Malbolge の演算命令や入出力命令
A の 2 つを 持ち, 値は 10trits で表現さ れる . 低級ア
の表現を よ り わかり やすく し , 引数にメ モリ 名を 指定
セン ブリ プロ グ ラ ム は, メ モリ アド レ ス を 表すラ ベル
でき る よ う にし たも のであ る . 命令列の実行は逐次実
を 付加可能なデータ の列によ っ て定義さ れる . 各デー
行のみと し , 反復実行や条件分岐は考え ない.
タ は変数と 命令, およ びフ ラ グ のいずれかであ り 一行
表 3 に疑似命令と その操作について 示す. こ こ で,
で記述さ れる . 命令やフ ラ グ の引数にはラ ベルを 用
疑似命令列の引数に特別な 変数と し て CON 0( 初期
いる . 低級ア セン ブリ 言語の命令を 表 4 にま と めた .
値: 0000000000t) , CON 1( 初期値: 1111111111t) ,
ただし , [label] は label でラ ベル付けさ れたデータ を
CON 2( 初期値: 2222222222t) , P AT 20( 初期値:
表し ており , A は A レ ジス タ であ る .
2222222220t) を 利用でき る も のと する .
図 4 に例と し て, 入力さ れた値を X に代入し , そ
表 4 から 分かる よ う に, JMP を 除いた 各命令には
そ の復元命令が存在する . プロ グ ラ ム を 記述する 際
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
4
L1:
REV MOV PC
JMP
ENTRY:
CON1:
# (ラ ベル):(データ )
L2
ROT CON1
# エン ト リ ーラ ベル
1111111111t
# 三進数表現の定数
PROGRAM INIT:
Loop:
INPUT Var X
MOV Var X,Var Y
INC Var Y
BRANCH Var Y,Var Exit
OUTPUT Var X
BRANCH Zero,Var Loop
STOP
REV ROT
L2:
OPR Y
Y:
0
# 十進数表現の定数
Exit:
REV OPR
FLAG2+1
FLAG2
L3
FLAG1
L2
L3:
OPR X
X:
0
表5
命令と操作
操作
FLAG2+1
INC label
[label] := [label]+1
FLAG2
L6
DEC label
[label] := [label]−1
L3
MOV label1,label2
[label2] := [label1] INPUT UNIT
BRANCH
[label1]= 0 の時,IP:=[label2]
DUP
label1,label2
それ以外の場合何も し ない
REV INPUT
INPUT label
[label]:=getchr()
FLAG2+1
OUTPUT label
putchr([label])
MOV PC L1
MASK label1,label2
[label2]:=mask([lable1],[label2])
OUTPUT UNIT
ROTATE label
[label]:=rotr([label])
DUP
STOP
実行の停止
FLAG1
L6:
高級アセンブリプログラムの例
命令
REV OPR
L4:
図6
REV OUTPUT
RETURN:
図5
END
表6
図 4 の低級アセンブリプログラム
関数 mask(X,Y ) の表
には, プロ グ ラ ム 実行時にあ る 命令が実行さ れた 後
そ の命令の復元命令が実行さ れる よ う にする 必要が
yi
あ る . フラグはフ リ ッ プフ ロ ッ プの役割を 果たし てお
0
1
2
0
0
2
0
xi
1
0
0
1
2
0
1
2
り , こ れによ っ て実行を 制御する . 変数の値には, 定
数と し て十進数( 0∼59048) と 三進数( 0000000000t
と いう ラ ベルはエン ト リ ーポイ ン ト を 表す. 命令の引
∼2222222222t) が利用でき , 特別な 定数と し て 任意
数には変数かラ ベルを 用いる . 例と し て 図 6 に高級
の定数を 表す DUP が利用でき る .
アセン ブリ プロ グ ラ ム の例を 示す. こ れは, 標準入力
図 5 に, 図 4 の疑似命令列を 低級ア セン ブリ プロ
によ り 入力さ れた 文字を 標準出力する プロ グ ラ ム で
グラ ム に変換し た例を 示す. ただし , こ こ で, “#” か
あ り , EOF( =59048) が入力さ れる ま で繰り 返し 実
ら 改行ま でを コ メ ン ト と し , “ENTRY” を PC の初期
行さ れる . こ こ でプロ グ ラ ム 中の変数 Zero は 0 を 表
値を 表すエン ト リ ーラ ベルと する .
し ている .
高級アセン ブリ プロ グラ ム 内の記述で使用でき る 命
2. 4 高級アセンブリ言語
令を 表 5 にま と めた . INC 命令の引数の値が 59048
高級アセンブリ言語 [2] は Malbolge プロ グ ラ ミ ン
のと き の演算結果は 0, DEC 命令の引数の値が 0 のと
グ を よ り 容易にする こ と を 目的と し て 設計さ れた 言
き の演算結果は 59048 と する . MASK 命令で使用する
語であ る . こ のため, 値の取る 範囲は 10trits であ る .
関数 mask(X,Y ) は表 6 に従い計算を 行う 二引数三値
高級ア セ ン ブリ プロ グ ラ ム は, ア ド レ ス を 表す省
略可能な ラ ベルがついた 命令「( ラ ベル名) :( 命令)
( 引数) 」 の列で定義さ れる . 特に “PROGRAM INIT”
関数であ る . IP については第 2. 5 節で説明する .
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
メ イ ン ルーチン
モジュ ール 2 呼び出し
引数ラ ベル
引数ラ ベル
モジュ ール 1 呼び出し
引数ラ ベル
モジュ ール 3 呼び出し
引数ラ ベル
引数ラ ベル
.
.
.
図7
表7
基本モジュ ール群
モジュ ール 1
モジュ ール 2
モジュ ール 3
モジュ ール 4
.
.
.
基本モジュール方式
yi
5
sum(X,Y ) の表
0
1
2
0
0
1
2
xi
1
1
2
0
2
2
0
1
ブリ プロ グ ラ ム への変換は実現さ れておら ず, ノ ウ ハ
ウ を 用いて手変換する 必要があ る .
2. 5 高級アセンブリプログラムの実現
3 Malbolge 向けの加算アルゴリズム
高級ア セ ン ブリ プロ グ ラ ム は, 基本モジュ ール方
こ れま で Malbolge における 加算はイ ン ク リ メ ン ト
式 [6] を 利用し て 低級ア セン ブリ プロ グ ラ ム で実現さ
を 用いて のみ実現さ れて いた . し かし n1 < n2 の加
れている [2] [5]. こ れは, あ る 仮想マシン を Malbolge
算 n1 + n2 を 考え た と き に, そ の実現方法ではイ ン
上に実装し ており , その仮想マシン はプロ グ ラ ム カ ウ
ク リ メ ン ト を n1 回繰り 替えさ なければなら ず, n1 が
ン タ IP と レ ジ ス タ REG0, REG1 を 持つ. レ ジ ス
非常に大き な数であ っ た場合効率が悪い.
タ や IP は低級ア セン ブリ プロ グ ラ ム の特定の変数で
そこ で, 本節では Malbolge で効率よ く 加算を 実現
あ る ため, 低級ア セン ブリ 言語のレ ジス タ ( A, PC)
する ためのア ルゴ リ ズ ム を 検討する . Malbolge の仕
と は異なる . こ の低級アセン ブリ プロ グ ラ ム を 高級ア
様よ り , こ こ で扱う 値はすべて 10trits で表現でき る
センブリ言語の実行系と 呼ぶ.
値と する .
高級ア セン ブリ プロ グ ラ ム の実現に用いた 基本モ
ジュール方式と は, プロ グ ラ ミ ン グ を 容易にする こ と
3. 1 問題点と解決策
を 目的と し て定義さ れたも ので, 基本モジュ ールと 呼
こ れま で Malbolge で加算が実現さ れていなかっ た
ばれる あ る 機能を 持た せた 命令列と , そ れら を サブ
理由に, 利用可能な演算命令が限定さ れている こ と が
ルーチン コ ールのよ う に呼び出すメ イ ン ルーチン で
挙げら れる . 第 2. 1 節でも 述べたよ う に Malbolge の
構成さ れる ( 図 7) . 高級ア セン ブリ プロ グ ラ ム はこ
演算命令は OPR と ROT の二つのみであ り , OPR は表 2
のメ イ ン ルーチン にあ たり , 高級アセン ブリ 言語の各
の op 演算を 桁毎に行う 命令で, ROT は右ロ ーテート
命令と 同じ 機能を 持つ低級ア セン ブリ プロ グ ラ ム を
命令であ る . こ れら の命令を 用いて 実現する 演算は,
基本モジュ ールと し て呼び出し ている .
すべて の桁を 平等に扱う も の以外非常に困難であ り ,
ど のよ う に加算の桁上げを 行う かが問題であ っ た.
2. 6 言語間の関係
こ れま でに述べて き た 言語について , 高級ア セ ン
その解決策と し て, 二つの二引数三値関数を 用いて
それぞれが桁を 特別扱いし ない加算を 用いる .
ブリ プロ グ ラ ム から 低級ア セン ブリ プロ グ ラ ム に変
換する 手法 [2] [5] と 低級ア セ ン ブ リ プ ロ グ ラ ム か ら
3. 2 加算アルゴリズム
Malbolge プロ グ ラ ム に変換する 手法 [2] が提案さ れ
二つの二引数三値関数を 用いた 加算ア ルゴ リ ズ ム
ている . 後者の変換を 行う ア セン ブラ [2] が存在する .
を 述べる . こ こ で二つの関数と は, 入力の二数に対し
ただし こ の低級アセンブラは, 入力プロ グ ラ ム に合わ
桁上げを 考えない加算を 行う 関数 sum( 表 7) と , 入
せて エン ト リ ーラ ベルのア ド レ ス 値の指定やデータ
力の二数の加算に関する 桁上げのみの計算を 行う 関
のメ モリ 領域の指定を 低級ア セン ブラ のソ ース コ ー
数 carry( 表 8) であ る .
ド に記述する 必要があ る . 疑似命令列から 低級アセン
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
6
表8
yi
carry(X,Y ) の表
0
1
2
0
0
0
0
xi
1
0
0
1
表9
ス テッ プ
X
sum(X,Y )
Y
carry(X,Y )
1
0120120120t
0121202010t
0121202010t
0121000110t
0121000110t
0122010110t
0122010110t
0122010110t
..
.
0122010110t
0122010110t
0001112220t
0000010110t
0000101100t
0000101000t
0001010000t
0000000000t
0000000000t
0000000000t
..
.
0000000000t
0000000000t
2
0
1
1
2
3
入力 10trits で表さ れる 二つの値
出力 入力の二数を 足し 合わせた数
アルゴリズム
1. 入力の二数を 変数 X , Y に入れる
加算アルゴリズムの実行例 1
4
..
.
10
2. X , Y に対し て関数 sum の演算を 行う
3. X , Y に対し て関数 carry の演算を 行う
59048( =2222222222t) と 2( =0000000002t) の加
4. 2 の演算結果を X にコ ピ ーする
算には, 10 ス テッ プが必要であ る . 正し い加算結果
5. 3 の演算結果を 左に 1trit シフ ト し , 最下位
は 59050( =10000000001t) である が, アルゴ リ ズム
trit を 0 ク リ ア の後, Y にコ ピ ーする
6. 2 から 5 を 10 回繰り 返す
の仕様に沿っ て計算結果はオーバーフ ロ ーを 切り 捨て
た値 1( =0000000001t) であ る .
7. X を 出力する
ア ルゴ リ ズ ム の実行例を 表 9 に示す. 表の値はア
ルゴ リ ズ ム の繰り 返し 開始時の X , Y の値と , その
4 二引数三値関数を実現する疑似命令列の探
索手法
X , Y に対し て 関数 sum と 関数 carry の演算を 行っ
第 3 節で提案し た ア ルゴ リ ズ ム を 疑似命令列で実
た結果の値である . こ の例は 11355( =0120120120t)
現する 上で, アルゴ リ ズム で用いる 二つの二引数三値
と 1131( =0001112220t) の 加算を 行っ て おり , 計
関数 sum, carry を 実現する 疑似命令列を 見つける 必
算結果は 10 ス テッ プ 目の sum(X,Y ) の値で 12486
要があ る .
( =0122010110t) と なり 加算と し て正し い結果と なっ
そこ で本節では, 単純な三値関数であ る 二引数三値
て い る . こ の 例で は 3 ス テッ プ が 終了し た 時点で
関数を 実現する 疑似命令列の探索法について 述べる .
carry(X,Y ) の 値が 0 に なっ て おり , そ れ以降の ス
こ こ で, あ る 二引数三値関数 f を 疑似命令列 I が実
テッ プは X に 0 を 足す操作の繰り 返し と なっ ている .
ア ルゴ リ ズ ム の仕様と し て , 桁上げによ っ て オー
バーフ ロ ーが発生し た場合, 桁上げを 計算し 左に 1trit
現する と は, 入力を X , Y と し 出力を A レ ジス タ と
し た と き , 疑似命令列 I を 実行し た 直後の A レ ジ ス
タ の値が f (X,Y ) と なる こ と であ る .
ずら し た 後に 最下位 tirt を 0 ク リ ア し て いる の で ,
第 4. 1 節で任意の二引数三値関数が疑似命令列で
オーバーフ ロ ー分の最上位 trit が切り 捨て ら れた 値
実現でき る こ と を 示す. その後に, 第 4. 2 節で二引数
が出力と なる .
三値関数を よ り 少な い命令数で実現する 疑似命令列
ま た ア ルゴ リ ズ ム が一定時間で停止する 理由と し
て, こ のア ルゴ リ ズム で扱う 値は 10tirts で表現でき
を 探索する ア ルゴ リ ズ ム を 示し , 第 4. 3 節でそ れを
実装し たプロ グ ラ ム の評価を 行う .
る 数であ る ので, ど れだけ桁上げが発生し たと し ても
最大 10 回で収ま る . そのためア ルゴ リ ズム の繰り 返
4. 1 二引数三値関数の疑似命令列での実現
し を 10 回にする こ と によ り 必ず計算は終了する ので,
こ こ では, 任意の二引数三値関数を 疑似命令列で実
イ ン ク リ メ ン ト のよ う に計算量が増え る こ と はな い.
例と し て , 最も 桁上がり が発生する 例の一つであ る
現でき る こ と を 示す.
第 2 節で紹介し た よ う に, OPR 命令に用いら れる
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
表 10
インクリメント用の関数 inc(X,Y )
yi
0
1
2
0
0
1
1
xi
1
1
2
2
ROT
OPR
OPR
OPR
OPR
ROT
2
2
0
0
CON1
Z
Z
Y
Y
CON2
図8
OPR
ROT
OPR
OPR
OPR
7
ROT
OPR
ROT
OPR
X
CON2
X
Z
Y
変数コピー
図9
CON2
X
CON2
X
A レジスタへのロード
op 関数を 合成する こ と によ り 任意の二引数三値関数
が実現でき る こ と がすでに文献 [2] で示さ れて いる .
ま た, その調査に用いら れた op 関数合成プロ グ ラ ム
を 利用する こ と で, 特定の二引数三値関数を 実現する
op 関数の合成を 知る こ と ができ る . 例えば, 表 10 に
対し op 関数合成プロ グ ラ ム を 用いる と , 以下の式で
表 10 を 実現でき る こ と が分かる .
op(op(op(X,CON0),op(CON2,op(Y,CON0))),op(CON2,X))
こ のよ う な式を シス テマティ ッ ク に疑似命令列に変
ROT
OPR
ROT
OPR
OPR
ROT
OPR
ROT
CON2
Y
CON2
Y
S
CON2
S
CON2
OPR
ROT
OPR
OPR
OPR
ROT
OPR
ROT
図 10
X
CON2
X
CON0
S
CON2
X
CON2
OPR
ROT
OPR
OPR
S
CON2
S
X
表 10 を実現する疑似命令列
換する こ と が出来れば, 任意の二引数三値関数を 疑似
ROT
OPR
OPR
ROT
OPR
命令列で実現でき る こ と がいえ る .
こ の変換で問題と なっ て く る のが, OPR 命令が A
レ ジ ス タ の値と 変数 X の値について op 演算を 行い,
その結果を A レ ジス タ と X に代入し ている こ と であ
る . こ の破壊代入と も 呼べる 操作によ り OPR 命令の
引数であ る X は上書き さ れてし ま い, X の値を 繰り
返し 用いる こ と ができ ない. ま た OPR 命令は op 演算
の第一引数に A レ ジ ス タ を と っ て いる ので, 上記の
式のよ う に直接変数を 第一引数に指定する こ と がで
き ない.
こ れら の問題の解決策と し て, 次の手法を 提案する .
• op 関数合成プロ グ ラ ム によ っ て得ら れた式で複
数の op 演算の第二引数が同じ 変数であ っ た場合
あ ら かじ め必要な 数だけ そ の変数の値を 別の変
数にコ ピ ーし ておく
• op 演算の第一引数が変数であ っ た場合はその変
数の値を A レ ジス タ へロ ード する 操作を 行う
変数コ ピ ーと A レ ジ ス タ へのロ ード は, それぞれ図
8, 図 9 の疑似命令列で行う こ と ができ る . こ こ で,
変数コ ピ ーの疑似命令列で Z は作業用変数で あ り ,
図 11
CON2
Y
S
CON2
S
ROT
OPR
OPR
OPR
OPR
CON2
X
CON0
S
X
表 10 を実現するより短い疑似命令列
提案手法によ り , op 関数合成プロ グ ラ ム で得ら れ
る 式を すべてシス テマティ ッ ク に疑似命令列に変換す
る こ と ができ る . 提案手法を 用いて表 10 を 実現する
式を 疑似命令列に変換し たも のを 図 10 に示す. こ こ
で変数 S の初期値は CON0 と する .
以上によ り , 任意の二引数三値関数を 疑似命令列で
実現でき る こ と がいえ た.
し かし , こ の手法で見つけら れる 疑似命令列は必ず
し も 最短のも のと は限ら ない. たと え op 関数合成プ
ロ グ ラ ム によ り 得ら れる 式が最短であ っ た と し て も ,
特定の二引数三値関数を 実現する op 関数の合成は複
数存在する . 実際, 表 10 は図 11 の疑似命令列でも 実
現でき る . こ こ で変数 S の初期値は CON0 と する .
Malbolge のメ モリ は固定であ る ため, でき る だけメ
モリ を 節約する こ と を 考えなければなら ず, 二引数三
X がコ ピ ー元の変数, Y がコ ピ ー先の変数で あ る .
値関数を 疑似命令列で実現する 場合にはよ り 少な い
変数 Y , Z の初期値は任意であ る . A レ ジ ス タ への
命令数のも のを 用いる こ と が望ま し い.
ロ ード の疑似命令列は, 変数 X の値が A レ ジス タ へ
ロ ード さ れる .
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
8
4. 2 疑似命令列探索のアルゴリズム
表 11
任意の二引数三値関数を よ り 短い命令数で実現す
1 クリアの関数 1clear(X,Y ) の表
る 疑似命令列を 網羅的に探索する ア ルゴ リ ズ ム を 述
べる .
yi
ま ず次を 定義する .
0
1
2
0
1
1
1
xi
1
1
1
1
2
1
1
1
INS(I) {ROT CON 0, ROT CON 1, ROT CON 2,
OPR X, OPR Y , OPR Ai | 0 ≤ i ≤ I }
ただし , 変数 X , Y は入力で, 変数 Ai の初期値
は CON 0, CON 1, CON 2 のいずれか
疑似命令 x ∈INS(I)
4. 3. 2 節で作成し たプロ グ ラ ム の評価実験を 行う .
4. 3. 1 実装
前節で提案し た ア ルゴ リ ズ ム の実装では, プロ グ
疑似命令列 α ∈(INS(I))*
ラ ム 内で X , Y の初期値を 012012012t, 000111222t
疑似命令列の長さ |α|
と する こ と によ り , 表の全て の場合の判定を 一度に
命令の連接 α :: x
行っ て いる . プロ グ ラ ム 内の値は 9trits 表現であ る
上記の定義を 用いる と , 疑似命令列探索のアルゴ リ
が, それは二引数三値関数を 表現する のには九つの組
み合わせで十分であ り , 最上位( 最下位) の 1trit を
ズム は以下のよ う に記述でき る .
入力 二引数三値関数の表 table, 疑似命令列の長
効率のため省略し ている ためであ る . ま た, 入力の条
さ の上限値 LM , 使用する 変数の数 (X , Y を 除
件を みた す疑似命令列を すべて 出力する よ う に実装
く )N , 空の疑似命令列 α
し た.
出力 Success(α′ ) か Fail. α′ は入力の二引数三値
関数を 入力の条件下で実現する 疑似命令列.
アルゴリズム
実装し たプロ グ ラ ム は, 深さ 優先探索に従っ て疑似
命令列の探索を 行う . ただし , ヒ ュ ーリ ス ティ ク ス を
導入し , あ る 程度の枝刈り を 行う こ と で効率化を 図っ
ている . 枝刈り は次の方法で行っ た.
Search(table, LM, N, α) =
1. if |α| > LM then return Fail else
1. 最初の命令は ROT に限定する
2. if check(α,table) then return Success(α)
2. ROT は連続し ない
1 に限定する のは, OPR は引数に A レ ジ ス タ の値を
else
と る ため最初の命令と し ては使えないから であ る . ま
3. foreach x ∈ INS(N ) do
た 2 は, ROT が連続し た場合, 後に行っ た命令だけ実
′
let α = α :: x
′
Result = Search(table, LM, N, α )
in if Result == Success(α′ ) then return
′
Success(α ) else continue end
行する 場合と 実行結果が変わら ないためであ る .
プロ グ ラ ム の動作例と し て, 入力を 1clear( X,Y )
の関数表 (表 11) と 疑似命令列の長さ の上限値 3, 使
補助関数 check(α,table) は受け 取っ た 疑似命令列が
用する 変数を 3 つと し た と き , プロ グ ラ ム の出力結
table の関数を 実現し て いる かを 調べ, 実現し て る 場
果は長さ 1 の疑似命令列が 1 個, 長さ 2 のも の 3 個,
合は True を , そう でな い場合は False を 返す. 入力
長さ 3 のも のが 32 個と なる . 長さ 1 のも のは CON 1
と し て表 table’ と 疑似命令列 α が与えら れたと き の
を ROT し たも のであ る .
′
判定方法は, 疑似命令列 α′ を 実行し た後の A レ ジス
4. 3. 2 評価
タ が table’(X,Y ) と 等し いかど う かであ る .
作成し た 疑似命令列探索プ ロ グ ラ ム の 評価の た
め , い く つか の 二引数三値関数を プ ロ グ ラ ム に あ
4. 3 疑似命令列探索プログラム
た え , 各関数を 実現する 最短の 疑似命令列の 長さ
第 4. 2 節で 示し た ア ル ゴ リ ズ ム を 実装する . 第
と そ の 長さ の 疑似命令列の 種類の 数, な ら びに 探
4. 3. 1 節では実装の際に行っ た工夫について述べ, 第
索 に か かっ た 時 間 を 表 12 に ま と め た . な お , 使
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
表 12
プログラムの評価実験結果
関数
0clear
1clear(表 11)
inc(表 10)
sum
carry
命令長
個数
時間 (sec)
2
3
0
2
3
0
10
4
465
T.O.
9
6
44
T.O. タ イ ム ア ウ ト 5400 秒
9
6. 4 の計算結果を 左に 1trit シフ ト し , 最下位 trit
を 0 ク リ ア の後, Y1 にコ ピ ーする
7. 1 から 6 ま でで使用し た 作業用変数を 初期値に
復元する
こ のモジュ ール群の内, 変数コ ピ ーモジュ ールと 0 ク
リ アモジュ ール, 変数復元モジュ ールは既に飯澤ら に
よ っ て実現さ れており , 左シフ ト も 右ロ ーテート を 9
回行う こ と で容易に実現でき る . 本研究で新たに実現
用する 変数は 3 つと し , 関数 0clear と 関数 1clear
する のは, 桁上げを 考え な い加算を 行う 関数 sum の
に お い て そ れ ぞ れ ROT 命 令 一 つ で の 実 現 は 除 い
疑似命令列と 桁上げのみを 計算する 関数 carry の疑似
て い る . 処 理 時 間 の 計 測 に は getrusage 関 数 を 用
命令列であ る . ど ち ら の関数も 二引数三値関数であ
い て , 実験は CPU Xeon W5590 (3.33GHz/4core
り , そのよ う な関数を 実現する 疑似命令列を 発見する
8thread/L2cache 4*256KB/L3cache 8MB) デュ ア
手法と し ては, 次の二つがあ る .
ル, メ モリ 48GB の計算サーバ上で行っ た.
関数 sum に関し て, こ のタ イ ム ア ウ ト では長さ 11
の場合ま での探索が可能であ り , こ の条件下では長さ
11 以下で関数 sum を 実現する 疑似命令列が存在し な
いこ と が確かめら れた.
• 既存の疑似命令列や, Malbolge 特有の op 関数
の性質から ノ ウ ハウ によ り 見つける
• 第 4 章で作成し た 疑似命令列探索プロ グ ラ ム を
利用する
関数 sum の 疑似命令列は前者の 手法に よ り , 関数
carry の疑似命令列は後者の手法によ り 発見し た.
5 加算を実現する低級アセンブリプログラム
の実装
本節では, 第 3 節で提案し た加算アルゴ リ ズム を 低
5. 2 加算アルゴリズムの低級アセンブリ言語での
実装
級ア セン ブリ プロ グ ラ ム と し て実装する . ま ず第 5. 1
第 5. 1 節で作成し た 疑似命令列を 参考に, 今度は
節で疑似命令列で実現し , そ れから 第 5. 2 節で低級
以下の方針に従い, 第 3 節の加算ア ルゴ リ ズ ム を 低
ア セン ブリ プロ グ ラ ム に実装する . そ し て 第 5. 3 節
級アセン ブリ 言語で実装し た. 以降, こ のプロ グ ラ ム
で, 従来のイ ン ク リ メ ン ト を 用いた加算と の比較評価
を 加算モジュールと 呼ぶ.
を 行う .
• メ モリ を 節約する た めにでき る だけ 使用する フ
ラ グ の数を 減ら す
5. 1 加算アルゴリズムの疑似命令列での実現
• 第 5. 1 節の疑似命令列のモジュ ール毎に, 低級
第 3 節で提案し た 加算ア ルゴ リ ズ ム を 低級ア セン
ア セ ン ブリ プロ グ ラ ム でも モジュ ールを 記述す
ブリ 言語で実装する にあ たり , 直接アルゴ リ ズム から
る . ただし 一部に命令数を 減ら す工夫を し ている
低級ア セン ブリ 言語で実装する のは困難であ る ので,
プロ グ ラ ム 作成には長坂ら の開発し た Malbolge デ
ま ず加算ア ルゴ リ ズム を 疑似命令列で実現する .
バッ ガ・ 低級ア セン ブリ デバッ ガを 利用し た [5].
加算アルゴ リ ズム は疑似命令列で実現する 上で, 以
下のモジュ ールに分割でき る .
1. 入力 X1 を X2 にコ ピ ーする
2. 入力 Y1 を Y2 にコ ピ ーする
3. sum(X1 ,Y1 ) を 行う
5. 3 効率の評価
本研究で実現し た加算と , 従来のイ ン ク リ メ ン ト を
用いて実現し た加算の効率の評価を 行う .
ま ず理論的な 評価を 行う . 評価対象は, そ れぞれ
4. carry(X2 ,Y2 ) を 行う
の加算の実現に用いら れる 疑似命令列のス テッ プ数
5. 3 の計算結果を X1 にコ ピ ーする
と する . 従来の加算を 実現する ス テッ プ数は, n を
10
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
加算に必要な イ ン ク リ メ ン ト の数と する と , 全体で
0.03
addtion by increment
addtion
upgrade addtion
143n − 10 ス テッ プであ る . 本研究で実現し た加算の
0.025
ス テッ プ数は 637 ス テッ プ. よ っ て理論的にはイ ン ク
リ メ ン ト が 5 回以上必要な 加算において , 本研究で
果が得ら れた.
上記の評価は定量的に行っ ている が定性的にも 比較
を 行う こ と ができ る . その場合, 入力さ れる 値は m
trits で表現さ れる も のと 仮定し , 評価を 行う . こ の
time(sec)
実現し た 加算の方が効率よ く 計算を 行え る と いう 結
0.02
0.015
0.01
0.005
0
0
50
100
場合, 本研究で実現し た加算の計算量は桁数に比例す
る こ と にな る ので O(m) と な る . 一方, 従来の加算
の計算量は桁数に依存する こ と に加え , 最悪の場合
イ ン ク リ メ ン ト を 3m /2 回繰り 返す必要があ る ので,
O(3m ) と な る . よ っ て , 定性的な 評価において も 本
研究で実現し た加算の方が優れている と いえ る .
次に実験的な 評価を 行う . 従来のイ ン ク リ メ ン ト
図 12
表 13
総ス テッ プ数
使用フ ラ グ 数
150
inc_size
200
250
300
比較実験結果
実装の改善
改善前
改善後
10809
9
4324
16
を 用いた加算の Malbolge プロ グ ラ ム で必要なイ ン ク
リ メ ン ト の回数 inc size を パラ メ ータ と し て , Mal-
プロ グ ラ ム の実行制御命令が含ま れる . そ のこ と に
bolge イ ン タ プ リ タ 上で の処理時間を 比較し た . 以
よ り 演算命令と 演算命令の間での実行制御にかかる
降, 比較する プロ グ ラ ム を そ れぞれ本研究のプロ グ
時間分の遅延が, 理論と 実験の結果の差になっ ている
ラ ム , 従来のプロ グ ラ ム と 呼ぶ. それぞれプロ グ ラ ム
のだと 思われる . 低級ア セン ブリ プロ グ ラ ム の実装
は低級ア セン ブリ プロ グ ラ ム から 低級ア セン ブラ で
の改善によ り , こ の差は縮めら れる のではないかと 考
Malbolge コ ード に変換し たも のであ る . 処理時間の
え, 低級アセン ブリ プロ グ ラ ム での実行ス テッ プ数を
計測には getrusage 関数を 用いて, 5 回の計測の平均
減ら す方針で同一の疑似命令列を 再実装し た . 改善
値を 結果と し た. 計測し た inc size の値は 1, 3, 10,
前と 改善後の低級ア セン ブリ プロ グ ラ ム のそ れぞれ
30, 100, 300 で, 実験は CPU Athlon 64 X2 4800+
の総ス テッ プ数, 使用フ ラ グ 数は表 13 のよ う になっ
(2.4GHz/L2cache 2*1MB), メ モリ 4GB の計算サー
た. 改善後のプロ グ ラ ム ( upgrade addition) では,
バ上で行っ た.
その結果が図 12 であ る . 従来のプロ グ ラ ム( addi-
inc size が 10 以上の場合にイ ン ク リ メ ン ト を 用いた
加算のプロ グ ラ ム よ り 速いと いう 結果が得ら れ( 図
tion by increment) では inc size が増え る に従っ て
12) , 実装の改善によ り 理論的な値に近づける と いう
処理時間も 長く な る のに対し , 本研究のプロ グ ラ ム
こ と が実験的に確かめら れた.
( addition) はほぼ一定の時間で計算を 終え る こ と が
出来た . た だし , 理論上では inc size が 5 以上であ
6 高級アセンブリ言語への加算命令の追加
れば本研究のプロ グ ラ ム の方が速く 計算でき る はず
本節では, 第 5 節で作成し た加算モジュ ールを 利用
であ る が, 実験では inc size が 43 以上の場合に本研
し , 高級アセン ブリ 言語への加算命令の追加方針を 提
究のプロ グ ラ ム の方が速いと いう 結果が得ら れた.
案し , その方針に基づき 実際に追加を 行う .
原因と し ては, 疑似命令列と 低級アセン ブリ プロ グ
ラ ム の実現手法の違いが挙げら れる . 疑似命令列がプ
ロ グ ラ ム の本質であ る 演算命令のみで構成さ れて い
る のに対し , 低級アセン ブリ プロ グ ラ ム での実装には
6. 1 高級アセンブリ言語の加算命令
本節で追加を 考え る 高級ア セン ブリ 言語の加算命
令は, 次の仕様と する .
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
表 14
基本モジュール一覧
番号
モジュ ール名
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
イ ン ク リ メ ン ト モジュ ール
デク リ メ ン ト 及び条件分岐モジュ ール
変数コ ピ ーモジュ ール
マス ク モジュ ール
入力モジュ ール
出力モジュ ール
停止モジュ ール
IP に関する モジュ ール
REG0,REG1 に関する モジュ ール
• 加算命令 “ADD X,Y ”
表 15
11
命令と基本モジュールとの関係
命令
イ ン ク リ メ ン ト 命令
デク リ メ ン ト 命令
変数コ ピ ー命令
条件分岐命令
マス ク 命令
ロ ーテート 命令
入力命令
出力命令
停止命令
必要な基本モジュ ール
(1),(3),(8),(9)
(1),(2),(3),(8),(9)
(1),(3),(8),(9)
(1),(2),(3),(8),(9)
(1),(3),(4),(8),(9)
(1),(3),(8),(9)
(1),(3),(5),(8),(9)
(1),(3),(6),(8),(9)
(7)
ト する ためであ る . ま た (3) と (9) のモジュ ールが使
Y := X + Y を 計算する . た だし , オーバーフ
われている のは, 引数を と る 命令の場合, ま ず引数の
ロ ーが発生し た 場合, 正し い計算結果の最上位
値を レ ジス タ REG0,REG1 にコ ピ ーし , そし て各レ
trit を 切り 捨てた値を Y に代入する .
ジス タ に対し て命令に対応する 操作を 行っ たあ と , 必
要な ら ば REG0,REG1 の値を 引数の変数や IP にコ
6. 2 高級アセンブリ言語への加算命令の追加方針
第 2 節でも 述べた よ う に, 高級ア セン ブリ プロ グ
ラ ム は基本モジュ ール方式を 利用し て低級アセン ブリ
ピ ーする と いう 仕様になっ ている ためであ る .
以上よ り , 高級アセン ブリ 言語に新たに加算命令を
追加する ために以下の二点を 行う 必要があ る .
プロ グ ラ ム で実現さ れている . こ れはあ る 仮想マシン
• 基本モ ジュ ール 群に 加算モ ジュ ール を 組み込
を Malbolge 上に構築し ており , その仮想マシン はプ
む . そ の 際 , 加 算 モ ジュ ー ル の 入 力 の 二 数 に
ロ グ ラ ム カ ウ ン タ IP と レ ジ ス タ REG0,REG1 を 持
REG0,REG1 を と る よ う に変更し ておく
つ. 高級アセン ブリ プロ グ ラ ム は基本モジュ ール方式
• 他の命令と 同様に IP のイ ン ク リ メ ン ト に (1) と
のメ イ ン ルーチン にあ たり , 高級アセン ブリ 言語の各
(3) のモジュ ールを , 変数・ レ ジス タ 間コ ピ ーに
命令と 同じ 機能を 持つ低級ア セン ブリ プロ グ ラ ム で
(8) と (9) のモジュ ールを 使用する よ う に高級ア
あ る 基本モジュ ールを サブルーチン コ ールのよ う に呼
セン ブリ プロ グラ ム 実行系のフ ラ グを 再設定する
び出し ている .
高級ア セン ブリ 言語に加算命令を 追加する た めに,
上記の方針に基づき 高級ア セン ブリ プロ グ ラ ム の実
行系を 拡張し , 加算命令を 追加する こ と に成功し た.
高級アセン ブリ 言語の実行系の解析を 行っ た. 基本モ
ジュ ール群には大き く 分けて表 14 のモジュ ールが存
7 おわりに
在する こ と が文献 [7] で述べら れている . 解析の結果,
本論文では, 以下のよ う にし て高級アセン ブリ 言語
各モジュ ールと 高級アセン ブリ 言語の各命令の関係は
表 15 であ る こ と が明かと なっ た. 停止命令は特殊で
あ る ので, 以降は停止命令以外について話を 進める .
表 15 から 分かる よ う に, 全て の命令で (1), (3),
(8), (9) のモジュ ールを 使用し ている . こ れはこ の四
への加算命令の追加を 行っ た.
• 低級ア セン ブリ 言語での加算モジュ ールの作成
– Malbolge 向けの加算ア ルゴ リ ズム の検討
– 二引数三値関数を 実現する 疑似命令列の探
索手法の提案
つのモジュ ールが命令の操作だけではなく , 高級アセ
– 加算ア ルゴ リ ズム の疑似命令列での実現
ン ブリ プロ グ ラ ム の実行自体に使用さ れて いる た め
– 加算ア ルゴ リ ズ ム の低級ア セン ブリ 言語で
であ る . (1) と (8) のモジュ ールが使われている のは,
高級ア セン ブリ プロ グ ラ ム のプロ グ ラ ム カ ウ ン タ で
あ る IP を 命令や引数を 読み込むご と にイ ン ク リ メ ン
の実装
• 加算モジュ ールを 用いた加算命令の実現
12
日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集
ま た, 低級アセン ブリ 言語を 用いた加算アルゴ リ ズ
動かない場合も あ る . こ の値の決定は, 入力のプ
ム の実装や高級アセン ブリ 言語の実行系の解析, 拡張
ロ グ ラ ム を ひと ま ず適当な値でアセン ブルし , 出
を 行っ たこ と によ り , 低級アセン ブリ プロ グ ラ ミ ン グ
力さ れた Malbolge プロ グ ラ ム と アセン ブル時に
を 困難にし ている 主な原因が明ら かと なっ た.
得ら れる あ る 情報を 参考にノ ウ ハウ によ り 導出
1. 限定的な命令 使用でき る 命令は基本的に Mal-
し た 正し いと 思われる 値を 設定し 再びア セ ン ブ
bolge と 変わら ないので非常に限定的であ る .
ルする と いう , 繰り 返し の試行によ り 行われる .
2. 特定アドレスへの複数回アクセス 低級ア セ ン
上記の困難性に対する 解決策は, 現在のと こ ろ ノ ウ ハ
ブリ プロ グ ラ ム では, 同じ 名前の変数は一つのア
ウ に依存し ている 部分がほと んど であ り , 今後の課題
ド レ ス にし か書く こ と ができ ない. そのためプロ
と し て各困難性に対する シス テマティ ッ ク な解決策を
グ ラ ム 実行中に一度通り 過ぎ た 変数に再び何ら
考案する こ と が望ま し い.
かの操作を 行いたい場合, MOV PC 命令を 使用
Malbolge プロ グ ラ ム を ソ フ ト ウ ェ ア 保護の目的で
し て前に戻る 必要があ る . あ る 変数に対する 命令
利用する 場合, 本論文で行っ たよ う に命令を 豊かにし
は必ずそ の変数よ り も 前に記述し な け ればな ら
て し ま う と 解析困難性が低下し て し ま う 恐れがあ る .
ないため, ジャ ン プバッ ク は目的の変数の少し 前
特に高級アセン ブリ 言語で実装を 行っ た場合, 現在の
ま で行う . ま た命令が実行さ れる と 自動的に PC
手法では逆コ ン パイ ルが可能であ る こ と がすでに明
がイ ン ク リ メ ン ト さ れて し ま う た め, 同じ 変数
ら かになっ て いる [8]. そ こ で, 逆コ ン パイ ルを 困難
に対する 連続のアク セス であっ ても ジャ ン プバッ
にする た めに, 低級ア セン ブリ プロ グ ラ ミ ン グ 時に
ク は複数回必要になる . こ こ でジャ ン プバッ ク が
コ ード 難読化を 施し たり , 乱数を 用いた構造変換など
無条件分岐だと 無限ループに陥っ てし ま う こ と は
を 行う こ と で, よ り 難読性を 高める こ と が必要であ る
容易に想像でき る . その解決のために用いら れる
と 考え ている .
のがフ ラ グ であ る が, フ ラ グ を 用いる こ と によ っ
てさ ら に以下の困難性が生ま れる .
謝辞 本研究は一部, 科研費 #22650003 の助成を
受けている .
3. フラグによる実行制御 低級ア セ ン ブリ プロ グ
ラ ム はフ ラ グ によ り そ の実行を 制御さ れる . し
かし , 静的解析が非常に困難であ る た め, プロ
グ ラ ム 実行中の各フ ラ グ の状態を 知る た めには
動的解析を 行う 他な く , プロ グ ラ ム の理解やデ
バッ ク が非常に困難であ る . 特にメ モリ の節約の
た めに一つのフ ラ グ を 複数の場所に使用する と ,
解析はさ ら に困難と な る . 大量のフ ラ グ を 用意
し , 一つのフ ラ グ は一度し か使わないこ と にする
こ と でこ の問題はやや軽減する こ と ができ る が,
Malbolge のメ モリ は固定であ る ので必要以上の
フ ラ グ を 使用する こ と は避ける べき であ る .
4. アドレス値の設定 第 2. 6 節でも 述べたよ う に,
低級ア セ ン ブラ は入力の低級ア セ ン ブリ プロ グ
ラ ム に合わせて エン ト リ ーラ ベルのア ド レ ス 値
の指定やデータ のメ モリ 領域の指定を そ のソ ー
ス コ ード に記述する 必要があ る . 指定し た 値に
よ っ ては, 出力の Malbolge プロ グ ラ ム が正し く
参 考 文 献
[ 1 ] 門田暁人, 高田義広, 鳥居宏次 : プロ グラ ム 難読化法
の実験的評価 , 情報処理学会研究報告 ソ フ ト ウ ェ ア 工
学研究会報告, Vol. 96, No. 32, pp. 33–40, 1996.
[ 2 ] 飯澤恒 : 難解言語 Malbolge に基づく プロ グ ラ ム 難
読化に関する 研究 , 名古屋大学修士論文, 2006.
[ 3 ] Ben Olmstead : ”Malbolge: Programming from
Hell”, http://www.bouletfermat.com/danny/
malbolge/ , 1998.
[ 4 ] Andrew Cooke : “malbolge : hello world”,
http://www.acooke.org/malbolge.html.
[ 5 ] 長坂哲 : 難解言語 Malbolge の弱チュ ーリ ン グ完全
性と プロ グラ ミ ン グ環境 , 名古屋大学修士論文, 2011.
[ 6 ] 飯澤恒, 坂部俊樹, 酒井正彦, 草刈圭一朗, 西田直
樹 : 難解プロ グラ ミ ン グ言語 Malbolge における プロ グ
ラ ム 構成手法, 信学技報, 電子情報通信学会, Vol. 105,
No. 129, pp. 25–30, 2005.
[ 7 ] 長坂哲, 酒井正彦, 坂部俊樹, 草刈圭一朗, 西田直
樹: 難解言語 Malbolge のチュ ーリ ン グ 完全性につい
て, 信学技報, 電子情報通信学会, Vol. 110, No. 227,
pp. 55–60, 2010.
[ 8 ] 菅優也 : 難読言語 Malbolge の逆コ ン パイ ル困難
性に関する 研究 , 高知工科大学卒業論文, 2011.