コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「DOS MZ executable」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m編集の要約なし
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
26行目: 26行目:
EXEファイルには、通常、コード、データ、およびスタック用の個別のセグメントがある。 プログラムの実行はコードセグメントのアドレス0から始まり、スタックポインターレジスタはヘッダー情報に含まれる値に設定される(したがって、ヘッダーが512バイトスタックを指定している場合、スタックポインターは200hに設定される)。 個別のスタックセグメントを使用せずに、必要に応じて単純にスタックのコードセグメントを使用することもできる。
EXEファイルには、通常、コード、データ、およびスタック用の個別のセグメントがある。 プログラムの実行はコードセグメントのアドレス0から始まり、スタックポインターレジスタはヘッダー情報に含まれる値に設定される(したがって、ヘッダーが512バイトスタックを指定している場合、スタックポインターは200hに設定される)。 個別のスタックセグメントを使用せずに、必要に応じて単純にスタックのコードセグメントを使用することもできる。


DS(データセグメント)レジスタには通常、CS(コードセグメント)レジスタと同じ値が含まれており、EXEファイルが初期化されると、データセグメントの実際のセグメントアドレスはロードされない。プログラマーが自分で設定する必要があり、通常は次の手順で行う。 <source lang="nasm" >
DS(データセグメント)レジスタには通常、CS(コードセグメント)レジスタと同じ値が含まれており、EXEファイルが初期化されると、データセグメントの実際のセグメントアドレスはロードされない。プログラマーが自分で設定する必要があり、通常は次の手順で行う。 <syntaxhighlight lang="nasm" >
MOV AX, @DATA
MOV AX, @DATA
MOV DS, AX
MOV DS, AX
</source> 元のDOS 1.x APIでは、プログラム終了時にPSPのあるセグメントを指すDSレジスタも必要であった。これは、次の手順で実行された。 <source lang="nasm" >
</syntaxhighlight> 元のDOS 1.x APIでは、プログラム終了時にPSPのあるセグメントを指すDSレジスタも必要であった。これは、次の手順で実行された。 <syntaxhighlight lang="nasm" >
PUSH DS
PUSH DS
XOR AX, AX
XOR AX, AX
PUSH AX
PUSH AX
</source> その後、プログラムの終了はRETF命令によって実行され、スタックからPSPを使用して元のセグメントアドレスを取得し、INT 20h命令を含むアドレス0にジャンプする。
</syntaxhighlight> その後、プログラムの終了はRETF命令によって実行され、スタックからPSPを使用して元のセグメントアドレスを取得し、INT 20h命令を含むアドレス0にジャンプする。


DOS 2.x APIでは、プログラムの開始時にPSPセグメントアドレスを保存する必要のないINT 21h Function 4Chという新しいプログラム終了関数を導入し、マイクロソフトは古いDOS 1.x方式は使用しないよう推奨した。
DOS 2.x APIでは、プログラムの開始時にPSPセグメントアドレスを保存する必要のないINT 21h Function 4Chという新しいプログラム終了関数を導入し、マイクロソフトは古いDOS 1.x方式は使用しないよう推奨した。

2020年7月5日 (日) 23:12時点における版

DOS MZ executable
拡張子.exe
MIMEタイプapplication/x-dosexec、application/x-msdos-program、application/x-ms-dos-executable
マジック
ナンバー
MZ or ZM
種別バイナリ, 実行可能
拡張New Executable
Linear Executable
Portable Executable

DOS MZ実行可能形式は、DOSEXEファイルに使用される実行可能形式ファイルである。

この形式は、ファイルの先頭にあるASCII文字列「MZ」(16進数 :4D 5A)(「 マジックナンバー」)で識別できる。「MZ」は、MS-DOSの主要な開発者の1人であるMark Zbikowskiの頭文字である[1]

MZ DOS実行可能ファイルは、 COM実行可能形式よりも新しく形式が異なる。 DOS実行可能ヘッダーには、複数のセグメントを任意のメモリアドレスにロードできるリロケーション情報が含まれ、64キロバイトを超える実行可能ファイルをサポートする。ただし、この形式では依然として使用可能メモリ量が制限される。 この制限は、後にDOSエクステンダで回避されることになる。

DOSで実行されるEXEプログラムの環境に関する情報は、プログラムセグメントプレフィクス (PSP) に格納されている。

EXEファイルには、通常、コード、データ、およびスタック用の個別のセグメントがある。 プログラムの実行はコードセグメントのアドレス0から始まり、スタックポインターレジスタはヘッダー情報に含まれる値に設定される(したがって、ヘッダーが512バイトスタックを指定している場合、スタックポインターは200hに設定される)。 個別のスタックセグメントを使用せずに、必要に応じて単純にスタックのコードセグメントを使用することもできる。

DS(データセグメント)レジスタには通常、CS(コードセグメント)レジスタと同じ値が含まれており、EXEファイルが初期化されると、データセグメントの実際のセグメントアドレスはロードされない。プログラマーが自分で設定する必要があり、通常は次の手順で行う。

  MOV AX, @DATA
  MOV DS, AX

元のDOS 1.x APIでは、プログラム終了時にPSPのあるセグメントを指すDSレジスタも必要であった。これは、次の手順で実行された。

  PUSH DS
  XOR AX, AX
  PUSH AX

その後、プログラムの終了はRETF命令によって実行され、スタックからPSPを使用して元のセグメントアドレスを取得し、INT 20h命令を含むアドレス0にジャンプする。

DOS 2.x APIでは、プログラムの開始時にPSPセグメントアドレスを保存する必要のないINT 21h Function 4Chという新しいプログラム終了関数を導入し、マイクロソフトは古いDOS 1.x方式は使用しないよう推奨した。

互換性

MZ DOS実行ファイルは、DOSおよびWindows 9xベースのオペレーティングシステムから実行できる。 32ビットWindows NTベースのオペレーティングシステムでは、組み込みの仮想DOSマシンで実行できる(ただし、一部のグラフィックモードはサポートされていない)。 64ビットバージョンのWindowsでは実行できない。 これらの実行可能ファイルは、 DOSBox 、 DOSEMU、WineCygwin を使っても実行できる。

MZ DOS実行ファイルは、 Digital Mars Optlink、MSリンカー、VALXまたはOpen WatcomのWLINK、FASMなどのリンカを使って作成できる。

関連項目

脚注

  1. ^ Inside Windows: An In-Depth Look into the Win32 Portable Executable File Format - MSDN Magazine, February 2002. "Every PE file begins with a small MS-DOS executable. ... The first bytes of a PE file begin with the traditional MS-DOS header, called an IMAGE_DOS_HEADER. The only two values of any importance are e_magic and e_lfanew. ... The e_magic field (a WORD) needs to be set to the value 0x5A4D. ... In ASCII representation, 0x5A4D is MZ, the initials of Mark Zbikowski, one of the original architects of MS-DOS."

外部リンク