[機械語サブルーチンの作成の詳細]
[SAMPLE41]実行ProgramのLoad
または[SAMPLE42]機械語Programの書き込み
および、[MACHINEWORD] 参照。
これらに具体例がありますが、
ここでは、VisualStudioC++のConsoleApplicationによるCプログラムの作
成方法を説明します。
VisualStudio_V6、VisualStudio.NET、VisualStudio2005について説明します。
******************************
[1] VisualStudio_V6 C++の場合
(1)プロジェクトの新規作成
ファイル->新規作成->プロジェクトタブ->Win32 Console Application
->プロジェクト名に例えばMyC1など->
および新規にワークスペースを作成にチェック->OK->
コンソールアプリケーションの種類で空のプロジェクトにチェック->終了->OK
(2)Cおよび Hファイルの追加
ここではMakeMachineWordフォルダーに添付のC_SORT_INSERTプログラムをCopyして使い
ます。MAIN.CとMAIN.Hをあらかじめ(1)で作成したMyC1のフォルダーにCopyしておきます。
ワークスペースのFileViewのタブのSourceFileフォルダーを
右クリック->ファイルをフォルダーに追加->MAIN.Cを追加。
HeaderFileフォルダーを右クリック->ファイルをフォルダーに追加->MAIN.Hを追加。
(3)実行ファイルのビルド
Win32 Releaseに切り替えて(ビルド->アクティブな構成の設定
-> Win32 Releaseに切り替える)、ビルド->リビルド
これで、MyC1のフォルダーのReleaseフォルダーに実行ファイルMyC1.EXEが作られます。
このファイルは実行開始番地が 1000Hです。
理由は 関連のHELPを見て下さい。これはCompilerにより異なります。
実行開始番地はファイル内容をDumpすれば分かります。
先頭にはFileHeaderが 100H程度あり、以降 00が続き、
1000H番地に入ると、実行内容が書かれています。
これは同封のMakeMachineWordフォルダーのHexaDumpフォルダーの
HexaDump.exeを実行すれば表示できます。
VisualStudio6の場合は、ファイル->開く->ファイルの種類はexeファイルとし、
用途はバイナリーとし、当該のReleaseフォルダーのMyC1.EXEを開いても表示されます。
このファイルをMBASIC.EXEでそのままCALLするときには、
BLOAD命令でLoadして、CALL命令で、&H1000から実行します。
下記のとうりです。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1.EXE",M% メモリー領域の offset 0のところからLOADします。
B%=&H1000
CALL B%(I%, J%) メモリーの offset 1000H番地にJUMPします。
I%、J%は MyC1.EXEの内部で使う引数です。
機械語の最後のReturn命令で帰ってきます。
(4)機械語SubroutineのHeader部分のCutについて
上記の方法で実用上は問題ないのですが、
ファイル内の実行開始番地1000HまではCut出来ます。
MBASICのBSAVE命令で1000H番地から以降だけをSave出来ます。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1.EXE",M% メモリー領域のoffset 0のところからLOADします。
B%=&H1000
BSAVE "MyC1_0",B%, &H8000 Tailまで長さ9000H - 開始オフセット1000Hです。
但し、これは実行するとき、BLOADして0番地より実行となります。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1_0", M% メモリー領域のoffset 0のところからLOADします。
B%=0
CALL B%(I% , J%) メモリーのoffset 0H番地にJUMPします。
I% , J%はMyC1_0.EXEの内部で使う引数です。
機械語の最後のReturn命令で帰ってきます。
(5)機械語SubroutineのTail部分のCutについて
上記の方法で実用上は問題ないのですが、
ファイルの実行部分以降(RETURN文以降)最後まではCut出来ます。
最終部分はRETURN命令が目印で、Hexaでは C3です。
コンパイラーは最後のRETURN命令のあと、
16バイトのAlignmentのためNOP命令 (Hexaでは90)で埋めます。
このC_SORT_INSERTの例では、10CAH番地のC3です。
10D0H以下をCutできます。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1.EXE", M% メモリー領域のoffset 0のところからLOADします。
B%=&H1000
BSAVE "MyC1_0_T", B%, &HD0 10CFHまで長さ 10D0H - 開始オフセット1000Hです。
但し、これは実行するとき、BLOADして 0番地より実行となります。
注意.
内部でSQRTやSINなどの内部組み込み関数を使用した場合、
この部分の後続コードがあります。
コードセクションのサイズはSTART POINT 関連のHELPを見て下さい。
実行開始位置からの正確なサイズが分かります。
実用上はもっと小さくTailCutできます。
******************************
[2] VisualStudio.NET C++の場合
(1)プロジェクトの新規作成
メニューのファイル->新規作成->プロジェクト->新しいプロジェクトのダイアログ
->Visual C++プロジェクトをクリック->Win32 プロジェクト->
プロジェクト名に例えばMyC1など->OK->Win32アプリケーションウィザード
->左のアプリケーションの設定をクリック->アプリケーションの種類で
コンソールアプリケーションのボタンを選択、追加のオプションでは
空のプロジェクト(サポートの追加は選ばない)->完了
これで、メニューの表示->ソリューションエクスプローラをクリック
->画面右にソリューションエクスプローラが表示される。
(2) .Cおよび .Hファイルの追加
ここではMakeMachineWordフォルダーに添付のC_SORT_INSERTプログラムをCopyして使います。
MAIN.CとMAIN.Hをあらかじめ(1)で作成したMyC1のフォルダーにCopyしておきます。
ソリューションエクスプローラのSourceFileフォルダーを右クリック
->追加->既存項目の追加->MAIN.Cを追加。
HeaderFileフォルダーを右クリック->追加->既存項目の追加->MAIN.Hを追加。
(3)実行ファイルのビルド
Win32 Releaseに切り替えて(ビルド->構成マネージャー->
Win32 Releaseに切り替える)、ビルド->リビルド
これで、MyC1のフォルダーのReleaseフォルダーに実行ファイルMyC1.EXEが作られます。
このファイルは実行開始番地が400Hです。
理由は 関連のHELP
を見て下さい。これはCompilerにより異なります。
実行開始番地はファイル内容をDumpすれば分かります。
先頭にはFileHeaderが 100H程度あり、以降 00が続き、400H番地に入ると、
実行内容が書かれています。
これは同封のMakeMachineWordフォルダーのHexaDumpフォルダーのHexaDump.exe
を実行すれば表示できます。
このファイルをMBASIC.EXEでそのままCALLするときには、
BLOAD命令でLoadして、CALL命令で、&H400から実行します。
下記のとうりです。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1.EXE", M% メモリー領域のoffset 0のところからLOADします。
B%=&H400
CALL B%(I% , J%) メモリーのoffset 400H番地にJUMPします。
I%, J%はMyC1.EXEの内部で使う引数です。
機械語の最後のReturn命令でBASICに帰ってきます。
(4)機械語SubroutineのHeader部分のCutについて
上記の方法で実用上は問題ないのですが、
ファイル内の実行開始番地 400HまではCut出来ます。
MBASICのBSAVE命令で400H番地から以降だけをSave出来ます。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1.EXE", M% メモリー領域のoffset 0のところからLOADします。
B%=&H40
BSAVE "MyC1_0", B%, &H4E00 Tailまで長さ5200H - 開始オフセット400Hです。
但しこれは実行するとき、BLOADして 0番地より実行となります。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1_0", M% メモリー領域のoffset 0のところからLOADします。
B%=0
CALL B%(I% , J%) メモリーのoffset 0H番地にJUMPします。
I% , J%はMyC1.EXEの内部で使う引数です。
機械語の最後のReturn命令でBASICに帰ってきます。
(5)機械語SubroutineのTail部分のCutについて
上記の方法で実用上は問題ないのですが、
ファイルの実行部分以降(RETURN文以降)最後まではCut出来ます。
最終部分はRETURN命令が目印で、Hexaでは C3です。
コンパイラーは最後のRETURN命令のあと16バイトの
AlignmentのためNOP (Hexaでは90)で埋めます。
このC_SORT_INSERTの例では、4D6H番地のC3です。
4D6H以下をCutできます。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1.EXE", M% メモリー領域のoffset 0のところからLOADします。
B%=&H400
BSAVE "MyC1_0_T", B%, &HE0 4D6Hまでの長さ4D6H - 開始オフセット40Hです。
但しこれは実行するとき、BLOADして 0番地より実行となります。
注意.
内部でSQRTやSINなどの内部組み込み関数を使用した場合、この部分の後続コードがあります。
コードセクションのサイズは[実行開始位置] 関連のHELPを見て下さい。
実行開始位置からの正確なサイズが分かります。
実用上はもっと小さくTailCutできます。
******************************
[3] VisualStudio2005 C++の場合
(1)プロジェクトの新規作成
メニューのファイル->新規作成->プロジェクト->新しいプロジェクトのダイアログ
->プロジェクトの種類でVisual C++のWin32 をクリック
->右側のテンプレートではWin32コンソールアプリケーション->下のプロ
ジェクト名に例えばMyC1など->OK->
Win32アプリケーションウイザードへようこその画面で左側のアプリケーションの設定を
クリック->アプリケーションの種類でコンソールアプリケーションのボタンを選択、
追加のオプションでは空のプロジェクト->完了
これで、メニューの表示->ソリューションエクスプローラをクリック->
画面左にソリューションエクスプローラが表示される。
(2) .C および .Hファイルの追加
ここではMakeMachineWordフォルダーに添付のC_SORT_INSERTプログラムをCopyして使います。
MAIN.CとMAIN.Hをあらかじめ(1)で作成したMyC1のフォルダー(ルート)
にCopyしておきます。
ソリューションエクスプローラのSourceFileフォルダーを右クリック
->追加->既存項目の追加->MAIN.Cを追加。
HeaderFileフォルダーを右クリック->追加->既存項目の追加->MAIN.Hを追加。
このときリソースフォルダーを削除しておけば、EXEファイルのサイズが小さくなります。
(3)実行ファイルのビルド
Win32 Releaseに切り替えて(ビルド->構成マネージャー
-> Win32 Releaseに切り替える)、ビルド->リビルド
これで、MyC1のフォルダーのReleaseフォルダーに実行ファイルMyC1.EXEが作られます。
このファイルは実行開始番地が400Hです。
理由は[実行開始位置] 関連のHELPを見て下さい。
これはコンパイラーにより異なります。
実行開始番地はファイル内容をDumpすれば分かります。
先頭にはFileHeaderが100H 程度あり、以降00が続き、400H番地に入ると、
実行内容が書かれています。
これは同封のMakeMachineWordフォルダーのHexaDumpフォルダーのHexaDump.exe
を実行すれば表示できます。
このファイルをMBASIC.EXEでそのままCALLするときには、
BLOAD命令でLoadして、CALL命令で、&H400から実行します。
下記のとうりです。
DEF SEG = DEFUSER これは必須です。
機械語領域を MBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1.EXE", M% メモリー領域の offset 0のところからLOADします。
B%=&H400
CALL B%(I% , J%) メモリーの offset 400H番地にJUMPします。
I% , J% はMyC1.EXEの内部で使う引数です。
機械語の最後のReturn命令でBASICに帰ってきます。
(4)機械語SubroutineのHeader部分のCutについて
上記の方法で実用上は問題ないのですが、
ファイル内の実行開始番地400HまではCut出来ます。
MBASICのBSAVE命令で400H番地から以降だけをSave出来ます。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1.EXE", M% メモリー領域の offset 0のところからLOADします。
B%=&H40
BSAVE "MyC1_0",B%, &H4E00 Tailまで、長さ 5200H - 開始オフセット400Hです。
但し、これは実行するとき、BLOADして 0番地より実行となります。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1_0", M% メモリー領域の offset 0のところからLOADします。
B%=0
CALL B%(I% , J%) メモリーの offset 0H番地にJUMPします。
I% , J%は MyC1.EXEの内部で使う引数です。
機械語の最後のReturn命令で帰ってきます。
(5)機械語Subroutineのail部分のCutについて
Project作成の段階でリソースフォルダーを削除しておけば、十分に小さなサイズとなります。
上記の方法で実用上は問題ないのですが、
ファイルの実行部分以降(RETURN文以降)最後まではCut出来ます。
最終部分はRETURN命令が目印で、HexaではC3です。
コンパイラーは最後のRETURN命令のあと16バイトの
AlignmentのためNOP(Hexaでは90)で埋めます。
このC_SORT_INSERTの例では、4D6H番地のC3です。
4D6H以下をCutできます。
DEF SEG = DEFUSER これは必須です。
機械語領域をMBASIC.EXEの定めたところにします。
M%=0
BLOAD "MyC1.EXE", M% メモリー領域の offset 0 のところからLOADします。
B%=&H400
BSAVE "MyC1_0_T", B%, &HE0 4D6H番地までの長さ 4E0H - 開始オフセット400Hです。
但しこれは実行するとき、BLOADして 0番地より実行となります。
注意.
内部でSQRTやSINなどの内部組み込み関数を使用した場合、この部分の後続コードがあります。
コードセクションのサイズは [実行開始位置] 関連のHELPを見て下さい。
実行開始位置からの正確なサイズが分かります。
実用上はもっと小さくTailCutできます。