孤独へ向って突っ走れ(18) [ PC-98x1(補完計画)]
前回の記事で、「次回は心機一転、逆アセンブルしたコードの解析で個性豊かな記事を書いてやる」と書いてしまったが、あれは格好をつけすぎて自分の首を締めたきらいがある。自分で記事を書きにくくしてしまった。
今回は、そろりそろりと参ろう。
そろりそろりと「テニステニス2」を解析していたら、あるサブルーチンを発見した。小粒なルーチンだが、当時のPC-98プログラミングではしばしば必要になり、そのくせコーディングが意外と面倒なルーチンだ。Shift JIS文字コードをJIS文字コードに変換するルーチン。
なお、(今までの記事も含めて)ラベルの代わりにアドレスをそのまま書いているのをお許しいただきたい。先頭文字が数字でラベルとして通用しない場合もある。それはわかっているが、いつ解析が終わるともわからない膨大な量の逆アセンブル結果を前にして、いちいちラベル名を作って書いている余裕がなく、処理がわかればいいということにしている。
CMP AH,80
JZ A0D5
AHが80Hなら何もせず戻る
CMP AH,A0
JNB A0BE
そうでなくてAHがA0H以上ならA0BEHへ飛べ
SUB AH,70
JMP Short A0C1
AHがA0H未満ならば70Hを引き、A0C1へ飛んで、AHがA0H以上の場合と合流
A0BE: ;JNBのラベルはここ
SUB AH,B0
AHがA0H以上ならB0Hを引き、この下でAHがA0H未満の場合と合流
A0C1: ;JMP Shortのラベルはここ
OR AL,AL
JNS A0C7
ALのビット7が0ならA0C7Hへ飛べ
DEC AL
ALのビット7が1なら1を引き、この下でALのビット7が0の場合と合流
A0C7: ;JNSのラベルはここ
ADD AH,AH
AHを2倍する
CMP AL,9E
JB A0D1
ALが9EH未満ならばA0D1Hへ飛べ
SUB AL,5E
JMP Short A0D3
ALが9EH以上ならば5EHを引き、A0D3Hへ飛んでALが9EH未満の場合と合流せよ
A0D1: ;JBのラベルはここ
DEC AH
ALが9EH未満ならばAHから1を引き、この下でALが9EH以上の場合と合流
A0D3: ;JMP Shortのラベルはここ
SUB AL,1F
ALから1FHを引く
A0D5: ;JZのラベルはここ
RET
どんなプログラミング言語で記述しても結果としての動作は同じだが、いくつかの場所でアセンブラらしいコーディングをしているのが私は嬉しい。私が若い頃にMASMを買ったすぐ後で、アセンブラは廃れてしまった。だから私はアセンブラを学んだ直後に使わなくなったようなもので、アセンブラらしい記述を十分に学ぶ暇もなく終わってしまった。それだけに、今アセンブラらしい記述に出会えたことがなおさら嬉しいのだ。
OR AL,AL
JNS A0C7
読みやすさを追求する高級言語ではこんな記述はあり得ない。アセンブラならではの醍醐味だと私は感じる。
今回は、そろりそろりと参ろう。
そろりそろりと「テニステニス2」を解析していたら、あるサブルーチンを発見した。小粒なルーチンだが、当時のPC-98プログラミングではしばしば必要になり、そのくせコーディングが意外と面倒なルーチンだ。Shift JIS文字コードをJIS文字コードに変換するルーチン。
なお、(今までの記事も含めて)ラベルの代わりにアドレスをそのまま書いているのをお許しいただきたい。先頭文字が数字でラベルとして通用しない場合もある。それはわかっているが、いつ解析が終わるともわからない膨大な量の逆アセンブル結果を前にして、いちいちラベル名を作って書いている余裕がなく、処理がわかればいいということにしている。
CMP AH,80
JZ A0D5
AHが80Hなら何もせず戻る
CMP AH,A0
JNB A0BE
そうでなくてAHがA0H以上ならA0BEHへ飛べ
SUB AH,70
JMP Short A0C1
AHがA0H未満ならば70Hを引き、A0C1へ飛んで、AHがA0H以上の場合と合流
A0BE: ;JNBのラベルはここ
SUB AH,B0
AHがA0H以上ならB0Hを引き、この下でAHがA0H未満の場合と合流
A0C1: ;JMP Shortのラベルはここ
OR AL,AL
JNS A0C7
ALのビット7が0ならA0C7Hへ飛べ
DEC AL
ALのビット7が1なら1を引き、この下でALのビット7が0の場合と合流
A0C7: ;JNSのラベルはここ
ADD AH,AH
AHを2倍する
CMP AL,9E
JB A0D1
ALが9EH未満ならばA0D1Hへ飛べ
SUB AL,5E
JMP Short A0D3
ALが9EH以上ならば5EHを引き、A0D3Hへ飛んでALが9EH未満の場合と合流せよ
A0D1: ;JBのラベルはここ
DEC AH
ALが9EH未満ならばAHから1を引き、この下でALが9EH以上の場合と合流
A0D3: ;JMP Shortのラベルはここ
SUB AL,1F
ALから1FHを引く
A0D5: ;JZのラベルはここ
RET
どんなプログラミング言語で記述しても結果としての動作は同じだが、いくつかの場所でアセンブラらしいコーディングをしているのが私は嬉しい。私が若い頃にMASMを買ったすぐ後で、アセンブラは廃れてしまった。だから私はアセンブラを学んだ直後に使わなくなったようなもので、アセンブラらしい記述を十分に学ぶ暇もなく終わってしまった。それだけに、今アセンブラらしい記述に出会えたことがなおさら嬉しいのだ。
OR AL,AL
JNS A0C7
読みやすさを追求する高級言語ではこんな記述はあり得ない。アセンブラならではの醍醐味だと私は感じる。
2016-06-25 15:01
コメント(0)
コメント 0
コメントの受付は締め切りました