2020-01-13
かわいく思えるようになったx86マシン語、深みにハマって行き着いた「アセンブラ短歌
57577の5行、31byteで動くマシン語で、2byte以上の命令が行をまたいではいけないというストイックなルールが良い!

一句詠んでみました。

68 57 61 6B 61 31 C0 68 6D 62 6C 79 68 41 73 73 65 89 E1 6A 0C 51 6A 01 50 B0 04 CD 80 EB E1

タイトル「WakaAssembly...」 (x86/macOS Mojabe 32bit)

コンピューターの凄さを一番すぐに感じられるのは、繰り返し。 人間では不可能な速さで正確無比に繰り返される様を見せつけ、それが自分の指示によるものだと体感したものを虜にしてしまう。 (参考、IchigoJam BASIC のプログラム、RUN on IchigoJam web by WebAssembly

10 PRINT "WakaAssembly"; 20 GOTO 10

アセンブラ和歌アセンブラ和歌と繰り返しから誕生した、WakaAssembly、WebAssemblyっぽくて輸出しやすいかも。

CatalinaにOSアップデートで動作しなくなってしまう、macOS最後の32bitアプリの記念に。

x86マシン語(アセンブリ言語)で書かれたソースはこちら

00000000 <_main>: 0: 68 57 61 6b 61 push 0x796c626d 5: 31 c0 xor eax, eax ; eax = 0 7: 68 6d 62 6c 79 push 0x65737341 c: 68 41 73 73 65 push 0x616b6157 11: 89 e1 mov ecx, esp 13: 6a 0c push 12 ; length 15: 51 push ecx ; buffer 16: 6a 01 push 1 ; stdout 18: 50 push eax ; dummy 19: b0 04 mov al, 4 ; sys_write 1b: cd 80 int 0x80 ; syscall 1d: eb e1 jmp _main

pushで一度に4文字分、直接詰めるのがさすがCISC!jmp _mainで先頭へジャンプし、繰り返すたびにスタックを積み続けるので Segmentation faul を出してちゃんと止まり、現代OSのありがたみを感じる。(bits 32 として、32bitモードでのアセンブルが必要)

行儀よく、スタック位置を合わせ ret で 0 を返して終わるバージョン main-1shot.s、31byteのバイナリを和歌表示するために作ったミニプログラム wakaout.c もあります。
詳しくは「x86asm/wakaasm src on GitHub」で!

links
- アセンブラ短歌 - 坂井弘亮 / slideshare
- 「オープンソース」を使ってみよう (第33回 アセンブラ短歌)
- 31バイトでつくるアセンブラプログラミング ~アセンブラ短歌の世界~ Kindle版
- 「57577」の機械語を詠む「アセンブラ短歌本」まとめ - Togetter
- 根っこは同じ! Z80経験者によるx86マシン語はじめ、512byte bootBASIC をmacOS用に移植

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS