global _start
section .data
section .text
; 前提として起動時のレジスタは eip/espを除き 0x00000000、
; espはスタックの先頭を指している
; Linuxシステムコール用にレジスタを準備
; system call : int 80h : write[eax=4](ebx=1, ecx=esp, edx=1)
inc ebx ; 43 C
inc edx ; 42 B
L_loop1:
; 出力文字列はスタックに置き、ecx=espを設定する。
; 即値pushは 4バイトのリトルエンディアンで配置されるため、
; メモリ上は 0x36 0x00 0x00 0x00 となる。0x36 は 文字'$'
push 36 ; 6A24 j$
; esiレジスタにステップ増分(本来は+2)の半分を持たせる。
inc esi ; 46 F
; ecxが0だとjecxz(E3xx)が使えないためとりあえず1を入れる。
; 以降、E3xxは有効文字化するためのダミーOP
inc ecx ; 41 A
db 0xe3,0x81 ; E381 ぉ (E38189)
; 目的は ecxにespを入れることだが、直接movするOPは
; 文字コード的に使用できないため、ebpを経由する。
mov ebp, esp ; 89E5 嗇 (E59787)
xchg eax, edi ; 97
; 純粋に xchg ecx, ebp と書くと(87E9)にアセンブルされないため直接書く
db 0x87, 0xe9 ; 87E9 雰 (E99BB0)
wait ; 9B
L_loop2:
; eax = 4 だが、直接0x04が表現できないため、0xE9-0xE5 で入れる
; ASCIIコード内でも問題ないが、ジャンプ命令の位置あわせのため多バイト文字を使用している
mov al, 0xE9 ; B0E9 鐐 (E99090)
db 0x90,0x90 ; 9090
sub al, 0xE5 ; 2CE5 ,吐 (E59090)
db 0x90,0x90 ; 9090
; システムコール int80h 起動
; CD80を表現できる文字コードは無く代替するOPも無いため、
; Unicode文字リテラルで記述 \U340。ただし後続の文字が英数ではないことが必須。
int 0x80 ; CD80 \U340
; スタックから現在の文字コードをediレジスタに取得
pop edi ; 5F _
db 0xe3,0x81 ; E381 き (E3818D)
; 加算後の文字コードを計算。ここで*2しているため、前述のステップ増分は+1で済む
lea edi,[edi+esi*2] ; 8D2C3F <w
db 0xe3,0x81 ; E381 し (E38197)
xchg eax, edi ; 97
; 加算後の文字コードをスタックに戻す
push eax ; 50 P
; 1週終了判定('t'=116を越えると1週終わり) esp=ecxなので[ecx]で判定する。
db 0xe3,0x82 ; E382 む (E38280)
cmp byte [ecx], 118 ; 803976 9v
jc L_loop2 ; 72xx r在 (E59CA8)
; 有効文字化のダミーのため意味はなし
pushfd ; 9C
; 終了条件 文字コード=132(0x84)
; 36,38,40,42,44,46,48,50, ... ,110,112,114,116,[118]
; 36,40,44,48,52,56,60,64, ... ,104,108,112,116,[120]
; 36,42,48,54,60,66,72,78,84,90,96,102,108,114,[120]
; 36,44,52,60,68,76,84,92,100,108,116,[124]
; 36,46,56,66,76,86,96,106,116,[126]
; 36,48,60,72,84,96,108,[120]
; 36,50,64,78,92,106,[120]
; 36,52,68,84,100,116,[132]
; この時点でeaxに加算後の文字コードを持っているためalレジスタで判定
; 0x7BのANDを取り、0の場合に終了とする。
; 0x7BとANDを取って0になるのは 0,4,128,132のみのため、al=132の場合に終了となる。
test al,0x7b ; A87B {
db 0xe3,0x81,0x9B ; せ (E3819B)
jnz L_loop1 ; uё (D191)
db 0x91
; ここまで
; your code goes here
je exit
exit:
mov eax, 01h ; exit()
xor ebx, ebx ; errno
int 80h
Z2xvYmFsIF9zdGFydAoKc2VjdGlvbiAuZGF0YQoKc2VjdGlvbiAudGV4dAoKICAgIDsg5YmN5o+Q44Go44GX44Gm6LW35YuV5pmC44Gu44Os44K444K544K/44GvIGVpcC9lc3DjgpLpmaTjgY0gMHgwMDAwMDAwMOOAgQogICAgOyBlc3Djga/jgrnjgr/jg4Pjgq/jga7lhYjpoK3jgpLmjIfjgZfjgabjgYTjgosKCiAgICA7IExpbnV444K344K544OG44Og44Kz44O844Or55So44Gr44Os44K444K544K/44KS5rqW5YKZCiAgICA7IHN5c3RlbSBjYWxsIDogaW50IDgwaCA6IHdyaXRlW2VheD00XShlYng9MSwgZWN4PWVzcCwgZWR4PTEpCiAgICBpbmMgZWJ4ICAgICAgICAgICAgICAgICA7IDQzICAgICAgICBDCiAgICBpbmMgZWR4ICAgICAgICAgICAgICAgICA7IDQyICAgICAgICBCCgpMX2xvb3AxOgogICAgOyDlh7rlipvmloflrZfliJfjga/jgrnjgr/jg4Pjgq/jgavnva7jgY3jgIFlY3g9ZXNw44KS6Kit5a6a44GZ44KL44CCCiAgICA7IOWNs+WApHB1c2jjga8gNOODkOOCpOODiOOBruODquODiOODq+OCqOODs+ODh+OCo+OCouODs+OBp+mFjee9ruOBleOCjOOCi+OBn+OCgeOAgQogICAgOyDjg6Hjg6Ljg6rkuIrjga8gMHgzNiAweDAwIDB4MDAgMHgwMCDjgajjgarjgovjgIIweDM2IOOBryDmloflrZcnJCcKICAgIHB1c2ggMzYgICAgICAgICAgICAgICAgIDsgNkEyNCAgICAgIGokCgogICAgOyBlc2njg6zjgrjjgrnjgr/jgavjgrnjg4bjg4Pjg5flopfliIYo5pys5p2l44GvKzIp44Gu5Y2K5YiG44KS5oyB44Gf44Gb44KL44CCCiAgICBpbmMgZXNpICAgICAgICAgICAgICAgICA7IDQ2ICAgICAgICBGCgogICAgOyBlY3jjgYww44Gg44GoamVjeHooRTN4eCnjgYzkvb/jgYjjgarjgYTjgZ/jgoHjgajjgorjgYLjgYjjgZox44KS5YWl44KM44KL44CCCiAgICA7IOS7pemZjeOAgUUzeHjjga/mnInlirnmloflrZfljJbjgZnjgovjgZ/jgoHjga7jg4Djg5/jg7xPUAogICAgaW5jIGVjeCAgICAgICAgICAgICAgICAgOyA0MSAgICAgICAgQQogICAgZGIgMHhlMywweDgxICAgICAgICAgICAgOyBFMzgxICAgICAg44GJIChFMzgxODkpCgogICAgOyDnm67nmoTjga8gZWN444GrZXNw44KS5YWl44KM44KL44GT44Go44Gg44GM44CB55u05o6lbW9244GZ44KLT1Djga8KICAgIDsg5paH5a2X44Kz44O844OJ55qE44Gr5L2/55So44Gn44GN44Gq44GE44Gf44KB44CBZWJw44KS57WM55Sx44GZ44KL44CCCiAgICBtb3YgZWJwLCBlc3AgICAgICAgICAgICA7IDg5RTUgICAgICDll4cgKEU1OTc4NykKICAgIHhjaGcgZWF4LCBlZGkgICAgICAgICAgIDsgOTcKICAgIDsg57SU57KL44GrIHhjaGcgZWN4LCBlYnAg44Go5pu444GP44GoKDg3RTkp44Gr44Ki44K744Oz44OW44Or44GV44KM44Gq44GE44Gf44KB55u05o6l5pu444GPCiAgICBkYiAweDg3LCAweGU5ICAgICAgICAgICA7IDg3RTkgICAgICDpm7AgKEU5OUJCMCkKICAgIHdhaXQgICAgICAgICAgICAgICAgICAgIDsgOUIKCkxfbG9vcDI6CiAgICA7IGVheCA9IDQg44Gg44GM44CB55u05o6lMHgwNOOBjOihqOePvuOBp+OBjeOBquOBhOOBn+OCgeOAgTB4RTktMHhFNSDjgaflhaXjgozjgosKICAgIDsgQVNDSUnjgrPjg7zjg4nlhoXjgafjgoLllY/poYzjgarjgYTjgYzjgIHjgrjjg6Pjg7Pjg5flkb3ku6Tjga7kvY3nva7jgYLjgo/jgZvjga7jgZ/jgoHlpJrjg5DjgqTjg4jmloflrZfjgpLkvb/nlKjjgZfjgabjgYTjgosKICAgIG1vdiBhbCwgMHhFOSAgICAgICAgICAgIDsgQjBFOSAgICAgIOmQkCAoRTk5MDkwKQogICAgZGIgMHg5MCwweDkwICAgICAgICAgICAgOyA5MDkwCiAgICBzdWIgYWwsIDB4RTUgICAgICAgICAgICA7IDJDRTUgICAgICAs5ZCQIChFNTkwOTApCiAgICBkYiAweDkwLDB4OTAgICAgICAgICAgICA7IDkwOTAKCiAgICA7IOOCt+OCueODhuODoOOCs+ODvOODqyBpbnQ4MGgg6LW35YuVCiAgICA7IENEODDjgpLooajnj77jgafjgY3jgovmloflrZfjgrPjg7zjg4njga/nhKHjgY/ku6Pmm7/jgZnjgotPUOOCgueEoeOBhOOBn+OCgeOAgQogICAgOyBVbmljb2Rl5paH5a2X44Oq44OG44Op44Or44Gn6KiY6L+wIFxVMzQw44CC44Gf44Gg44GX5b6M57aa44Gu5paH5a2X44GM6Iux5pWw44Gn44Gv44Gq44GE44GT44Go44GM5b+F6aCI44CCCiAgICBpbnQgMHg4MCAgICAgICAgICAgICAgICA7IENEODAgICAgICBcVTM0MAoKICAgIDsg44K544K/44OD44Kv44GL44KJ54++5Zyo44Gu5paH5a2X44Kz44O844OJ44KSZWRp44Os44K444K544K/44Gr5Y+W5b6XCiAgICBwb3AgZWRpICAgICAgICAgICAgICAgICA7IDVGICAgICAgICBfCiAgICBkYiAweGUzLDB4ODEgICAgICAgICAgICA7IEUzODEgICAgICDjgY0gKEUzODE4RCkKICAgIDsg5Yqg566X5b6M44Gu5paH5a2X44Kz44O844OJ44KS6KiI566X44CC44GT44GT44GnKjLjgZfjgabjgYTjgovjgZ/jgoHjgIHliY3ov7Djga7jgrnjg4bjg4Pjg5flopfliIbjga8rMeOBp+a4iOOCgAogICAgbGVhIGVkaSxbZWRpK2VzaSoyXSAgICAgOyA4RDJDM0YgICAgPHcKICAgIGRiIDB4ZTMsMHg4MSAgICAgICAgICAgIDsgRTM4MSAgICAgIOOBlyAoRTM4MTk3KQogICAgeGNoZyBlYXgsIGVkaSAgICAgICAgICAgOyA5NwogICAgOyDliqDnrpflvozjga7mloflrZfjgrPjg7zjg4njgpLjgrnjgr/jg4Pjgq/jgavmiLvjgZkKICAgIHB1c2ggZWF4ICAgICAgICAgICAgICAgIDsgNTAgICAgICAgIFAKCiAgICA7IDHpgLHntYLkuobliKTlrpooJ3QnPTExNuOCkui2iuOBiOOCi+OBqDHpgLHntYLjgo/jgoopIGVzcD1lY3jjgarjga7jgadbZWN4XeOBp+WIpOWumuOBmeOCi+OAggogICAgZGIgMHhlMywweDgyICAgICAgICAgICAgOyBFMzgyICAgICAg44KAIChFMzgyODApCiAgICBjbXAgYnl0ZSBbZWN4XSwgMTE4ICAgICA7IDgwMzk3NiAgICA5dgogICAgamMgTF9sb29wMiAgICAgICAgICAgICAgOyA3Mnh4ICAgICAgcuWcqCAoRTU5Q0E4KQoKICAgIDsg5pyJ5Yq55paH5a2X5YyW44Gu44OA44Of44O844Gu44Gf44KB5oSP5ZGz44Gv44Gq44GXCiAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IDlDCgoKOyDntYLkuobmnaHku7Yg5paH5a2X44Kz44O844OJPTEzMigweDg0KQo7IDM2LDM4LDQwLDQyLDQ0LDQ2LDQ4LDUwLCAuLi4gLDExMCwxMTIsMTE0LDExNixbMTE4XQo7IDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0LCAuLi4gLDEwNCwxMDgsMTEyLDExNixbMTIwXQo7IDM2LDQyLDQ4LDU0LDYwLDY2LDcyLDc4LDg0LDkwLDk2LDEwMiwxMDgsMTE0LFsxMjBdCjsgMzYsNDQsNTIsNjAsNjgsNzYsODQsOTIsMTAwLDEwOCwxMTYsWzEyNF0KOyAzNiw0Niw1Niw2Niw3Niw4Niw5NiwxMDYsMTE2LFsxMjZdCjsgMzYsNDgsNjAsNzIsODQsOTYsMTA4LFsxMjBdCjsgMzYsNTAsNjQsNzgsOTIsMTA2LFsxMjBdCjsgMzYsNTIsNjgsODQsMTAwLDExNixbMTMyXQoKICAgIDsg44GT44Gu5pmC54K544GnZWF444Gr5Yqg566X5b6M44Gu5paH5a2X44Kz44O844OJ44KS5oyB44Gj44Gm44GE44KL44Gf44KBYWzjg6zjgrjjgrnjgr/jgafliKTlrpoKICAgIDsgMHg3QuOBrkFOROOCkuWPluOCiuOAgTDjga7loLTlkIjjgavntYLkuobjgajjgZnjgovjgIIKICAgIDsgMHg3QuOBqEFOROOCkuWPluOBo+OBpjDjgavjgarjgovjga7jga8gMCw0LDEyOCwxMzLjga7jgb/jga7jgZ/jgoHjgIFhbD0xMzLjga7loLTlkIjjgavntYLkuobjgajjgarjgovjgIIKICAgIHRlc3QgYWwsMHg3YiAgICAgICAgICAgIDsgQTg3QiAgICAgIHsKCiAgICBkYiAweGUzLDB4ODEsMHg5QiAgICAgICA7IOOBmyAoRTM4MTlCKQogICAgam56IExfbG9vcDEgICAgICAgICAgICAgOyB10ZEgKEQxOTEpCiAgICBkYiAweDkxCgoKICAgIDsg44GT44GT44G+44GnCiAgICA7IHlvdXIgY29kZSBnb2VzIGhlcmUKICAgIGplICAgICAgZXhpdAoKZXhpdDoKICAgIG1vdiAgICAgZWF4LCAwMWggICAgICAgIDsgZXhpdCgpCiAgICB4b3IgICAgIGVieCwgZWJ4ICAgICAgICA7IGVycm5vCiAgICBpbnQgICAgIDgwaAoK