page0054
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* アセンブラ短歌のページ #0000
-(by [[K]], 2013.07.22)
** (0) はじめに
-さてそもそもアセンブラ短歌とは何か?
--アセンブラ短歌とは、坂井弘亮先生が発明した非常に高度で...
--好きなCPUを選んで、そのCPU向けに5+7+5+7+7=31バイトのプ...
--そしてそのプログラムについて、バイトの並びなどを人間が...
--http://kozos.jp/documents/LT_asm_tanka.pdf ← 将来重要...
-いくつか細かいルールがあります。それは以下で補足します。
--(1) アプリケーションヘッダ的なものは基本的に31バイトに...
--(2) 31バイトはすべてCPUによって詠まれる(=実行される)...
---つまり文字列データを31バイト内のどこかに置いて、それを...
---メモリを確保して、そこへ機械語でデータを書き込んで、そ...
--(3) 機械語命令は、5,7,5,7,7の区切りで切れなければいけな...
---7のところに3+2+2を詰め込むことはOK。
-アセンブラ短歌では文字表示が特に好まれていますが、Kの独...
--しかしそれゆえに正統派とも言えます。
--なんにせよ、まずは基本である正統派を理解していただきま...
-[基本]
--上記のPDFにあるとおり、x86(32bit)のLinux向けのアセンブ...
--しかしこれはもう限界を極めてしまった感があって、この記...
--アセンブラ短歌では、みんなが知らないマニアックな命令(...
--なんかえらく複雑で、逆アセンブルしても(実行してみるま...
--僕たちはOS屋なので、ブートセクタ用にBIOSを叩いて面白い...
--結局問われているのは、プログラミングテクニックではなく...
-[発展]
--さて僕たちにはOSECPUがあります。OSECPUだって立派なアー...
--というかx86はすでに時代遅れですよね。これからはOSECPUで...
--で、OSECPUの機械語でアセンブラ短歌すると、22バイトの任...
--というか5+7+5の17バイトだけでも12バイト出力できちゃいま...
--ただまあ、OSECPUは機能密度において世界最強なのは当たり...
--だとすると、人間を面白がらせるためには何をしたらいいん...
-以上の文章を書いた後で坂井先生による解説ページを発見: h...
** (1) OSECPUの実力
-アセンブラ短歌においてOSECPUがどれほどすごいかを分かって...
-おっとその前に・・・もしOSECPUの機能密度のことをよく知ら...
~
-[1-1] それではまずは古典で22文字出力の例を(22BPT):
#include "osecpu_ask.h"
junkApi_putConstString0('Wak');
junkApi_putConstString0('ayama');
junkApi_putConstString0('Bok');
junkApi_putConstString0('usuiW');
junkApi_putConstString6('akayam');
51 03 57 61 6B
51 05 61 79 61 6D 61
51 03 42 6F 6B
51 05 75 73 75 69 57
51 6C 3A F0 F9 C3 B4
--解説。OSECPUでは0.5バイト単位で命令を記述します。そして...
--「51 03 57 61 6B」についてもう少し詳しく見てみます。51...
--つまりOSECPUでは、たった5バイトだけでも任意の3文字を出...
--これはルールの(2)に違反しているように見えるかもしれませ...
---R30レジスタに機能番号が代入されて、
---R31レジスタには文字長3が代入され、
---スタックから3バイトを確保し、
---そこへ律儀に57, 61, 6Bをひとつずつ書き込んで、
---そのポインタをP31に格納して、
---PCALL(P28);を実行して、
---その後スタックを開放する、
--という長いプログラムにちゃんと変換されているのです。な...
--ここまでの説明で、最初の4行については完全に理解できると...
--モード6は文字列長の記述はなく、0という終端文字がくるま...
--おっとこれは終了処理が何もありませんね。でもOSECPUは終...
~
-[1-2] 5+7+5の川柳で12文字を出力する際には、以下のように...
51 03 xx xx xx
51 05 xx xx xx xx xx
51 6x xx xx xx
-[1-3] 「そもそも1文字しか出さなくていいとしたら、どこま...
51 66 // "0"が出力されます
-x86だと2バイトではレジスタに文字コードを入れるのが精いっ...
~
-[1-4] 下の[4-1]をベースに短歌を作りました。
60 0F FF FC 65
59 61 11 14 18 30 B0
51 0F F2 20 3D
59 61 11 14 28 80 B0
51 0F FF FF F2 62 0A
--出力結果はこうなります。
0 = 0b
1 = 1b
2 = 10b
3 = 11b
4 = 100b
5 = 101b
6 = 110b
7 = 111b
8 = 1000b
9 = 1001b
10 = 1010b
(中略)
98 = 1100010b
99 = 1100011b
100 = 1100100b
--596系の命令は、まあとにかく優秀でまさにprintf(っぽいも...
--ここまで作ってみて気づいたのですが、OSECPUにおいてはア...
-(つづく)
** (2) ニブル短歌、ニブル川柳
-(1)の川柳で12文字が出せてしまうことからもわかるように、O...
-どうするのかというと、バイト単位で57577するのではなく、...
-そもそも短歌の31文字は音というかリズムを楽しむものです。...
-ルールは基本的にはアセンブラ短歌と同じですが、命令を行に...
-ニブル川柳なんてもはや不可能と思うかもしれませんが、ちゃ...
60C20C7F
514B
-これをニブル川柳にしてみます。読み仮名も付けました。
60C20 - むおしにお
C7FFF51 - しなふふふごい
FF4B0 - ふふよぶお
-あちこちにFが入っていますがこれはOSECPUにおけるNOPみたい...
-読み仮名は「おいにみよごむなやくあぶしでえふ」(01234567...
-このコードにはまだいじる余地があります。FF5はF85と書くこ...
~
-次は13バイトのグラデーションをニブル短歌にしてみます。ヘ...
600DB0 610DB0 4520 942DB0
-これを短歌にしたらこうなりました。
68080 - むやおやお
DB06180 - でぶおむいやお
FFDB0 - ふふでぶお
4520942 - よごにおくよに
F74FFB0 - ふなよふふぶお
-ちなみに何度も出てくる「でぶお」は256という定数を表して...
~
-川柳は17ニブルで8.5バイト、つまりヘッダ付きでも11バイト...
-俳句では季語を入れることが義務になっていて、それが文学性...
-(つづく)
** (3) hh4のエンコードテーブル
-hh4(えいち・えいち・ふぉー)というのは、OSECPUのフロン...
4ビット形式: 0xxx (ただし0111は使えない) U:0...6, ...
8ビット形式: 10xx xxxx U:0...3F, ...
12ビット形式: 110x xxxx xxxx U:0...1FF,...
16ビット形式: 1110 xxxx xxxx xxxx U:0...FFF,...
24ビット形式: 0111 0100 xxxx xxxx xxxx xxxx U:0...FFFF,
28ビット形式: 0111 0101 xxxx ...
32ビット形式: 0111 0110 xxxx ...
36ビット形式: 0111 1000 0111 xxxx ...
以下略
--符号付き整数の4bit形式では、0110が-1, 0101が-2, 0100が-...
--符号付き整数の8bit形式では、10110000がR00を表す。101011...
-- -10以下の整数をエンコードするときは、最低でも12ビット...
** (4) 没ネタ集
-ここは、短歌を目指してやってみたけど、うまくいかなかった...
~
-[4-1] 進数変換表表示プログラム
0(10) = 0(2) = 0(16)
1(10) = 1(2) = 1(16)
2(10) = 10(2) = 2(16)
3(10) = 11(2) = 3(16)
4(10) = 100(2) = 4(16)
(中略)
98(10) = 1100010(2) = 62(16)
99(10) = 1100011(2) = 63(16)
100(10) = 1100100(2) = 64(16)
--この表示を得るために必要なアプリを作ってみたところ、ヘ...
--まあ(2)をBにして、(16)をHにしたりすれば4バイトくらい減...
6 0 0 C65 // for (i = 0; i != 101; i++) {
5 96 6 02A18B0 5281E81 50C94A0 7A05431 6CA4500 // "\1(1...
1 8C 4 3 0 B0 2 88 0 B0 0 3 0 B // (10進, 3桁, ス...
--とかいいつつ、結局短歌にしました。→[1-4]
* こめんと欄
#comment
終了行:
* アセンブラ短歌のページ #0000
-(by [[K]], 2013.07.22)
** (0) はじめに
-さてそもそもアセンブラ短歌とは何か?
--アセンブラ短歌とは、坂井弘亮先生が発明した非常に高度で...
--好きなCPUを選んで、そのCPU向けに5+7+5+7+7=31バイトのプ...
--そしてそのプログラムについて、バイトの並びなどを人間が...
--http://kozos.jp/documents/LT_asm_tanka.pdf ← 将来重要...
-いくつか細かいルールがあります。それは以下で補足します。
--(1) アプリケーションヘッダ的なものは基本的に31バイトに...
--(2) 31バイトはすべてCPUによって詠まれる(=実行される)...
---つまり文字列データを31バイト内のどこかに置いて、それを...
---メモリを確保して、そこへ機械語でデータを書き込んで、そ...
--(3) 機械語命令は、5,7,5,7,7の区切りで切れなければいけな...
---7のところに3+2+2を詰め込むことはOK。
-アセンブラ短歌では文字表示が特に好まれていますが、Kの独...
--しかしそれゆえに正統派とも言えます。
--なんにせよ、まずは基本である正統派を理解していただきま...
-[基本]
--上記のPDFにあるとおり、x86(32bit)のLinux向けのアセンブ...
--しかしこれはもう限界を極めてしまった感があって、この記...
--アセンブラ短歌では、みんなが知らないマニアックな命令(...
--なんかえらく複雑で、逆アセンブルしても(実行してみるま...
--僕たちはOS屋なので、ブートセクタ用にBIOSを叩いて面白い...
--結局問われているのは、プログラミングテクニックではなく...
-[発展]
--さて僕たちにはOSECPUがあります。OSECPUだって立派なアー...
--というかx86はすでに時代遅れですよね。これからはOSECPUで...
--で、OSECPUの機械語でアセンブラ短歌すると、22バイトの任...
--というか5+7+5の17バイトだけでも12バイト出力できちゃいま...
--ただまあ、OSECPUは機能密度において世界最強なのは当たり...
--だとすると、人間を面白がらせるためには何をしたらいいん...
-以上の文章を書いた後で坂井先生による解説ページを発見: h...
** (1) OSECPUの実力
-アセンブラ短歌においてOSECPUがどれほどすごいかを分かって...
-おっとその前に・・・もしOSECPUの機能密度のことをよく知ら...
~
-[1-1] それではまずは古典で22文字出力の例を(22BPT):
#include "osecpu_ask.h"
junkApi_putConstString0('Wak');
junkApi_putConstString0('ayama');
junkApi_putConstString0('Bok');
junkApi_putConstString0('usuiW');
junkApi_putConstString6('akayam');
51 03 57 61 6B
51 05 61 79 61 6D 61
51 03 42 6F 6B
51 05 75 73 75 69 57
51 6C 3A F0 F9 C3 B4
--解説。OSECPUでは0.5バイト単位で命令を記述します。そして...
--「51 03 57 61 6B」についてもう少し詳しく見てみます。51...
--つまりOSECPUでは、たった5バイトだけでも任意の3文字を出...
--これはルールの(2)に違反しているように見えるかもしれませ...
---R30レジスタに機能番号が代入されて、
---R31レジスタには文字長3が代入され、
---スタックから3バイトを確保し、
---そこへ律儀に57, 61, 6Bをひとつずつ書き込んで、
---そのポインタをP31に格納して、
---PCALL(P28);を実行して、
---その後スタックを開放する、
--という長いプログラムにちゃんと変換されているのです。な...
--ここまでの説明で、最初の4行については完全に理解できると...
--モード6は文字列長の記述はなく、0という終端文字がくるま...
--おっとこれは終了処理が何もありませんね。でもOSECPUは終...
~
-[1-2] 5+7+5の川柳で12文字を出力する際には、以下のように...
51 03 xx xx xx
51 05 xx xx xx xx xx
51 6x xx xx xx
-[1-3] 「そもそも1文字しか出さなくていいとしたら、どこま...
51 66 // "0"が出力されます
-x86だと2バイトではレジスタに文字コードを入れるのが精いっ...
~
-[1-4] 下の[4-1]をベースに短歌を作りました。
60 0F FF FC 65
59 61 11 14 18 30 B0
51 0F F2 20 3D
59 61 11 14 28 80 B0
51 0F FF FF F2 62 0A
--出力結果はこうなります。
0 = 0b
1 = 1b
2 = 10b
3 = 11b
4 = 100b
5 = 101b
6 = 110b
7 = 111b
8 = 1000b
9 = 1001b
10 = 1010b
(中略)
98 = 1100010b
99 = 1100011b
100 = 1100100b
--596系の命令は、まあとにかく優秀でまさにprintf(っぽいも...
--ここまで作ってみて気づいたのですが、OSECPUにおいてはア...
-(つづく)
** (2) ニブル短歌、ニブル川柳
-(1)の川柳で12文字が出せてしまうことからもわかるように、O...
-どうするのかというと、バイト単位で57577するのではなく、...
-そもそも短歌の31文字は音というかリズムを楽しむものです。...
-ルールは基本的にはアセンブラ短歌と同じですが、命令を行に...
-ニブル川柳なんてもはや不可能と思うかもしれませんが、ちゃ...
60C20C7F
514B
-これをニブル川柳にしてみます。読み仮名も付けました。
60C20 - むおしにお
C7FFF51 - しなふふふごい
FF4B0 - ふふよぶお
-あちこちにFが入っていますがこれはOSECPUにおけるNOPみたい...
-読み仮名は「おいにみよごむなやくあぶしでえふ」(01234567...
-このコードにはまだいじる余地があります。FF5はF85と書くこ...
~
-次は13バイトのグラデーションをニブル短歌にしてみます。ヘ...
600DB0 610DB0 4520 942DB0
-これを短歌にしたらこうなりました。
68080 - むやおやお
DB06180 - でぶおむいやお
FFDB0 - ふふでぶお
4520942 - よごにおくよに
F74FFB0 - ふなよふふぶお
-ちなみに何度も出てくる「でぶお」は256という定数を表して...
~
-川柳は17ニブルで8.5バイト、つまりヘッダ付きでも11バイト...
-俳句では季語を入れることが義務になっていて、それが文学性...
-(つづく)
** (3) hh4のエンコードテーブル
-hh4(えいち・えいち・ふぉー)というのは、OSECPUのフロン...
4ビット形式: 0xxx (ただし0111は使えない) U:0...6, ...
8ビット形式: 10xx xxxx U:0...3F, ...
12ビット形式: 110x xxxx xxxx U:0...1FF,...
16ビット形式: 1110 xxxx xxxx xxxx U:0...FFF,...
24ビット形式: 0111 0100 xxxx xxxx xxxx xxxx U:0...FFFF,
28ビット形式: 0111 0101 xxxx ...
32ビット形式: 0111 0110 xxxx ...
36ビット形式: 0111 1000 0111 xxxx ...
以下略
--符号付き整数の4bit形式では、0110が-1, 0101が-2, 0100が-...
--符号付き整数の8bit形式では、10110000がR00を表す。101011...
-- -10以下の整数をエンコードするときは、最低でも12ビット...
** (4) 没ネタ集
-ここは、短歌を目指してやってみたけど、うまくいかなかった...
~
-[4-1] 進数変換表表示プログラム
0(10) = 0(2) = 0(16)
1(10) = 1(2) = 1(16)
2(10) = 10(2) = 2(16)
3(10) = 11(2) = 3(16)
4(10) = 100(2) = 4(16)
(中略)
98(10) = 1100010(2) = 62(16)
99(10) = 1100011(2) = 63(16)
100(10) = 1100100(2) = 64(16)
--この表示を得るために必要なアプリを作ってみたところ、ヘ...
--まあ(2)をBにして、(16)をHにしたりすれば4バイトくらい減...
6 0 0 C65 // for (i = 0; i != 101; i++) {
5 96 6 02A18B0 5281E81 50C94A0 7A05431 6CA4500 // "\1(1...
1 8C 4 3 0 B0 2 88 0 B0 0 3 0 B // (10進, 3桁, ス...
--とかいいつつ、結局短歌にしました。→[1-4]
* こめんと欄
#comment
ページ名: