Einführung in MASM (2) Grundlegende Grammatik von MASM

1. Variablen und Beschriftungen

1.1 Kennung

Alphanumerische und spezielle Symbolzeichenfolgen, beginnend mit Buchstaben und Sonderzeichen (_, $,?, @)

1.2 Reservierte Wörter

Kennung mit einem bestimmten Zweck kann der Benutzer seine Bedeutung nicht ändern

1.3 Variablen

1.3.1 Vier Attribute

  • Der Offset ist der Byteabstand relativ zur Segmentstartadresse (0).
  • Zu den Typen gehören Basistypen wie BYTE, WORD und DWORD sowie zusammengesetzte Typen wie struct
  • Die Segmentadresse ist die Basisadresse, die beim Laden des Programms angegeben wird
  • Der Wert ist der tatsächliche
    Inhalt und kann geändert werden

1.3.2 Definition

  • [Variablenname] DB / DW / DD-Ausdruck

      例:
      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 Etikett

1.4.1 Eigenschaften

  • Die Segmentadresse bezieht sich auf die Segmentadresse des Segments, in dem sich der dem Etikett entsprechende Befehl befindet
  • Versatzadresse innerhalb der Segmentversatzadresse
  • Es gibt zwei Arten: NEAR und FAR
    • NEAR-Typ, dh das Label wird im Segment verwendet
    • FAR-Typ bedeutet, dass das Label zwischen Segmenten verwendet werden kann

1.4.2 Definition: Fügen Sie vor dem Anweisungscode einen Bezeichner und einen Doppelpunkt ":" ein.

Zum Beispiel: START: PUSH DS

2. Konstante

2.1 Pseudoanweisung EQU

PI EQU 31415926; ähnlich der C-Sprache #define PI 31415926

2.2 Pseudobefehlsname = Ausdruck

PIX = PI + 2 // Der Compiler ersetzt in der Vorverarbeitungsphase den Namen durch den Ausdruck

2.3 Pseudoanweisungs-ORG

Die Startadresse des angegebenen Programms beginnt
standardmäßig bei 0000H
ORG 2000H, die angegebenen Programmanweisungen werden ab der Adresse 2000H gespeichert

2.4 Zahlensystem

Binär: 11101011B
Oktal: 345Q
Dezimal: 8097D, 8097
Hexadezimal: 1234H, 0EFDAH

2.5 Konstante Operationen

+ - * \ 
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大于等于

Beispiel: MOV AL, ((11110000B UND 64) +5) GT 32 // Übertragen Sie den Wert des Vergleichsergebnisses an AL

3. Typanzeige

3.1 Operator PTR (erzwungene Typkonvertierung)

MOV BYTE PTR AGE, 20; // Gibt den Typ des AGE an

mov ax, bx; soll AX den Wert im BX-Register zuweisen, da beide Worttypen sind, muss nicht "WORT" hinzugefügt werden.
mov ax, Wort ptr [bx]; soll die Speicheradresse auf "den Wert des BX-Registers" setzen. Den dort gespeicherten Daten wird ax zugewiesen. Da nur eine Speicheradresse angegeben ist, weiß ich nicht, ob wir Byte oder Wort Axt zuweisen möchten, daher müssen wir sie mit Wort angeben!

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

3.2 Betreiber DIESE (aktuelle Adresse)

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

3.3 操作 符 LÄNGE, TYP, GRÖSSE (GRÖSSE = LÄNGE * TYP) , BREITE

  • LÄNGE
    • LÄNGE Variablenname
    • Nehmen Sie die Länge der Variablen heraus
  • ART
    • Name oder Bezeichnung der TYPE-Variablen
    • Ermitteln Sie den Typ des Variablennamens oder der Bezeichnung (die Anzahl der von der Variablen belegten Bytes).
    • TYP : 值 : BYTE: 1, WORD: 2, DWORD: 4 , NEAR: -1, FAR: -2
  • GRÖSSE
    • SIZE Variablenname
    • Ermitteln Sie die Größe der Variablen
  • BREITE
    • Name der WIDTH-Variablen
    • Ermitteln Sie die Breite des Datensatzfelds

3.4HOH, NIEDRIG

  • MOV AL, HIGH 56761, nimm das High-Byte der Konstante
  • MOV AL, LOW 56761; nimm das niedrige Byte der Konstante

