MASMの紹介(2)MASMの基本的な文法

1.変数とラベル

1.1識別子

文字と特殊文字(_、$、?、@)で始まる英数字と特殊記号の文字列

1.2予約された単語

特定の目的を持つ識別子。ユーザーはその意味を変更できません

1.3変数

1.3.14つの属性

  • オフセットは、セグメントの開始アドレス(0)を基準にしたバイト距離です。
  • タイプには、BYTE、WORD、DWORDなどの基本タイプと、structなどの複合タイプが含まれます。
  • セグメントアドレスは、プログラムのロード時に指定されるベースアドレスです。
  • は実際の
    コンテンツであり、変更できます

1.3.2定義

  • 【変数名】DB / DW / DD式

      例:
      msg DB "How are you?",0 ;//共13个字节,DB表示以byte类型(1个字节)定义变量
      
      magic DB 50 dup('1','2','3')   
      		DB '1','2','3'; 共占53字节,并初始化为字符串"123123…";50表示容量;dup重复数据  
      
      DATA7  DB ?  ; 占1字节;‘?’,表示该变量的值不确定,即:该变量所表示的内存单元中的内容是不确定的,或者说是,当表达式为问号时,变量所对应的内存区中并没有存入新的值,而只是预留出了相应的存储空间;
      
      num dw 1,2,3,4,5,6,7,8,9,10 ;共20字节
                                  ;相当于C风格的 WORD num[10]={1,2,3,4,5,6,7,8,9,10};
    

1.4ラベル

1.4.1プロパティ

  • セグメントアドレスとは、ラベルに対応する命令が配置されているセグメントのセグメントアドレスを指します。
  • セグメントオフセットアドレス内のオフセットアドレス
  • NEARとFARの2つのタイプがあります
    • NEARタイプ、つまりラベルがセグメントで使用されていることを意味します
    • FARタイプは、ラベルをセグメント間で使用できることを意味します

1.4.2定義:命令コードの前に識別子とコロン「:」を追加します。

例:START:PUSH DS

2.一定

2.1疑似命令EQU

PI EQU 31415926; C言語に類似#definePI 31415926

2.2疑似命令名=式

PIX = PI + 2 //コンパイラは、前処理段階で名前を式に置き換えます

2.3疑似命令ORG

指定されたプログラムの開始アドレスは、
デフォルトで0000Hから始まります
。ORG2000H;指定されたプログラム命令はアドレス2000Hから保存されます。

2.4番号システム

バイナリ:11101011B
オクタル:345Q
デシマル:8097D、8097
ヘキサデシマル:1234H、0EFDAH

2.5一定の操作

+ - * \ 
AND OR XOR NOT 
SHL SHR //shift left  \  shift right
EQ NE   //equal  \ not equal
LT LE   //lower than  \lower equal小于等于
GT GE   //greater than  \greater equal大于等于

例:MOV AL、((11110000B AND 64)+5)GT 32 //比較結果の値をALに転送する

3.タイプ表示

3.1オペレーターPTR(強制型変換)

MOV BYTE PTR AGE、20; // AGEのタイプを示します

mov ax、bx;は、BXレジスタの値をAXに割り当てるためのものです。どちらもワードタイプであるため、「WORD」を追加する必要はありません
。movax、word ptr [bx];メモリアドレスを「BXレジスタの値」に設定するためのものです。その場所に保存されているデータにはaxが割り当てられます。メモリアドレスしか与えられていないので、斧を割り当てるのか、バイトなのかワードなのかわからないので、ワードで明確に示す必要があります!

PTR的作用域只在当前语句中

3.2オペレーターTHIS(現在のアドレス)

COUNTW EQU THIS WORD
COUNTB DB 51,96,78,90
AGAINF EQU THIS FAR  
AGAINN: MOV AL, 90

3.3パーソクメントLENGTH、TYPE、SIZE(SIZE = LENGTH * TYPE)、WIDTH

  • 長さ
    • LENGTH変数名
    • 変数の長さを取り出します
  • タイプ
    • TYPE変数名またはラベル
    • 変数名またはラベルのタイプ(変数が占めるバイト数)を取得します
    • TYPE的值:BYTE:1、WORD:2、DWORD:4、NEAR:-1、FAR:-2
  • サイズ
    • SIZE変数名
    • 変数のサイズを取得します
    • WIDTH変数名
    • レコードフィールドの幅を取得します

3.4高、低

  • MOV AL、HIGH56761;定数の上位バイトを取得します
  • MOV AL、LOW56761;定数の下位バイトを取得します

3.5SEG、オフセット

  • SEG

    • SEG変数名またはラベル
    • 変数名またはラベルが配置されているセグメントのセグメントアドレスを取得します
  • オフセット

    • OFFSET変数名またはラベル
    • 変数名またはラベルが配置されているセグメントのオフセットアドレスを取り出します
  • 次に例を示します
    。MOVAX、SEG COUNT // COUNTセグメントのセグメントアドレスを削除してAXレジスタに配置
    MOVAX、OFFSET COUNT / COUNTセグメントのオフセットアドレスを削除してAXレジスタに配置

