0

関数09h割り込み21hdx=テキストのオフセット、ds=テキストのセグメント

C ++でセグメントとオフセットを取得するにはどうすればよいですか?

4

3 に答える 3

3

この回答にはいくつかの前提条件があります。

  1. DOS呼び出しは16ビットモードでのみ機能するため、16ビットコードを生成するコンパイラを使用しています。
  2. コンパイラはセグメントの概念を取得します。

その場合、それは次のとおりです。

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つはとです(コンパイラはそれらsmalllarge他の何かと呼ぶかもしれません):

  • 小:すべてのセグメントが同じ値であり、データとコードの合計が64k未満です
  • 大:すべてのコードとデータは多くのセグメントに存在し、コード+データは1メガ未満です

セグメントには他にもレイアウトがあり(1つのデータ、多くのコード、1つのコードと多くのデータなど)、コンパイラのドキュメントを参照して、何が利用できるかを確認する必要があります。

もちろん、最大の問題は、16ビットを実行するコンパイラを入手することです。

coutまたはを使用しないのはなぜprintfですか?

于 2010-04-11T17:52:37.827 に答える
1

リアルモードの場合、これらはデータへのFARポインタの上位16ビットと下位16ビット(それぞれ)です。

リアルモードポインタを使用し、ソフトウェア割り込みを直接呼び出すことができる環境は、最近では非常にまれです。sysenter最近のOSでは、ではなく命令を生成するユーザーモードラッパーを使用しますint

于 2010-04-11T17:41:05.873 に答える
0
#include <dos.h>

FP_SEG(&var);

varのセグメントを返します

FP_OFF(&var);

varのオフセットを返します

于 2010-04-19T08:07:45.200 に答える