3.5SEG, OFFSET

  • SEG

    • Name oder Bezeichnung der SEG-Variablen
    • Nehmen Sie die Segmentadresse des Segments heraus, in dem sich der Variablenname oder die Bezeichnung befindet
  • OFFSET

    • Name oder Bezeichnung der OFFSET-Variablen
    • Nehmen Sie die Versatzadresse in dem Segment heraus, in dem sich der Variablenname oder die Bezeichnung befindet
  • Zum Beispiel:
    MOV AX, SEG COUNT // Entfernen Sie die Segmentadresse des COUNT-Segments und legen Sie sie in das AX-Register.
    MOV AX, OFFSET COUNT / Entfernen Sie die Offset-Adresse des COUNT-Segments und legen Sie sie in das AX-Register

4. Segmentdefinition

  • END gibt das Ende des gesamten Assembly-Quellprogramms an und gibt die Ausführungsposition des ersten Befehls an ()

  • END START

    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. Prozessdefinition

  • Definition

    Prozessname PROC [FAR oder NEAR]; Der Standardwert ist NEAR
    ……
    RET-
    Prozessname ENDP

  • Transfer

    • Name der CALL-Prozedur

    Beispiel:
    Anrufverzögerung; Unterprogramm für Anrufverzögerung
    ...
    Verzögerung in der Nähe; Definition des Unterprogramms für Verzögerung
    mov bx, 200
    lll: mov cx, 0
    ll: Schleife ll
    dec bx
    jne lll
    ret
    delay endp

6. Strukturtyp

  • Definition

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

      FeldN: Variablenname, kann weggelassen werden, über den Offset in der Struktur wird auf keinen Variablennamen zugegriffen

  • verwenden

    • [Variablenname] Name des Strukturtyps <[Feldwertliste]>
    • Die Feldwertliste wird nicht neu initialisiert, um den durch "," getrennten Standardwert zu verwenden.

7. Datensatztyp

  • Datensatzname RECORD-Feld [, Feld,…]
  • Feld Feldname: width [= Anfangswertausdruck] // width: Binärziffern, standardmäßig 0 ohne Initialisierung
  • verwenden
    • [Variablenname] Name des Strukturtyps <[Feldwertliste]>

    • Variablenname. Feldname

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

8. Makro

  • Definition

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

    • Makroname Parameter [, Parameter]
    • Wie zum Beispiel: NAME PARA, PARA2 ...
  • Makro abbrechen

    • PURGE Makroname 1, Makroname 2, ...;

9. Bedingte Montage

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

10. Vereinfachen Sie die Segmentdefinition

.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
Vereinfachte Abschnittsrichtlinie Eigenschaften Kommentar
.CODE [Abschnittsname] Erstellen Sie ein Code-Snippet Der Abschnittsname ist optional. Wenn der Abschnittsname nicht angegeben wird, wird der Standardabschnittsname verwendet. Bei Modellen mit mehreren Codesegmenten sollte für jedes Codesegment ein Segmentname angegeben werden.
.DATEN Erstellen Sie ein Datensegment Der Abschnittsname lautet: _DATA
.DATEN? Erstellen Sie ein Datensegment ohne Anfangswertvariablen Der Abschnittsname lautet: _BSS
.FARDATA [段 名] Richten Sie ein Fernanrufdatensegment mit dem Anfangswert ein Der Abschnittsname kann angegeben werden. Wenn er nicht angegeben wird, wird er nach FAR_DATA benannt.
.FARDATA? [段 名] Richten Sie ein Fernanrufdatensegment ohne Anfangswert ein Der Segmentname kann angegeben werden. Wenn er nicht angegeben wird, wird er nach FAR_BSS benannt.
.KONST Erstellen Sie ein schreibgeschütztes konstantes Datensegment Der Abschnittsname lautet: CONST
.Stapelgrösse] Erstellen Sie ein Stapelsegment und geben Sie die Stapelsegmentgröße an Der Abschnittsname lautet: stack. Wenn Sie die Stapelsegmentgröße nicht angeben, beträgt der Standardwert 1 KB

11. Referenz

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

Ich denke du magst

Origin blog.csdn.net/qq_45975757/article/details/108936384
Empfohlen
Rangfolge