15
MASM32 【アセンブラ 基礎Ⅱ noa】 -1- MASM32 の基本 MASM MASM8086)の命令 ・擬似命令(ディレクティブ、Directives・機械語命令(ニーモニック、Mnemonic・演算子(オペレータ、Operators・シンボル(SymbolMASM8086)の用法 ・使用可能文字 ・数値表現 ・データ型 ・命令ステートメントの書式 ・定義擬似命令ステートメントの書式(変数定義、定数定義) MASM32 プログラムの基本形 MASM32 プログラムの書式 EQU 擬似命令、MACRO ENDM 擬似命令、SEGMENT ENDS 擬似命令 ASSUME 擬似命令、ORG 擬似命令、END 擬似命令 記述例 ・アセンブルと機械語 今回の課題項目 MASM8086)の命令 MASM8086)の用法 MASM32 プログラムの基本形 今回の重点項目

MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-1-

MASM32 の基本

MASM ②

□ MASM(8086)の命令

・擬似命令(ディレクティブ、Directives)

・機械語命令(ニーモニック、Mnemonic)

・演算子(オペレータ、Operators)

・シンボル(Symbol)

□ MASM(8086)の用法

・使用可能文字

・数値表現

・データ型

・命令ステートメントの書式

・定義擬似命令ステートメントの書式(変数定義、定数定義)

□ MASM32 プログラムの基本形

・MASM32 プログラムの書式

・EQU 擬似命令、MACRO ~ ENDM 擬似命令、SEGMENT ~ ENDS 擬似命令

・ASSUME 擬似命令、ORG 擬似命令、END 擬似命令

□ 記述例

・アセンブルと機械語

今回の課題項目

□ MASM(8086)の命令

□ MASM(8086)の用法

□ MASM32 プログラムの基本形

今回の重点項目

Page 2: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-2-

■ MASM32(8086)の命令 ■

■ 擬似命令(ディレクティブ、Directives)

擬似命令は、レジスタやメモリを直接操作する命令では無く、アセンブラに対してアセンブルに関する

指示を与える命令で、アセンブル時に機械語に変換され無い。8086 の擬似命令セット(Directives)を、

下表に示す。

区分 擬似命令

メモリ構成 メモリ擬似命令 SEGMENT ~ ENDS、PROC ~ ENDP、

ASSUME、ASSUME NOTHING、ORG、

END、COMMENT、STRUC ~ ENDS

定義擬似命令 EQU、=、DB、DW、DD、DQ、DT、LABEL、

NAME、RADIX、RECORD、GROUP

其他擬似命令 EXTRN、PUBLIC、EVEN、INCLUDE

マクロ メモリ擬似命令 MACRO ~ ENDM

制御擬似命令 EXITM、PURGE、IRP、IRPC、REPT

シンボル生成擬似命令 LOCAL

条件アセンブル 条件ブロック定義擬似命令 IF、IFE、IFB、IFNB、IFDEF、IFNDEF、

IFDIF、IFIDN、IF1、IF2、ELSE、ENDIF

リスト制御 リスト制御擬似命令 .LIST、.XLIST

クロスリファレンス制御擬似命令 .CREF、.XCREF

条件リスティング擬似命令 .LFCOND、.SFCOND、.TFCOND

マクロ制御擬似命令 .LALL、.SALL、.XALL

其他擬似命令 TITLE、SUBTTL、PAGE、%OUT

※ 上記の擬似命令の内、下記の旧欄に示す擬似命令は、現在の MASM32 では、新欄に示す擬似命令に

変更されて居る。

旧 新 内容

IRPC FORC 文字列のの各文字毎の繰返ブロックの定義

REPT REPEAT 繰返ブロックの定義

%OUT ECHO 標準出力デバイス(既定では画面)にメッセージをを表示

.XLIST .NOLIST 総てのリストの非作成を指示

.SFCOND .NOLISTIF 条件の評価が偽の部分のリストの非作成を指示

.XCREF .NOCREF クロスレファレンスの非作成を指示

.SALL .NOLISTMACRO マクロの展開のリストの非作成を指示

.LFCOND .LISTIF 偽の条件ブロックのステートメントのリストの作成を指示

.XALL .LISTMACRO マクロ展開ステートメントのリストの作成を指示

.LALL .LISTMACROALL マクロの総てのステートメントのリストの作成を指示

※ 上記は、8086 の擬似命令で有り、現在の MASM32 では、64 ビットにも対応して居る為、更に多く

の擬似命令を使用する事が出来る(アネックス参照)。

命命令令・・概概要要

Page 3: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-3-

■ 機械語命令(ニーモニック、Mnemonic)

機械語命令は、オペコードとも謂い、レジスタやメモリ等のハードウェアを直接操作して演算を行う為

の命令で、アセンブル時に一対一で機械語に変換される。8086 の命令セット(Instruction Set)を、

下表に示す。

区分 ニーモニック

転送命令 汎用データ転送命令 MOV、PUSH、POP、XCHG

アキュムレータ転送命令 IN、OUT、XLAT

アドレス・オブジェクト転送命令 LEA、LDS、LES

フラグレジスタ転送命令 LAHF、SAHF、PUSHF、POPF

算術演算命令 加算命令 ADD、ADC、INC、AAA、DAA

減算命令 SUB、SBB、DEC、NEG、CMP、AAS、DAS

乗算命令 MUL、IMUL、AAM

除算命令 DIV、IDIV、AAD、CBW、CWD

論理演算命令 単項論理命令 シフト命令 SHL、SAL、SHR、SAR

ローテート命令 ROL、ROR、RCL、RCR

否定 NOT

2 項論理命令 AND、OR、XOR、TEST

ストリング命令 プリフックス命令 REP、REPE、REPZ、REPNE、REPNZ

プリミティブ命令 MOVS、MOVSB、MOVSW、CMPS、SCAS、

LODS、STOS

分岐命令 サブルーチン制御転送命令 CALL、RET

無条件制御転送命令 JMP

条件付制御転送命令 JE、JZ、JL、JNGE、JLE、JNG、JB、JNAE、

JBE、JNA、JP、JPE、JO、JS、JNE、JNZ、

JNL、JGE、JNLE、JG、JNB、JAE、JNBE、

JA、JNP、JPO、JNO、JNS

繰返転送命令 LOOP 、 LOOPZ 、 LOOPE 、 LOOPNZ 、

LOOPNE、JCXZ

割込転送命令 INT、INTO、IRET

其他命令 フラグ制御命令 CLC、CMC、STC、CLD、STD、CLI、STI

CPU 制御命令 HLT、WAIT、ESC、LOCK、NOP

上表の機械語命令は、命令の中心部で有るニーモニック(オペコード)而巳を表して居るが、実際の命

令は、下図の様に、3 種の記述形式が有る。

1. ニーモニック

2. ニーモニック オペランド

3. ニーモニック 第 1 オペランド , 第 2 オペランド

(ディスティネーション) (ソース)

オペランドは、ニーモニックのパラメータ(処理対象)と成る物で、2 個のオペランドが有る場合、通

常、第 1 オペランドをディスティネーション、第 2 オペランドをソースと呼び、処理結果は、第 1 オペ

ランドに格納される。

※ 上記は、8086 の機械語命令で有り、現在の MASM32 では、64 ビットにも対応して居る為、更に多

くの機械語命令を使用する事が出来る(アネックス参照)。

Page 4: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-4-

■ 演算子(オペレータ、Operators)

オペランドは、式(Expression)で表現する事が出来、式中には、下記に示す算術演算子、論理演算子、

関係演算子等を使用する事が出来る。8086 の演算子(Operators)を、下表に示す。

区分 演算子

算術演算子 加減乗除 +、-、*、/、MOD

シフト SHR、SHL

論理演算子 ビット演算 AND、OR、XOR、NOT

関係演算子 比較 EQ、NE、LT、LE、GT、GE

属性演算子 アドレス取得 SEG、OFFSET

型・サイズ取得 TYPE、SIZE、LENGTH

型変換 PTR、SHORT

変数・ラベル生成 THIS

抽出 HIGH、LOW

セグメントオーバーライド CS:、DS:、ES:、SS:

演算子には、複数の演算子が使用されて居る時に孰れの演算を先に評価するかを決める為に、優先順位

が有り、優先順位の高い物から順に評価が為される。優先順位が同じ場合は、一般に、左から順に評価

される(右から順に評価される物も有る)。

演算子の優先順位(Operator Precedence)

優先順位 演算子

高順位

低順位

1 LENGTH、SIZE、 ( )、[ ]

2 CS:、DS:、ES:、SS:

3 PTR、OFFSET、TYPE、THIS

4 HIGH、LOW

5 +、-(単項演算子)

6 *、/、MOD、SHL、SHR

7 +、-(2 項演算子)

8 EQ、NE、LT、LE、GT、GE

9 NOT

10 AND

11 OR、XOR

12 SHORT

猶、優先順位を変える為に、最も優先順位の高いパーレン( ( ) )の使用は、有効な手段で有る。下記

の例では、優先順位の低い OR の方が、優先順位の高い AND よりも先に評価される。

A and ( B or C )

上記の優先順位を総て覚える事は困難なので、不明な場合は、パーレンを使用して、明示的に優先順位

を指定する方法を採る事を推奨する。

※ 上記は、8086 の演算子で有り、現在の MASM32 では、64 ビットにも対応して居る為、更に多くの

演算子を使用する事が出来る(アネックス参照)。

Page 5: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-5-

■ シンボル(Symbol)

アセンブラのソースプログラムの中でメモリの位置、データの値を示す為に利用される名前をシンボル

と謂う。シンボル定数,変数,ラベル等が有る。命名法が決められて居て,MASM では、シンボルに

日本語の表記は使えない。シンボルには、アセンブラが既に定義して居る名前も有る。下記に、アセン

ブラが既に定義して居るシンボルを示す。

日時シンボル(Date Time Symbol)

シンボル 内容

@Date システムの日付を mm/dd/yy 形式で表す(テキストマクロ)。

@Time システム時刻(24 時間制)を hh:mm:ss 形式で表す(テキストマクロ)

環境情報シンボル(Environment Symbol)

シンボル 内容

@Cpu プロセッサモードを示すビットマスク(数値の等価記号)

@Environ 環境変数 envvar の値(マクロ関数)

@Interface 言語パラメータに関する情報(数値の等価記号)

@Version MASM 6.15 では 615(テキストマクロ)

ファイル情報シンボル(File Symbol)

シンボル 内容

@FileCur 現在のファイルの名前(テキストマクロ)

@FileName アセンブル対象のメインファイルの基本名(テキストマクロ)

@Line 現在のファイルのソースの行番号(数値の等価記号)

マクロ関数シンボル(Macro Symbol)

シンボル 内容

@CatStr 1 個以上の文字列を連結するマクロ関数(文字列を返す)

@InStr 検索文字列が最初に見付かった位置を返すマクロ関数(整数を返す)

@SizeStr 指定された文字列の長さを返すマクロ関数(整数を返す)

@SubStr 部分文字列を返すマクロ関数(文字列を返す)

セグメント情報シンボル(Segment Symbol)

シンボル 内容

@code コードセグメントの名前(テキストマクロ)

@CodeSize メモリモデルの種類の値(数値の等価記号)

@CurSeg 現在のセグメントの名前(テキストマクロ)

@data 既定のデータグループの名前(テキストマクロ)

@DataSize メモリモデルの種類の値(数値の等価記号)

@fardata .FARDATA 擬似命令で定義されたセグメントの名前(テキストマクロ)

@fardata? .FARDATA? 擬似命令で定義されたセグメントの名前(テキストマクロ)

@Model メモリモデルの種類の値(数値の等価記号)

@stack near スタックか far スタックの種類の文字列(テキストマクロ)

@WordSize 16ビットセグメントか32ビットセグメントの種類の値(数値の等価記号)

其他シンボル(Other Symbol)

シンボル 内容

$ 位置カウンタの現在の値。

? データ宣言で使用(領域を確保する為に使用し初期化は行わない)

@@: コードラベルの定義

@B 前の @@: ラベルの位置

@F 次の @@: ラベルの位置

Page 6: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-6-

■ MASM32(8086)の用法 ■

■ 使用可能文字

MASM32 のソースコードの記述に使用出来る文字は、下記の通りで有る(但し、コメントには、日本

語を含め、総ての文字を使用しても良い)。

英字 A ~ Z、a ~ z

数字 0 ~ 9

記号 ?、@、_、$等

※ 上記は、総て、直接入力モードでキーボードから入力した文字で有り、IME 等の FEP で変換入力し

た文字ではない事に注意して欲しい。

■ 数値表現

MASM32 では、数値を、2 進数、8 進数、10 進数、16 進数で表す事が出来る。

基数 表記法 例

2 進数 xxxxxxxxB 01001100B

8 進数 xxxO 又は xxxQ 421O、329Q

10 進数 xxxxx 又は xxxxxD 32512、65535D

16 進数 xxxxH 2F30H、0FFE0H

10 進実数 xx.xxE±xx 37.38E-22

16 進実数 xxxxxxxxR 2F5A3BC1R

ASCII 文字 'xx' 又は "xx" 'ASCII'、"SQUID"

※ 16 進数では、先頭の文字が A ~ F に成る時は、先頭に 0 を付ける必要が有る。

■ データ型

MASM32 では、下記のデータ型を使用する事が出来る。

データ型 ビット数 バイト数 擬似命令

バイト型(Byte) 8 1 DB BYTE/SBYTE

ワード型(Word) 16 2 DW WORD/SWORD

ダブルワード型(Double Word) 32 4 DD DWORD/SDWORD

クワドワード型(Quad Word) 64 8 DQ QWORD

オクタワード型(Octaword) 80 10 DT TBYTE

単精度浮動小数点数 32 4 REAL4

倍精度浮動小数点数 64 8 REAL8

テンポラリ実数 80 10 REAL10

※ 但し、高級言語とは異なり、データ型の管理は、プログラマ自身が行う必要が有る。

用用法法

Page 7: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-7-

■ 命令ステートメントの書式

命令ステートメントは、5 個のフィールドを有し、各フィールドは、1 個以上のスペース、又は、タブ

で区切られる。下記に、書式と例を示す。

ラベル:

Label

リピート命令

Repeat Prefix

ニーモニック

Mnemonic

オペランド

Operand

; コメント

; Comment

BEGIN: REP MOVS DEST,SRC ; メモリ間転送

※ 上記の内、ニーモニックは、必ず記述しなければ成らないが、其の他のフィールドは、必要に応じ

て記述する。

命令形式(再掲)

MASM32 には、下図に示す 3 種の命令形式が有る。

1. ニーモニック

2. ニーモニック オペランド

3. ニーモニック 第 1 オペランド , 第 2 オペランド

(ディスティネーション) (ソース)

オペランドは、ニーモニックのパラメータ(処理対象)と成る物で、2 個のオペランドが有る場合、通

常、第 1 オペランドをディスティネーション、第 2 オペランドをソースと呼び、処理結果は、第 1 オペ

ランドに格納される。

■ 定義擬似命令ステートメントの書式

変数を定義する定義擬似命令ステートメントは、4 個のフィールドを有し、各フィールドは、1 個以上

のスペース、又は、タブで区切られる。下記に、書式と例を示す。

ネーム

Name

定義擬似命令

Directives

式フィールド

Expression Field

; コメント

; Comment

SCR DW 20H ; ワード変数 SCR 定義

※ 上記の内、定義擬似命令は、必ず記述しなければ成らないが、其の他のフィールドは、必要に応じ

て記述する。

変数定義

変数を定義する場合は、必要なバイト数に応じて、擬似命令 DB(1 バイト)、DW(2 バイト)、DD(4

バイト)、DQ(8 バイト)、DT(10 バイト)を使用する。初期値を設定する場合は、式フィールドに値

を記述する。猶、初期値が任意で良い場合は、式フィールドにクエスチョンマーク( ? )を記述する。

亦、10 バイトより大きい領域を確保するには、演算子 DUP を用いて、式フィールドを、下記の様に記

述する事も出来る(下記の例では、80 バイトの領域を確保し、初期値を不定とする)。

BUFFER DB 80 DUP(?) ; DUP の書式:回数 DUP( 初期値 )

定数定義

定数を定義する場合は、擬似命令 EQU、=(再定義可能)を使用する。

Page 8: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-8-

■ MASM32 プログラムの基本形 ■

■ MASM32 プログラムの書式

標準の MASM32 プログラムの書式は、下記の通りで有る。

コード 説明

ラベル ニーモニック オペランド

定数名 EQU 定数値 定数定義

マクロ名 MACRO マクロ定義開始

… マクロ定義本体

ENDM マクロ定義終了

コード名 SEGMENT コードセグメント開始

ASSUME CS:コード名,DS:データ名,SS:スタック名

ORG 100H

… プログラム本体

コード名 ENDS コードセグメント終了

データ名 SEGMENT データセグメント開始

… 変数定義

データ名 ENDS データセグメント終了

スタック名 SEGMENT スタックセグメント開始

DB 128 DUP(?) スタック領域

スタック名 ENDS スタックセグメント終了

END プログラム終了

EQU 擬似命令

MASM32 では、定数を定義する事が出来る。定数を定義するのが、EQU 擬似命令で有り、書式は、下

記の通りで有る。

ラベル ニーモニック オペランド

書式 定数名 EQU 定数値

例 MAX EQU 100

猶、プログラム中で、同じ定数名に、異なる値を割り当てる必要が有る時は、EQU 擬似命令の代わり

に、= 擬似命令を使用する。値を、プログラム中で変えると謂うと、変数と同じ様に思われるが、変数

の場合は、其れに対するメモリが確保され、其のメモリに格納する値が、動的に変化するのに対し、定

数は、メモリが確保されず、アセンブル時に、値が割り当てられて、即値と仕て扱われる。因みに、プ

ログラム中に、意味不明な即値を多用する事は、マジックナンバー(不思議な値)と謂われ、忌み嫌わ

れる。亦、仕様を変更した時等に、プログラム中の即値を何箇所も書き直さなければ成らないと、保守

性も悪いので、積極的に定数を使用する事を推奨する。

プログラム中で、定数を必要と仕無いプログラムで有れば、此の部分を無理に記述する必要は無く、省

略可能で有る。

Page 9: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-9-

MACRO ~ ENDM 擬似命令

MASM32 では、新しいニーモニック(オペコード)を作る機能で有るマクロ機能を使用する事が出来

る。其のマクロを定義するのが、MACRO ~ ENDM 擬似命令で有り、書式は、下記の通りで有る。

ラベル ニーモニック オペランド

書式 マクロ名 MACRO

ENDM

例 ENTRY MACRO

PUSH

MOV

MOV

POP

ENDM

AX

AX,CS

DS,AX

AX

マクロ機能は、高級言語に於けるクラスのメソッド定義に相当する。良く似た機能に、PROC ~ ENDP

擬似命令が有るが、此れは、プロシージャ(サブルーチン)を定義する物で有り、コードセグメントの

中に記述する(マクロは、各セグメントから独立して居る)。

プログラム中で、マクロ定義を必要と仕無いプログラムで有れば、此の部分を無理に記述する必要は無

く、省略可能で有る。

SEGMENT ~ ENDS 擬似命令

MASM32 では、プログラムを幾つかのセグメントに分割する事が出来る。各セグメントに名前を定義

するのが、SEGMENT ~ ENDS 擬似命令で有り、書式は、下記の通りで有る。

ラベル ニーモニック オペランド

書式 セグメント名

セグメント名

SEGMENT

ENDS

[アライン][組合せ]['クラス']

例 CODE

CODE

DATA

DATA

STACK

STACK

SEGMENT

ASSUME

ENDS

SEGMENT

ENDS

SEGMENT

ENDS

; コード用のセグメントの定義

CS:CODE,DS:DATA,SS:STACK

; データ用のセグメントの定義

; スタック用のセグメントの定義

一般に、コードを記述するコードセグメント、データを格納するデータセグメント、スタックと仕て使

用するスタックセグメントに分割する。猶、各セグメントのメモリ空間上限は 64K バイトで有る為、大

量のデータを扱う場合等は、データの格納用にエキストラセグメントを使用する事も有る。

Page 10: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-10-

前記の様に、コードを記述するコードセグメント、データを格納するデータセグメント、スタックと仕

て使用するスタックセグメントに分割したプログラムを、アセンブル・リンクして作成した実行ファイ

ルのロードイメージを、下図に示す。

CS はコードセグメント CODE の先頭、SS はスタックセグメント STACK の先頭に、夫々れ割り当て

られ、IP(インストラクションポインタ、命令実行の開始アドレス)は CS:0(コードセグメントのオ

フセット 0)に、SP(スタックポインタ)はスタックセグメントの最下位に割り当てられる。

併し、DS(ES も)はコードセグメントの前に確保された 100H バイト分の PSP(プログラムセグメン

トプレフィックス)領域の先頭に割り当てられる事に注意して欲しい。其の為、通常、プログラムの先

頭で、下記の様なコードを記述して、DS の値をデータセグメント DATA の先頭アドレスを指す様に初

期設定する必要が有る。

ラベル ニーモニック オペランド

例 MOV

MOV

AX,DATA

DS,AX

又は

ラベル ニーモニック オペランド

例 PUSG

POP

CS

DS

猶、コードとデータとスタックが、総て 64K バイト内に収まる様な小さなプログラムでは、総てを 1

個のセグメントに記述する事も出来る。

ラベル ニーモニック オペランド

例 CODE

CODE

SEGMENT

ASSUME

ENDS

CS:CODE,DS:CODE,SS:CODE

実行ファイル形式には、COM 形式と EXE 形式が有る。COM ファイルは、メモリが 64K バイトしか

無い CP/M 時代の名残で、セグメントが無く、64K バイト迄の実行プログラムしか作成出来ない。一方、

EXE 形式は、セグメント方式を採用して居るので、64K バイト以上の実行プログラムが作成可能で有

る(COM ファイルを作成する為には、メモリモデルを TINY モデルで作成しなければ成らない。此の

モデルで作成すると、自動的に 100H 番地から実行される。ML と LINK で EXE ファイルを作成した

後に、EXE2BIN を使用して、COM ファイルに変換する必要が有る)。

PSP

(システム使用領域)

CODE

(コードセグメント)

DATA

(データセグメント)

STACK

(スタックセグメント)

DS, ES

CS

SS

SP

IP ( CS:0 )

Page 11: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-11-

ASSUME 擬似命令

MASM32 では、前述の通り、プログラムを幾つかのセグメントに分割する事が出来る。其処で、各セ

グメントレジスタが何のセグメントを指すのかを定義するのが、ASSUME 擬似命令で有り、書式は、

下記の通りで有る。

ラベル ニーモニック オペランド

書式 ASSUME CS:コード名,DS:データ名,SS:スタック名

例 ASSUME CS:CODE,DS:DATA,SS:STACK

アセンブラは、実行時のセグメントレジスタの値は解らない(アセンブル時に、プログラムのオペラン

ドに記述されたオフセットが、何のセグメントレジスタを使用して居るかの情報が無い)。其処で、使

用するセグメントレジスタと其の値を、アセンブラに予め通知して置く必要が有る。アセンブラは、此

れに依り、セグメントオーバーライドプレフィックスを決め、機械語を作成するので、マシン語プログ

ラムの中では、通知した通りの値を各セグメントレジスタに設定しなければ成らない。猶、プログラム

の途中で、セグメントを切り替える必要が有る場合には、プログラムの途中に、此の ASSUME 擬似命

令を使用する事も出来る。

ORG 擬似命令

MASM32 では、プログラムのロードアドレスを指定する事が出来る。プログラムのロードアドレスを、

此のセグメントのベースから何番地目からにするかを指定するのが、ORG 擬似命令で有り、書式は、

下記の通りで有る。

ラベル ニーモニック オペランド

書式 ORG セグメントベースからのオフセット値

例 ORG 100H

ORG 擬似命令は、プログラム中で、コードやデータが実際に配置されるアドレスを指定する時に、其

の直前に記述する。ORG 擬似命令のオペランドには、ASSUME 擬似命令で決められたセグメントのベ

ースからのオフセット値を指定する。

END 擬似命令

プログラムの終端を示すのが、END 擬似命令で有り、書式は、下記の通りで有る。

ラベル ニーモニック オペランド

書式 END

此れを記述しないと、アセンブル時にエラーと成る。

スタックセグメントの省略

リンカ LINK は、プログラム中にスタックセグメントが無いと、警告を発するが、MS-DOS 上でプ

ログラムを実行する場合は、スタックセグメントが無いと、システムが、適当な領域をスタックと

仕て使用する為、プログラムの実行は、正常に行われる。其処で、スタックセグメントを省略した

簡易化したプログラム書式が使用される事も有る。

Page 12: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-12-

■ 記述例

下記に、MASM32 で記述したソースコード(first.asm)の例を示す。

コード 説明

ラベル 命令コード オペランド

code segment コードセグメント開始

assume cs:code,ds:data,ss:stack セグメント定義

org 100h アドレス定義

start:

mov ax,data

mov ds,ax

mov ah,9

mov dx,offset msg

int 21h

mov ah,8

int 21h

mov ah,4ch

int 21h

code ends コードセグメント終了

data segment データセグメント開始

msg db 0dh,0ah,'Hello Squid World !',0dh,0ah,'$' データ定義

data ends データセグメント終了

stack segment stack スタックセグメント開始

db 128 dup(?) スタック領域確保(128B)

stack ends スタックセグメント終了

end start プログラム終了

上記をアセンブルすると、下記の様な機械語が生成される。

アドレス メモリ内容 プログラム

0000 code segment

assume cs:code,ds:data,ss:stack

org 100h

0100 start:

0100 B8xx xx mov ax,data

0103 8ED8 mov ds,ax

0105 B409 mov ah,9

0107 BA00 00 mov dx,offset msg

010A CD21 int 21h

010C B408 mov ah,8

010E CD21 int 21h

0110 B44C mov ah,4ch

プログラム本体

Page 13: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-13-

0112 CD21 int 21h

0114 code ends

0000 data segment

0000 0D0A 4865 msg db 0dh,0ah,'Hello Squid World !',0dh,0ah,'$'

0004 6C6C 6F20

0008 5371 7569

000C 6420 576F

0012 726C 6420

0016 210D 0A24

0018 data ends

0000 stack segment stack

0000 db 128 dup(?)

0080 stack ends

end start

※ 上記で、コードセグメントの 100H 番地からの機械語コードで、xxxx と記述されて居るのは、アセ

ンブル時には、データセグメントのアドレスが不定だからで有る。因みに、リンク後に生成される

実行ファイルでは、此の部分は、1200 と成って居る。

ダンプリストでは、16 進数で表示されるが、メモリの内容は、実際には、下記の様に、16 ビットの 2

進数で格納されて居る。

アドレス 16進数 2進数

0100 B8xx xx 1011 1000 xxxx xxxx xxxx xxxx

0103 8ED8 1000 1110 1101 1000

0105 B409 1011 0100 0000 1001

0107 BA00 00 1011 1010 0000 0000 0000 000

010A CD21 1100 1101 0010 0001

010C B408 1011 0100 0000 1000

010E CD21 1100 1101 0010 0001

0110 B44C 1011 0100 0100 1100

0112 CD21 1100 1101 0010 0001

0000 0D0A 4865 0000 1101 0000 1010 0100 1000 0110 0101

0004 6C6C 6F20 0110 1100 0110 1100 0110 1111 0010 0000

0008 5371 7569 0101 0011 0111 0001 0111 0101 0110 1001

000C 6420 576F 0110 0100 0010 0000 0101 0111 0110 1111

0012 726C 6420 0111 0010 0110 1100 0110 0100 0010 0000

0016 210D 0A24 0010 0001 0000 1101 0000 1010 0010 0100

0000

0080

メモリのアドレス(16 進数) 変換された機械語(16 進数)

Page 14: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-14-

簡略化されたセグメントの記述 (参考)

簡略化されたセグメントの記述の仕方も有る。簡略化セグメントを使うには、.MODEL 擬似命令を使

用する。此処で指定するメモリモデルには、TINY、SMALL、MEDIUM、COMPACT、LARGE、HUGE、

FLAT 等が有る。

TINY メモリモデル:プログラムが総て単一のコードセグメント内に有り(CS = DS = ES = SS)、メモ

リ空間は、65535 バイトで有る。

SMALL メモリモデル:コードセグメントとデータセグメントの 2 個のセグメントを持つメモリモデル

で、メモリ空間は、コードに 65535 バイト、データに 65535 バイトの計 128K バイトで有る。

此れを記述すれば、簡略化セグメントが記述可能と成る。下記の命令を使用してセグメントを記述する。

簡略化セグメント命令 解説

.STARTUP スタートアップコードを作成

.EXIT プログラム終了コードを作成

.CODE コードセグメントを定義(セグメント名は_TEXT)

.DATA データセグメントを定義(セグメント名は_DATA)

.STACK スタックセグメントを定義(セグメント名は STACK)

.model small

.data

MSG db 'メインから表示して居ます。', 0dh, 0ah, '$'

.code

.startup

mov ax, _DATA

mov ds, ax

mov dx, offset MSG

mov ah, 09h

int 21h

mov ah, 20h

int 21h

.exit

end

※ 簡易化と謂うのは、コーディングに馴れた人間がタイピング量を減らす為に、斯う謂う記述法も有

ると謂う物で、其の様に記述する方が良いと謂う意味では無い。寧ろ、可読性を損なう事が多いの

で、私的なプログラムを除き、安易に使用す可きでは無い。

此処では、上記の様なコードが、インターネットのサイト等で氾濫して居るので、参考の為に取り

上げて居るが、初心者も閲覧する様なサイトに公開するには、相応しくないコードで有る。

Page 15: MASM32 の基本 - xdomainjunko036.html.xdomain.jp/school/masm32/masm32b.pdfMASM32 ② 【アセンブラ 基礎Ⅱ noa】 -1- 今回の課題項目 MASM32 の基本 MASM ② MASM(8086)の命令

MASM32 ② 【アセンブラ 基礎Ⅱ noa】

-15-

MASM の新機能 (参考)

Visual C++ 2005 の MASM の新機能は、下記の通りで有る。

・MASM の式は、64 ビット値に成った(以前のバージョンの MASM の式は 32 ビット値だった)。

・関数は、__asm int 3 命令に依り、ネイティブでコンパイルされる様に成った。

・ALIAS が文書化された。

・ml.exe と ml64.exe に /ERRORREPORT オプションが追加された。

・.FPO が文書化された。

・H2INC.exe は、Visual C++ 2005 に同梱されなく成った。

・演算子 IMAGEREL、HIGH32、LOW32 が追加された。

ml64.exe は、MASM の x64 アーキテクチャ用のバージョンで有る。此れは、x64.asm ファイルを x64

オブジェクトファイルにアセンブルする。x64 コンパイラでは、インラインアセンブリ言語はサポート

されない。

・ml64.exe(x64)の為に、下記 MASM ディレクティブが追加された。

.ALLOCSTACK、.ENDPROLOG、.PUSHFRAME、.PUSHREG

.SAVEREG、.SAVEXMM128、.SETFRAME

・更に、x64-only 構文を使用して、PROC ディレクティブが更新された。

・MMWORD ディレクティブが追加された。

・/omf(ML.exe コマンドラインオプション)は、/c を意味する(ML.exe は、OMF 形式のオブジェク

トのリンクをサポートしない)。

・SEGMENT ディレクティブは、追加の属性をサポートする。

・SECTIONREL 演算子が追加された。

・XMMWORD ディレクティブが追加された。

※ モジュールの名前を定義する NAME 擬似命令は、現在は、無視される。

演算子 OPATTR と TYPE の戻り値 (参考)

参考迄に、演算子 OPATTR と TYPE の戻り値を、下記に示す。

OPATTR と TYPE の戻り値(Return Value)

ビット 意味

0 References a label in the code segment if set.

1 References a memory variable or relocatable data object if set.

2 Is an immediate (absolute/constant) value if set.

3 Uses direct memory addressing if set.

4 Is a register name, if set.

5 References no undefined symbols and there is no error, if set.

6 Is an SS: relative reference, if set.

7 References an external name.

8-10

000 - no language type

001 - C/C++ language type

010 - SYSCALL language type

011 - STDCALL language type

100 - Pascal language type

101 - FORTRAN language type

110 - BASIC language type

opattr 演算子は、後続の引数の特定の情報を示す 16 ビットの値を返す。亦、.type 演算子は、以前の

バージョンで、下位 8 ビットを返す。此等の演算子の戻り値の各々のビットは、上記の意味を持つ。