4.セグメントの定義

  • ENDは、アセンブリソースプログラム全体の終了を示し、最初の命令の実行位置を示します()

  • 終了開始

    DATA 1 SEGMENTS ;一段的开始  
      name1 DB 50DUP(?)  
            DB 2,3,4,5  
    DATA 1 ENDS ;一段的结束
    
    DATA 2 SEGMENTS ;一段的开始  
       name2 DB 50DUP(?)  
    DATA 2 ENDS ;一段的结束  
    
    STACK SEGMENTS ;一段的开始  
          DB 5000 DUP(?)
    STACK ENDS ;一段的结束  
    
    CODE SEGMENT  
        ;把段与段寄存器相关连  
        ASSUME CS:CODE, SS: STACK; DS:DATA1, ES:DATA2  
    START: MOV AX,DATA1  
           MOV DS,AX  
           MOV AX,DATA2  
           MOV ES,AX  
           MOV AL,name1 ;name1隐含使用DS  
           MOV BL,name2 ;name2隐含使用ES。这里需要段超越。  
             ……
    CODE ENDS
        END START
    

5.プロセス定義

  • 定義

    プロセス名PROC [FARまたはNEAR];デフォルトはNEAR
    ……
    RET
    プロセス名ENDP

  • 転送

    • CALLプロシージャ名

    例:
    呼び出し遅延;呼び出し遅延サブルーチン
    ...
    遅延プロシージャニア;遅延サブルーチン定義
    mov bx、200
    lll:mov cx、0
    ll:ループll
    dec bx
    jne lll
    ret
    delay endp

6.構造タイプ

  • 定義

    • 结构类型名 STRUC [对齐类型Alignment][,NONUNIQUE]
          Field1 Type1 Exp1
          Field2 Type2 Exp2
          ......
          FieldN TypeN ExpN
       结构类型名 ENDS
      

      FieldN:変数名、省略可能、構造内のオフセットを介して変数名にアクセスすることはできません

  • 使用する

    • [変数名]構造タイプ名<[フィールド値リスト]>
    • フィールド値リストは、「、」で区切られたデフォルト値を使用するように再初期化されません。

7.レコードタイプ

  • レコード名RECORDfield [、field、…]
  • フィールドフィールド名:width [=初期値式] //幅:2桁、デフォルトは初期化なしで0
  • 使用する
    • [変数名]構造タイプ名<[フィールド値リスト]>

    • 変数名。フィールド名

      WEATHER RECORD A:5=10, B:2=3, C:3 ;按位,不能超过16位。
      TOR WEATHER <1, ,3>
      MOV AL, TOR.B
      

8.マクロ

  • 定義

     宏名 MACRO 参数 ;用相应内容替换到调用位置
          ...;宏定义体
          ENDM  ;结束定义
    
  • 使用する

    • マクロ名パラメーター[、パラメーター]
    • 例:NAME PARA、PARA2 .. ..
  • マクロをキャンセル

    • PURGEマクロ名1、マクロ名2、...;

9.条件付きアセンブリ

例:SHOWCHAR MACRO X ;显示一个字符  
             IF X GE 35H  
                MOV AL, X  
             ELSE   
               MOV AL, '0'  
             ENDIF  
             MOV AH, 2  
             INT 21H  
             ENDM  

10.セグメント定義を簡素化する

.8086
.MODEL SMALL ;SMALL采用小模式内存,一个代码段,一个数据段;
		     ;TINY:都在一个段
			 ;MEDIUM:多个代码段,一个数据段
DOSSEG ;采用DOS方法排列段

.DATA ;数据段
		S1 DB 1,2,3
		S2 DW 500
		
.STACK 100H ;堆栈段,指定大小为100,通常默认为1KB

.CODE ;代码段

MAIN PROC FAR
				MOV AX,@DATA ; 数据段基址@DATA
				MOV DS,AX
				…
				RET
MAIN ENDP
		END MAIN
簡略化されたセクションディレクティブ 特徴 コメント
.CODE [セクション名] コードスニペットを作成する セクション名はオプションです。セクション名が指定されていない場合は、デフォルトのセクション名が使用されます。複数のコードセグメントを持つモデルの場合、コードセグメントごとにセグメント名を指定する必要があります。
。データ データセグメントを作成する セクション名は次のとおりです。_DATA
。データ? 初期値変数なしでデータセグメントを作成する セクション名は次のとおりです。_BSS
.FARDATA [段名] 初期値でリモートコールデータセグメントを確立する セクション名を指定できます。指定しない場合は、FAR_DATAにちなんで名前が付けられます。
.FARDATA?【段名】 初期値なしでリモートコールデータセグメントを確立する セグメント名は指定できますが、指定しない場合はFAR_BSSにちなんで名付けられます。
.CONST 読み取り専用の定数データセグメントを作成します セクション名は次のとおりです。CONST
.STACK [サイズ] スタックセグメントを作成し、スタックセグメントサイズを指定します セクション名は:stackです。スタックセグメントサイズを指定しない場合、デフォルト値は1KBです。

11.リファレンス

1 http://blog.sina.com.cn/s/blog_84ee1fff0102xbeb.html
2 http://bdxnote.blog.163.com/blog/static/844423520096137403605/
3 https://www.cnblogs.com/galano/ p / 8721350.html
4 http://www.voidcn.com/article/p-pjmhoonz-yp.html

おすすめ

転載: blog.csdn.net/qq_45975757/article/details/108936384