name SEGMENT (align) (READONLY) (combine) (use) ('class')
(statements)
name ENDS
都立工業高等専門学校(現、東京都立産業技術高等専門学校)を卒業、
機械工学が専攻だった癖に論理回路やオーディオ関係の技術者らしい。
趣味として、音楽関係のフリーソフト開発や、DTM・チップチューン活動をしたり、
オーケストラや吹奏楽団でオーボエを吹いてる人。
MASM 5以前は、これらの定義を使っていたが、
MASM 6以降は、簡略化セグメントで、セグメント定義を簡略化可能。
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_name GROUP [name]...
指定したセグメントを、同一のセグメントにまとめる。
group_name
セグメントグループの名前。
name
セグメント名。
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
セグメントの並び方を、MS-DOSの仕様にする。
MS-DOS仕様のC言語等でコンパイルした*.objファイルとリンクする場合等に記述する。
heap | ヒープ領域(残りメモリ) |
STACK | スタックエリア |
BSS | 未初期化データ |
CONST | 初期化済みデータ(書き換え禁止) |
DATA | 初期化済みデータ |
FAR_BSS | far 領域の未初期化データ |
FAR_DATA | far 領域の初期化済みデータ |
_TEXT | コード領域 |
.code (name)
次の行以降を、コード用のセグメントに設定する。
name
セグメントの名前を指定する。
省略した場合、メモリモデルがTINY, SMALL, COMPACT, FLATの時は"_TEXT"、
メモリモデルがMEDIUM, LARGE, HUGEの時は、"module_TEXT"と設定される。
.const
セグメント名は、"CONST"が設定され、
次の行以降を、書き換え不可のデータ用のセグメントに設定する。
多くのC言語における、nearがつく変数領域と同一のセグメント。
.data
セグメント名は、"DATA"が設定され、
次の行以降を、書き換え可の、初期化済みデータセグメントに設定する。
多くのC言語における、nearがつく変数領域と同一のセグメント。
.data?
セグメント名は、"BSS"が設定され、
次の行以降を、書き換え可の、未初期化データセグメントに設定する。
多くのC言語における、nearがつく変数領域と同一のセグメント。
.fardata (name)
次の行以降を、書き換え可の、初期化済みデータセグメントに設定する。
name
セグメントの名前を指定する。
省略した場合、セグメント名は"FAR_DATA"と設定される。
.fardata? (name)
次の行以降を、書き換え可の、未初期化データセグメントに設定する。
name
セグメントの名前を指定する。
省略した場合、セグメント名は"FAR_BSS"と設定される。
.stack (size)
セグメント名を"STACK"で、スタック領域を確保する。
memorymodelが"TINY"の場合は、確保されないので注意。
size
スタック領域のサイズ[byte]を設定する。
省略した場合は、1024[byte]となる。
上のアドレスの『@』と『nifty』の間に『spa.』を追加して下さい。
画像で記載されているアドレスでも届きますが、スパム防止のフィルターを多数導入しています。
本ホームページはリンクフリーです。
リンクは、トップページ
"http://shaw.la.coocan.jp/"
にお願いいたします。