汇编学习笔记(二)

汇编语言包括顺序结构、分支结构和循环结构
一.汇编语言的语句
(一)语句的种类和格式
1.汇编语言语句的种类:
 包括指令语句,伪指令语句,宏语句
 语句指令有对应的机器指令。
 伪指令语句没有对应的机器指令,只是指示汇编程序如何汇编源程序,包括符号定义,
 变量的定义、段的定义
2.语句的格式:
指令语句与伪指令语句的格式相似,都由四部分组成
 指令语句的格式:
 标号: 指令助记符 操作数 ;注释
 伪指令语句的格式:
 名字 伪指令定义符 参数  ;注释
 伪指令定义符规定了伪指令的功能
注意:名字后面没有冒号,标号后一定有冒号。
 伪指令的参数有时是常数(数值表达式),有时候时一般的符号。

 标号和名字最多由31个字母、数字及规定的特殊字符(?@_$)等组成,不能以数字开头。不能为保留字。
 汇编语言不区分字母大小写。
(二)数值表达式
 通过运算符、操作符及括号把常熟和符号连起来,就得到表达式。
 表达式又分为数值表达式和地址表达式。
 1.常数:
 (1)十进制常数
 字母D结尾。数字默认结尾为D。
 伪指令 RADIX可改变进制。
 (2)十六进制常数
 以H结尾。必须以数字开头,如果以字母开头的十六进制,必须在前面加0.
 (3)二进制常数
 必须以字母B结尾
 (4)八进制常数
 必须以Q结尾。
 (5)字符串常数
 一个字符串常数是用引号括起来的一个或多个字符。
 'A'是41H,'a'是61H
 2.算术运算符:
 +-*/ mod
 ADD AX,100*4/2
 3.关系运算符
 EQ,NE,LT,GT,LE,GE
 运算结果是一个数字值,若关系成立,结果为0,若关系成立,结果为0FFFFH
 例如:
 MOV AX,1234H GT 1024H
 等同于 MOV AX , 0FFFFH
 4.逻辑运算符
 AND OR XOR NOT SHL SHR 逻辑运算结果是数值
 MOV BX,((PROT-VAL LT 5)AND 20)
  OR ((PROT-VAL GE 5)AND 30)
  则当PORT-VAL<5时,汇编结果为:
  MOV BX,20
  否则为 MOV BX,30
  
  逻辑运算符与指令助记符的区别:表达式中的逻辑运算是由汇编程序在汇编时完成的。
  
  5.在数值表达式中使用的操作符
   (1)HIGH
     HIGH 数值表达式
     结果是数值表达式的高8位
   (2)LOW
     LOW 数值表达式
     结果是数值表达式的低8位
例子: MOV AL,LOW 3080H 将汇编成 MOV AL,80H
    MOV AX,HIGH 1234H+5  将汇编成MOV AX,17H
    MOV AX,HIGH (1234H+5) 将汇编成MOV AX 12H
    HIGH优先级高于+
   
 6.运算符合操作符的优先级
 括号 -->PTR OFFSET TYPE -->*/MOD SHL SHR --->HIGH LOW --->+-
 ---> EQ,NE ...--->NOT--->AND--->OR,XOR--->SHORT
 
(三)地址表达式
 地址表达式表示的是存储器操作数的地址。
 在一个存储器地址加或减一个数字量,结果仍为存储器地址。
 在变址寻址方式时,下面方法等价:
 [VARW+BX] VARW[BX]
 在表示基址加变址寻址方式时,下面方法等价:
 VARW[BX+DI] VARW[BX][DI] [VARW+BI+DI] VARW[DI][BX]

