Top PageMASMのメモ書き TOP

セグメント定義

MASM 5以前は、これらの定義を使っていたが、
MASM 6以降は、簡略化セグメントで、セグメント定義を簡略化可能。

SEGMENT 〜 ENDS

書式


name	SEGMENT	(align) (READONLY) (combine) (use) ('class')

	(statements)

name	ENDS

説明

セグメントの名前、区間、属性等を設定する。

パラメータ

name
当該セグメントの名前を指定する。

align
アライメントを指定する。

align Starting Address
BYTE 1 [Byte]境界
WORD 2 [Byte]境界
DWORD 4 [Byte]境界
PARA 16 [Byte]境界(省略時のデフォルト)
PAGE 256 [Byte]境界
ALIGN(n) n [Byte]境界(nは、2のべき乗である事)

READONLY
これを指定した場合、当該セグメントは読み込み専用とする。
当該セグメントに書き込みを行う命令を記述した場合は、アセンブラーはエラーを出力する。

combine
*.objファイルのリンク時の動作を指定する。

combine Linker action
PRIVATE 他の*.objファイルから隠す。(省略時のデフォルト)
PUBLIC 他の*.objファイルと共有する。
STACK この属性のセグメントは全て連結し、
OSはSS:0000を下位アドレスに、SS:SPを上位アドレスに設定する。
初期化済データの配置は不可。
COMMON この属性のセグメントは結合する。
初期化済データの配置は不可。
MEMORY PUBLICに同義
AT addressセグメントアドレスを直接指定する。
このセグメントには、コード及び、初期化済データを配置できない。
当該セグメントにVRAM等の構造体を定義する事で、直接アクセスするコードを書くことが出来る。

use
80386〜専用。

use
USE16 オフセットアドレスを、16bitとして扱う。
USE32 オフセットアドレスを、32bitとして扱う。
FLAT

'class'
クラス名を指定する。
リンカはメモリ内で自動的に同じクラスの区分を分類する。
どこまで区分しているかは?。
".dosseg"ディレクティブ等で、セグメントを種類別に並べる為に使われるもの?

class
'CODE' コード領域である事を示す。
'FAR_DATA' 初期化データ領域である事を示す。
'FAR_BSS' 未初期化データ領域である事を示す。
'DATA' 初期化データ領域である事を示す。
'CONST' 初期化データ領域である事を示す。(書込み禁止)
'BSS' 未初期化データ領域である事を示す。
'STACK' スタック領域領域である事を示す。

以下、データや、ポインタの取得例。


	;セグメントアドレスを取得するコード(tinyモデル時不可)。
	mov	reg, name		;セグメント名
	mov	reg, GROUP	;セグメントのグループ名

	;変数(ラベル)のポインタ(オフセットアドレス)を取得する。
	mov	reg, offset name:label
	lea	reg, [name:label]			;どちらでも良い

	;指定したセグメント中の変数(ラベル)のデータを取得するコード。
	mov	reg, name:label
	mov	reg, [name:label]			;どちらでも良い

	;struct型の構造体labelのメンバー変数memberのポインタ(オフセットアドレス)を得る。
	lea	reg, name:label.member
	lea	reg, [name:label].member		;どちらでも良い
	lea	reg, (struct ptr [reg]).member	;構造体のポインタがレジスタの場合。

	;struct型の構造体labelのメンバー変数memberのデータを得る。
	mov	reg, name:label.member
	mov	reg, [name:label].member		;どちらでも良い
	mov	reg, (struct ptr [reg]).member	;構造体のポインタがレジスタの場合。
ASSUME擬似命令により、セグメント名"name:"や、構造体の型名"struct ptr"は省略可能。

GROUP

書式


group_name	GROUP	[name]...

説明

指定したセグメントを、同一のセグメントにまとめる。

パラメータ

group_name
セグメントグループの名前。

name
セグメント名。

ASSUME

書式


ASSUME	[segregister:name]...
ASSUME 	[dataregister:type]...;
ASSUME	[register:ERROR]...

説明

セグメントレジスタの場所(セグメント名)、データレジスタの型を仮定する。

パラメータ

segregister
セグメント・レジスタ

name
セグメント名、若しくは、セグメントグループ名。

dataregister
データ・レジスタ

type
型。(BYTE, WORD, DWORD, BYTE PTR, etc...)

SEGMENT 〜 ENDS項目の例において、セグメント名"(name:)"は、
ASSUME擬似命令にてDSレジスタをnameに仮定する事で省略化。
又、ある構造体メンバーを、レジスタ経由にてアクセスする場合に指定する"struct ptr"は、
ASSUME擬似命令にてレジスタの型を、その構造体に仮定する事で省略化。


	ASSUME	DS:name
	mov	reg, label

	ASSUME	bx:struct ptr
	mov	reg, [bx].member

簡略化セグメント

.dosseg

書式


.dosseg

説明

セグメントの並び方を、MS-DOSの仕様にする。
MS-DOS仕様のC言語等でコンパイルした*.objファイルとリンクする場合等に記述する。

heap ヒープ領域(残りメモリ)
STACK スタックエリア
BSS 未初期化データ
CONST 初期化済みデータ(書き換え禁止)
DATA 初期化済みデータ
FAR_BSS far 領域の未初期化データ
FAR_DATAfar 領域の初期化済みデータ
_TEXT コード領域

.code

書式


.code (name)

説明

次の行以降を、コード用のセグメントに設定する。

パラメータ

name
セグメントの名前を指定する。
省略した場合、メモリモデルがTINY, SMALL, COMPACT, FLATの時は"_TEXT"、
メモリモデルがMEDIUM, LARGE, HUGEの時は、"module_TEXT"と設定される。

.const

書式


.const

説明

セグメント名は、"CONST"が設定され、
次の行以降を、書き換え不可のデータ用のセグメントに設定する。
多くのC言語における、nearがつく変数領域と同一のセグメント。

.data

書式


.data

説明

セグメント名は、"DATA"が設定され、
次の行以降を、書き換え可の、初期化済みデータセグメントに設定する。
多くのC言語における、nearがつく変数領域と同一のセグメント。

.data?

書式


.data?

説明

セグメント名は、"BSS"が設定され、
次の行以降を、書き換え可の、未初期化データセグメントに設定する。
多くのC言語における、nearがつく変数領域と同一のセグメント。

.fardata

書式


.fardata (name)

説明

次の行以降を、書き換え可の、初期化済みデータセグメントに設定する。

パラメータ

name
セグメントの名前を指定する。
省略した場合、セグメント名は"FAR_DATA"と設定される。

.fardata?

書式


.fardata? (name)

説明

次の行以降を、書き換え可の、未初期化データセグメントに設定する。

パラメータ

name
セグメントの名前を指定する。
省略した場合、セグメント名は"FAR_BSS"と設定される。

.stack

書式


.stack (size)

説明

セグメント名を"STACK"で、スタック領域を確保する。
memorymodelが"TINY"の場合は、確保されないので注意。

パラメータ

size
スタック領域のサイズ[byte]を設定する。
省略した場合は、1024[byte]となる。