Introdução ao MASM (2) Gramática Básica do MASM

1. Variáveis ​​e rótulos

1.1 identificador

Strings de símbolos alfanuméricos e especiais começando com letras e caracteres especiais (_, $,?, @)

1.2 Palavras reservadas

Identificador com finalidade específica, o usuário não pode alterar seu significado

1.3 Variáveis

1.3.1 Quatro atributos

  • O deslocamento é a distância de bytes em relação ao endereço inicial do segmento (0)
  • Os tipos incluem tipos básicos, como BYTE, WORD e DWORD, bem como tipos compostos, como struct
  • O endereço do segmento é o endereço base fornecido quando o programa é carregado
  • O valor é o
    conteúdo real e pode ser alterado

1.3.2 Definição

  • Expressão DB / DW / DD [nome da variável]

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

1.4.1 Propriedades

  • O endereço do segmento refere - se ao endereço do segmento onde a instrução correspondente ao rótulo está localizada
  • Endereço de deslocamento dentro do endereço de deslocamento do segmento
  • Existem dois tipos: NEAR e FAR
    • Tipo NEAR, o que significa que o rótulo é usado no segmento
    • O tipo FAR significa que o rótulo pode ser usado entre os segmentos

1.4.2 Definição: adicione um identificador e dois pontos ":" antes do código de instrução;

Por exemplo: START: PUSH DS

2. Constante

2.1 pseudo-instrução EQU

PI EQU 31415926; semelhante à linguagem C # define PI 31415926

2.2 nome da pseudo-instrução = expressão

PIX = PI + 2 // O compilador substitui o nome pela expressão no estágio de pré-processamento

2.3 Pseudo-instrução ORG

O endereço inicial do programa especificado começa
em 0000H por padrão
ORG 2000H; as instruções do programa especificado são armazenadas no endereço 2000H

2.4 Sistema Numérico

Binário: 11101011B
Octal: 345Q
Decimal: 8097D, 8097
Hexadecimal: 1234H, 0EFDAH

2.5 Operações constantes

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

Exemplo: MOV AL, ((11110000B AND 64) +5) GT 32 // Transfere o valor do resultado da comparação para AL

3. Indicação de tipo

3.1 Operador PTR (conversão de tipo forçada)

MOV BYTE PTR AGE, 20; // Indica o tipo de AGE

mov ax, bx; é atribuir o valor no registro BX para AX, uma vez que ambos são tipos de palavra, não há necessidade de adicionar "WORD"
mov ax, palavra ptr [bx]; é definir o endereço de memória para "o valor do registro BX" Os dados armazenados no local são atribuídos a machado. Como apenas um endereço de memória é fornecido, não sei se queremos atribuir ax a byte ou word, então precisamos especificá-lo com word!

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

3.2 Operador ESTE (endereço atual)

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

3.3 操作 符 COMPRIMENTO, TIPO, TAMANHO (TAMANHO = COMPRIMENTO * TIPO) , LARGURA

  • COMPRIMENTO
    • Nome da variável LENGTH
    • Retire o comprimento da variável
  • TIPO
    • Nome da variável TYPE ou rótulo
    • Obtenha o tipo de nome de variável ou rótulo (o número de bytes ocupados pela variável)
    • TYPE 的 值 : BYTE: 1, WORD: 2, DWORD: 4 , PRÓXIMO: -1, FAR: -2
  • TAMANHO
    • Nome da variável SIZE
    • Obtenha o tamanho da variável
  • LARGURA
    • Nome da variável WIDTH
    • Obtenha a largura do campo de registro

3.4 ALTO, BAIXO

  • MOV AL, HIGH 56761; pegue o byte alto da constante
  • MOV AL, LOW 56761; pegue o byte inferior da constante

3.5SEG, OFFSET

  • SEG

    • Nome ou rótulo da variável SEG
    • Obtenha o endereço do segmento onde o nome da variável ou rótulo está localizado
  • DESLOCAMENTO

    • Nome da variável OFFSET ou rótulo
    • Obtenha o endereço de deslocamento no segmento onde o nome da variável ou rótulo está localizado
  • Por exemplo:
    MOV AX, SEG COUNT // Remova o endereço do segmento do segmento COUNT e coloque-o no registro
    AX MOV AX, OFFSET COUNT / Remova o endereço de deslocamento do segmento COUNT e coloque-o no registro AX

4. Definição de segmento

  • END indica o fim de todo o programa fonte de montagem e dá a posição de execução da primeira instrução ()

  • 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. Definição do processo

  • definição

    Nome do processo PROC [FAR ou NEAR]; O padrão é NEAR
    …… Nome do processo
    RET
    ENDP

  • transferir

    • Nome do procedimento CALL

    Exemplo:
    atraso de chamada; sub-rotina de atraso de chamada
    ...
    atraso proc próximo; atraso definição de sub-rotina
    mov bx, 200
    lll: mov cx, 0
    ll: loop ll
    dec bx
    jne lll
    ret
    atraso final

6. Tipo de estrutura

  • definição

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

      FieldN: nome da variável, pode ser omitido, nenhum nome de variável é acessado através do deslocamento na estrutura

  • usar

    • [Nome da variável] Nome do tipo de estrutura <[Lista de valores de campo]>
    • A lista de valores de campo não é reinicializada para usar o valor padrão, separado por ","

7. Tipo de registro

  • Nome do registro RECORD campo [, campo, ...]
  • Nome do campo de campo: largura [= expressão de valor inicial] // largura: dígitos binários, padrão para 0 sem inicialização
  • usar
    • [Nome da variável] Nome do tipo de estrutura <[Lista de valores de campo]>

    • Nome da variável. Nome do campo

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

8. Macro

  • definição

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

    • Parâmetro do nome da macro [, parâmetro]
    • Tais como: NAME PARA, PARA2 ...
  • Cancelar macro

    • PURGE macro name 1, macro name 2, ...;

9. Montagem condicional

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

10. Simplifique a definição do segmento

.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
Diretiva de seção simplificada Recursos Comente
.CODE [nome da seção] Crie um snippet de código O nome da seção é opcional. Se o nome da seção não for fornecido, o nome da seção padrão será usado. Para modelos com vários segmentos de código, um nome de segmento deve ser especificado para cada segmento de código.
.DADOS Crie um segmento de dados O nome da seção é: _DATA
.DADOS? Crie um segmento de dados sem variáveis ​​de valor inicial O nome da seção é: _BSS
.FARDATA [段 名] Estabelecer segmento de dados de chamada remota com valor inicial O nome da seção pode ser especificado, se não for especificado, será nomeado após FAR_DATA.
.FARDATA? [段 名] Estabelecer segmento de dados de chamada remota sem valor inicial O nome do segmento pode ser especificado, se não for especificado, ele será nomeado após FAR_BSS.
.CONST Crie um segmento de dados constante somente leitura O nome da seção é: CONST
.Tamanho da pilha] Crie um segmento de pilha e especifique o tamanho do segmento de pilha O nome da seção é: pilha. Se você não especificar o tamanho do segmento de pilha, o valor padrão é 1 KB

11.Referência

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

Acho que você gosta

Origin blog.csdn.net/qq_45975757/article/details/108936384
Recomendado
Clasificación