二.变量和标号
变量和标号都代表存储单元
变量表示的存储单元中存放数值;
标号表示的存储单元存放指令代码。
(一)数据定义语句
通过数据定义语句可分为数据项分配存储单元。
代表数据项的符号本身称为变量名,与之相对于的存储单元用于存放变量,所以常常把这存储单元称为变量
 1.数据定义语句是最常用的伪指令语句
 [变量名] 数据定义符 表达式  ;注释
 例: VARB DB 3
    WARW DW -1234
    BUFF DB 100,3+4,5*6
 (1)定义字节数据项
  每一个字节数据项占用一个字节存储单元
  数据定义符是DB
  例: COUNT DB 100
        DB 0DH,OAH
     TABLE DB 0,1,4
 (2)定义字数据项
  每一字数据项占用两个字节存储单元
  数据定义符 DW
 (3)定义双字数据项
   每一双字数据项占用四个字节存储单元
   数据定义符 DD
 (4)定义没有初值的数据项
  不预置对应变量的初值,仅仅给变量分配存储单元
  INBUFF DB 5,?,?,?
  VARW DW ?
 (5)定义字符串
   定义字节数据伪指令DB也可以用于定义字符串
   字符串要用引号括起来,单引号双引号都可以
   MESS1 DB 'HELLO' 等价于 MESS1 DB 'H','E','L','L','O'
   MISS DB "AB"
   MISS2 DW 'AB' 等价于 MISS2 DB 'B','A'
   
例子:DA1为字符串变量,用字变量(DW)设置一字符串‘STUDENTS’
DA1 DW 'TS','DU','NE','ST'

 (6)定义其他类型的数据项
 定义8字节数据项 DQ
 定义10字节  DT
 
 2.重复操作符DUP
  BUFFER DB 8 DUP(0)
  等价于 BUFFER DB 0,0,0,0,0,0,0,0,0
(二)变量和标号
 1.变量和标号的属性
  变量表示存储单元,这种存储单元存放数值
  标号表示存储单元,这种存储单元存放机器指令代码
  
  变量和标号都表示存储器操作数,都具有三种属性:
  (1)段值:所在段的段值
  (2)偏移:起始地址的段内偏移
  (3)类型:变量的类型主要是字节、字、双字
        标号的类型主要是近和远
 2.析值操作数(数值回送操作符)
  把一些特征或存储器地址的一部分作为数值回送
  SEG 变量名或标号
  OFFSET 变量名或标号(只能取数字定义的伪操作定义的变量的偏移地址,不能取一般操作数的地址)
  TYPE 变量名或标号
  LENGTH 变量名
  SIZE 变量名
  
  (1)SEG
  MOV AX,SEG VARW 返回变量所在段的段值
  (2)OFFSET
  MOV BX,OFFSET VARW 返回偏移
  MOV DI,OFFSET VARW+2
  (3)TYPE
  TYPE返回变量或标号的类型,用数值表示:
  BYTE---> 1  WORD---> 2
  DWORD---> 4 NEAR---> -1 FAR---> -2
  
  ADD SI,TYPE VARW ;设VARW为DW
  汇编将程序形成为:ADD SI,2
  (4)LENGTH
  LENGTH返回利用DUP定义的数组中元素的个数
  如果变量语句没有使用DUP,则返回1
  MOV CX,LENGTH VARW ;如果VARW没有使用DUP,1送CX
  如果是嵌套使用DUP,则只返回最外层的重复数
  (5)SIZE
  SIZE返回用DUP定义的数组占用的字节数
  SIZE = LENGTH+TYPE
  
 3.属性操作符
 为了提高访问变量、标号和一般存储器操作数的灵活性,汇编语言还提供了属性操作符以达到按
 指定属性访问的目的
 
 (1)操作符PTR
 汇编程序在汇编指令MOV [SI],1时将发出警告提示信息或出错提示信息、
 MOV WORD PTR [SI],1 ;指明字类型
 MOV BYTE PTR [SI],1 ;指明字节类型
 PTR操作符并不分配存储单元,而只是临时强制指定变量或标号的类型
 JMP FAR PTR OK ;OK是标号
 JMP DWORD PTR OK ;OK是变量
 
