今年は赤字決算の自営業者です。
さて,何とかIPLを解析した「晴れのちおおさわぎ」でしたが,IPLによって飛ばされた先のADVSHELL.COMの解析に手間取ってしまいました,ってまだ終わってないし。
IPLの解析同様,実機上でWizardV5を使って逆アセンブルした結果をテキスト化し,コメントを付けてプログラムの流れを理解するという作業をしていたのですが,MS-DOS上のEXEあるいはCOMファイルの逆アセンブラであるSDASM(こだまさん開発)を使ってみると,こりゃすごい。
今まで逆アセンブル結果からちまちま拾っていたCALL命令の飛び先,戻り先まで含めて,プログラムの流れを楽々追える。
と,喜んだのも束の間,逆アセンブルリストには謎の命令が。
2305:06BD 0FBE cts 0BEh
CTSって何?
コール元に戻る直前にこの命令があったので,すごく気になる。
ネットで検索してもニーモニックでCTSと書かれている記事はほとんどない。
解説のありそうな本を何冊か入手しても書かれていない。
万策尽きたかと思われた中,ようやくCTSの解説された書籍を入手。
「80x86 80x87―ファミリー・テクニカルハンドブック」
Robert L. Hummel (著), 槌田 浩一 (翻訳) ,技術評論社 (1993/11)刊。
答はあっけなかった。
「CTS
タスク・スイッチ・フラグ(TS)のクリア :Clear Task Switch Flag
CTSはCLTSの別ニーモニックである。命令の内容はCLTSの項目を参照。」
とある(337ページ)。
で,
「CLTS
タスク・スイッチ・フラグ(TS)のクリア :Clear Task Switch Flag in CR0/MSW
CLTSは,CR0制御レジスタ(80386と80486の場合)やマシン・ステータス・ワード(MSW)(80286の場合)のタスク・スイッチ(TS)フラグをクリアする。
タスク・スイッチ・フラグは,タスク・スイッチが起こるたびにプロセッサによってセットされるが,クリアするには,この命令を使わなければならない。オペレーティング・システムは,このフラグを利用して,新しいタスクがシステム資源にアクセスする前に,(数値演算コプロセッサの状態などの)必要な情報を保存することができる。」とのこと(329ページ)。
意味が分かりません(T_T)
最新のインテルの仕様書
IA-32 インテル ® アーキテクチャソフトウェア・デベロッパーズ・マニュアル中巻 A:命令セット・リファレンス A-Mの129ページによると,
「CLTS―Clear Task-Switched Flag in CR0
オペコード 0F 06
命令 CLTS
説明 CR0 の TS フラグをクリアする。
説明
CR0 レジスタ内のタスクスイッチ(TS)フラグをクリアする。この命令は、オペレーティング・システム内で使用することを目的としている。これは CPL = 0 でのみ実行できる特権命令である。この命令は、保護モード向けの初期化を可能にするため、実アドレスモードで実行できるようになっている。
プロセッサはタスクスイッチが行われるたびに TS フラグをセットする。このフラグは、マルチタスキング・アプリケーションでの FPU コンテキストのセーブを同期させるために使用される。このフラグの詳細については、『IA-32 インテル ® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻』の第 2 章の「制御レジスタ」の TS フラグに関する説明を参照のこと。」
とある。
マルチタスク処理をするときに必要なフラグのようです。
IA-32 インテル® アーキテクチャソフトウェア・デベロッパーズ・マニュアル下巻:システム・プログラミング・ガイドの54ページ以下を読んだけど,制御レジスタなんて初めて聞いたからわけ分かんね。8086CPUにもあるんだろうか。
PC-9801VM以降という範囲でいえば,CPUは8086互換どまりで,80286以上は予定してないだろうから,結局,8086CPUにおけるCTS命令の詳細は分からず終い。
何とも不完全燃焼ですが,まあとりあえず逆アセンブルリストからまったく知らないマシン語が消えたのは何より。
年内に「晴れのちおおさわぎ」を終わらせないと,今年はレビューできるゲームがなくなってしまう・・・。
さて,何とかIPLを解析した「晴れのちおおさわぎ」でしたが,IPLによって飛ばされた先のADVSHELL.COMの解析に手間取ってしまいました,ってまだ終わってないし。
IPLの解析同様,実機上でWizardV5を使って逆アセンブルした結果をテキスト化し,コメントを付けてプログラムの流れを理解するという作業をしていたのですが,MS-DOS上のEXEあるいはCOMファイルの逆アセンブラであるSDASM(こだまさん開発)を使ってみると,こりゃすごい。
今まで逆アセンブル結果からちまちま拾っていたCALL命令の飛び先,戻り先まで含めて,プログラムの流れを楽々追える。
と,喜んだのも束の間,逆アセンブルリストには謎の命令が。
2305:06BD 0FBE cts 0BEh
CTSって何?
コール元に戻る直前にこの命令があったので,すごく気になる。
ネットで検索してもニーモニックでCTSと書かれている記事はほとんどない。
解説のありそうな本を何冊か入手しても書かれていない。
万策尽きたかと思われた中,ようやくCTSの解説された書籍を入手。
「80x86 80x87―ファミリー・テクニカルハンドブック」
Robert L. Hummel (著), 槌田 浩一 (翻訳) ,技術評論社 (1993/11)刊。
答はあっけなかった。
「CTS
タスク・スイッチ・フラグ(TS)のクリア :Clear Task Switch Flag
CTSはCLTSの別ニーモニックである。命令の内容はCLTSの項目を参照。」
とある(337ページ)。
で,
「CLTS
タスク・スイッチ・フラグ(TS)のクリア :Clear Task Switch Flag in CR0/MSW
CLTSは,CR0制御レジスタ(80386と80486の場合)やマシン・ステータス・ワード(MSW)(80286の場合)のタスク・スイッチ(TS)フラグをクリアする。
タスク・スイッチ・フラグは,タスク・スイッチが起こるたびにプロセッサによってセットされるが,クリアするには,この命令を使わなければならない。オペレーティング・システムは,このフラグを利用して,新しいタスクがシステム資源にアクセスする前に,(数値演算コプロセッサの状態などの)必要な情報を保存することができる。」とのこと(329ページ)。
意味が分かりません(T_T)
最新のインテルの仕様書
IA-32 インテル ® アーキテクチャソフトウェア・デベロッパーズ・マニュアル中巻 A:命令セット・リファレンス A-Mの129ページによると,
「CLTS―Clear Task-Switched Flag in CR0
オペコード 0F 06
命令 CLTS
説明 CR0 の TS フラグをクリアする。
説明
CR0 レジスタ内のタスクスイッチ(TS)フラグをクリアする。この命令は、オペレーティング・システム内で使用することを目的としている。これは CPL = 0 でのみ実行できる特権命令である。この命令は、保護モード向けの初期化を可能にするため、実アドレスモードで実行できるようになっている。
プロセッサはタスクスイッチが行われるたびに TS フラグをセットする。このフラグは、マルチタスキング・アプリケーションでの FPU コンテキストのセーブを同期させるために使用される。このフラグの詳細については、『IA-32 インテル ® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻』の第 2 章の「制御レジスタ」の TS フラグに関する説明を参照のこと。」
とある。
マルチタスク処理をするときに必要なフラグのようです。
IA-32 インテル® アーキテクチャソフトウェア・デベロッパーズ・マニュアル下巻:システム・プログラミング・ガイドの54ページ以下を読んだけど,制御レジスタなんて初めて聞いたからわけ分かんね。8086CPUにもあるんだろうか。
PC-9801VM以降という範囲でいえば,CPUは8086互換どまりで,80286以上は予定してないだろうから,結局,8086CPUにおけるCTS命令の詳細は分からず終い。
何とも不完全燃焼ですが,まあとりあえず逆アセンブルリストからまったく知らないマシン語が消えたのは何より。
年内に「晴れのちおおさわぎ」を終わらせないと,今年はレビューできるゲームがなくなってしまう・・・。