関数09h割り込み21hdx=テキストのオフセット、ds=テキストのセグメント
C ++でセグメントとオフセットを取得するにはどうすればよいですか?
この回答にはいくつかの前提条件があります。
その場合、それは次のとおりです。
char string [] = "Hello World$";
call_int21h_9 (&string);
ここで、call_int21h_9は次のようなものです。
call_int21h_9 (FAR char *string)
// the FAR above is important and very compiler dependent, it tells the compiler
// that the pointer is a 32bit pointer (16 bit segment and 16 bit offset)
{
mov ah,9
lds dx,string ; this loads the DS:DX segment:offset from the value on the stack
int 21h
}
これに加えて、セグメントの設定方法と使用方法に応じて、16ビットアプリケーションをコンパイルする方法がいくつかあります。最も一般的な2つはとです(コンパイラはそれらsmall
をlarge
他の何かと呼ぶかもしれません):
セグメントには他にもレイアウトがあり(1つのデータ、多くのコード、1つのコードと多くのデータなど)、コンパイラのドキュメントを参照して、何が利用できるかを確認する必要があります。
もちろん、最大の問題は、16ビットを実行するコンパイラを入手することです。
cout
またはを使用しないのはなぜprintf
ですか?
リアルモードの場合、これらはデータへのFARポインタの上位16ビットと下位16ビット(それぞれ)です。
リアルモードポインタを使用し、ソフトウェア割り込みを直接呼び出すことができる環境は、最近では非常にまれです。sysenter
最近のOSでは、ではなく命令を生成するユーザーモードラッパーを使用しますint
。
#include <dos.h>
FP_SEG(&var);
varのセグメントを返します
FP_OFF(&var);
varのオフセットを返します