汇编语言包括顺序结构、分支结构和循环结构
一.汇编语言的语句
(一)语句的种类和格式
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