三.常用伪指令语句和源程序组织
(1)符号定义语句
  1.等价语句EQU
  符号名 EQU 表达式
  COUNT EQU 100 ;符号COUNT代表常数100
  BUFF_LEN EQU 4*COUNT ;COUNT是已定义的符号常数
  MOVE EQU MOV ;用MOVE代替指令助记符MOV
  COUNT EQU CX ;用COUNT代替寄存器CX
  
  等价语句不能重新定义,不另外给符号分配存储单元
  
   2.等号语句(=)
  用符号来代表一个常数
  XX=10
  ABCD=1
  ABCD=100 ;等号语句可以重新定义
  
    3.定义符号名语句
  符号名 LABEL 类型
  定义有符号名指定的符号,使该符号的端属性和偏移属性与下一个紧接着的
  的存储单元的段属性和偏移属性相同,使该符号的类型为参赛所规定的类型
  
例:BUFFER LABEL WORD
  BUFF DB 100 DUP(0) ;BUFFER类型是WORD,段属性和偏移属性与BUFF相同
  
例:QUIT LABEL FAR
  EXIT:MOV AH,4CH
  这样指令MOV AH,4CH就有了两个标号QUIT,EXIT,但类型不同
  
 (2)段定义语句
  段名 SEGMENT [定位类型][组合类型][类别]
  ...
  段名 ENDS

例子:一个简单的数据段:
  DSEG SEGMENT
     MESS DB 'HELLO' ,0DH,0AH,'S'
  DSEG ENDS
   一个简单的代码段(先定义数据段附加段堆栈端,最后定义代码段):
   CSEG SEGMENT
      MOV AX,DSEG ;把DSEG数据段送给AX
      MOV DS,AX ;通过AX送给DS
      MOV DX,OFFSET MESS      
   CSEG ENDS
  
   由于指令语句和数据定义语句都要占用存储单元,所以它们一定安排在某个程序段内
  
 2.段使用设定语句
 段寄存器与程序段的对应关系应使用段使用设定语句说明
 ASSUME 段寄存器名:段名[,段寄存器:段名]
 ASSUME是伪指令
  CSEG SEGMENT
      ASSUME CS:CSEG,DS:DSEG
      MOV AX,DSEG ;把DSEG数据段送给AX
      MOV DS,AX ;通过AX送给DS
      MOV DX,OFFSET MESS      
   CSEG ENDS
 关键字NOTHING表示某个段寄存器不再与任何段有对应关系
 ASSUME ES:NOTHING
 
 3.ORG语句
 使用地址计数器来保存当前正在汇编的指令或变量的地址的偏移
 ORG 数值表达式
 
 伪指令org用来规定目标程序存放单元的偏移量。比如,如果在源程序的第一条指令前用了如下指令:
  org 200h
 那么,汇编程序会把指令指针的ip的值设成200h,即目标程序的第一个字节放在200h处,后面的内容则
 顺序存放,除非遇上另一个org 语句
 
 另外汇编语言使用$表示地址计数器的值
 ORG $+8;跳过8个字节的存储区
 当$用在伪指令参数中时,它表示的是地址计数器的当前值
 ARRAY DW 1,2,$+4,3,4,$+4
 
四.顺序程序设计
DATA SEGMENT
BCD-BUF DB 96H
ASC-BUF DB 2 DUP(?)
DATA ENDS
CODE SEGMENT
 ASSUME CS:CODE,DS:DATA
START:
   ...
CODE ENDS
   END START

五.分支程序设计
比较两个无符号数的大小,把大数存入MAX单元
DATA SEGMENT
  SOURCE DB X1,X2
  MAX DB ?
DATA SEGMENT
  ASSUME CS:CODE,DS:DATA
  MOV AX,DATA
  MOV DS,AX
  MOV AL,SOURCE  ;直接寻址,请看笔记(一)中MOV AX,VALUE
  CMP AL,SOURCE+1
  JNC ONE
  MOV AL,SOURCE+1
ONE:MOV MAX,AL
CODE ENDS
  END

你可能感兴趣的:(汇编,table,存储,buffer,语言,byte)