汇编语言程序设计 - AppServ Open Project 2.5.6

Download Report

Transcript 汇编语言程序设计 - AppServ Open Project 2.5.6

第6章
第6章:教学重点
汇编语言源程序格式与开发
常量、变量和标号
汇编语言程序设计方法
顺序程序设计
分支程序设计
循环程序设计
子程序设计
第6章:6.1 汇编语言语法
完整的汇编语言源程序由段组成
一个汇编语言源程序可以包含若干个代码段、数
据段、附加段或堆栈段,段与段之间的顺序可随
意排列
需独立运行的程序必须包含一个代码段,并指示
程序执行的起始点,一个程序只有一个起始点
所有的可执行性语句必须位于某一个代码段内,
说明性语句可根据需要位于任一段内
通常,程序还需要一个堆栈段
源程序由语句序列构成
6.1.1 计算机程序设计语言的演变
机器语言(Machine Language)
汇编语言(Assembly Language)
区别汇编语言源程序、汇编程序、机器语言目
标程序
80X86有两种汇编程序:
• 小汇编ASM(Small Assembler)
• 宏汇编MASM(Macro Assembler)
高级语言(High-level Language)
6.1.2 为什么要用汇编语言编写程序
非常接近机器语言,通过编制汇编语言程
序,可以更清楚地了解计算机的工作过程。
可以直接、有效地控制计算机硬件,发挥
机器长处
在有些应用领域,汇编语言的作用是不容
置疑和无可替代的,如机器的自检、系统
初始化等
容易创建代码序列短小、运行快速的可执
行程序
6.1.3 汇编语言的语句种类及其格式
语句种类
指令语句
• 汇编后对应一条指令代码。由处理器指令组成的代
码序列是程序设计的主体
伪指令语句
• 指示源程序如何汇编、变量怎样定义、过程怎么设
置等
宏指令语句
• 具有独立功能的一段程序代码
第6章:汇编语言的语句格式
⑴执行性语句——执行性语句用于表达处理
器指令(也称为硬指令),汇编后对应一条指
令代码。由处理器指令组成的代码序列是
程序设计的主体
标号: 硬指令助记符 操作数,操作数
;注释
⑵说明性语句——说明性语句用于表达伪指
令,指示源程序如何汇编、变量怎样定义、
过程怎么设置等
名字 伪指令助记符 参数,参数,…… ;注释
第6章:硬指令与伪指令
硬指令(Instruction)——使CPU产生动作、并
在程序执行时才处理的指令
硬指令就是第4章学习的处理器指令,与具体的处
理器有关、与汇编程序无关
伪指令(Directive)——不产生CPU动作、在程
序执行前由汇编程序处理的说明性指令
伪指令与具体的处理器类型无关,但与汇编程序
有关。不同版本的汇编程序支持不同的伪指令
硬指令和伪指令采用易于记忆的符
合表达,这就是助记符
第6章:标号、名字与标识符
标号是反映硬指令位置(逻辑地址)和属性的标
识符,后跟一个冒号分隔
名字是反映伪指令位置(逻辑地址)和属性的标
识符,后跟空格或制表符分隔,没有冒号
标识符(Identifier)一般最多由31个字母、数字
及规定的特殊符号(如 _、$、?、@)组成,不
能以数字开头。默认情况下,汇编程序不区别标
识符中的字母大小写
一个源程序中,每个标识符的定义是唯一的,还
不能是汇编语言采用的保留字
第6章:保留字
保留字(Reserved Word)是汇编程序已经
利用的标识符(也称为关键字),主要有:
硬指令助记符——例如:MOV、ADD
伪指令助记符——例如:DB、DW
操作符——例如:OFFSET、PTR
寄存器名——例如:AX、CS
预定义符号——例如:@data
汇编语言大小写不敏感
第6章:操作数和参数
处理器指令的操作数可以是立即数、寄存器
和存储单元。可不带、1个或2个操作数,若
有两个操作数时,中间用“,”分开
伪指令的参数可以是常数、变量名、表达式
等,可以有多个,参数之间用逗号分隔
第6章:注释
语句中由分号“;”开始的部分为注释内容,
用以增加源程序的可读性
必要时,一个语句行也可以由分号开始作为
阶段性注释
汇编程序在翻译源程序时将跳过该部分,不
对它们做任何处理
第3章:分隔符
语句的4个组成部分要用分隔符分开
标号后用冒号,注释前用分号
操作数之间和参数之间使用逗号分隔
其他部分通常采用空格或制表符
多个空格和制表符的作用与一个相同
MASM支持续行符 “\”
6.1.4 常数、标号、变量及表达式
1.常数
常数表示一个固定的数值,它又分成
多种形式
数值常数
字符串常数
符号常数
常数除自身的值以外,没有其他属性
第6章:数值常数
指由10、16、2和8进制形式表达的数值,各种进
制的数据以后缀字母区分,默认不加后缀字母的
是十进制数
十进制
由0 ~ 9数字组成,以字母D(d)结
100,255D
尾(缺省情况可以省略)
由0 ~ 9、A ~ F数字组成,以字母H 64H,0FFH
十六进制 (h)结尾,以字母开头的常数需要
0B800H
加一个前导0
由0和1两个数字组成,以字母B(b)
01100100B
二进制
结尾
第6章:字符串
字符串常量是用单引号或双引号括起来的
单个字符或多个字符
其数值是每个字符对应的ASCII码值
例如:
‘d’(等于64H)
‘AB’(等于4142H)
‘Hello, Assembly !’
‘179’(31H、37H、39H)
第6章:符号常量
符号常量使用标识符表达一个数值
MASM提供等价机制,用来为常量定义符号名
符号定义伪指令有“等价EQU”和“等号=”:
符号名 EQU 数值表达式
符号名 EQU <字符串> ;MASM 5.x不支持
符号名 = 数值表达式
EQU用于数值等价时不能重复定义符号名,
但“=”允许有重复赋值。例如:
X
X
=7
= X+5
;等效于:X qeu 7
;“X EQU X+5”是错误的
第6章:2.名字和标号
名字和标号是用户自定义的标识符。名字指向一条
伪指令,标号指向一条硬指令。名字和标号一经使
用便具有两类属性:
⑴ 逻辑地址——名字和标号对应存储单元的逻辑
地址,含有段地址和偏移地址;
⑵ 类型——变量名的类型可以是BYTE(字节)、
WORD(字)和DWORD(双字)等;标号、段
名 、 子 程 序 名 的 类 型 可 以 是 NEAR ( 近 ) 和
FAR(远),分别表示段内或段间调用
汇编程序提供有关的操作符,以便获取这些属性值
第6章:3. 变量
变量实质上是指内存单元的数据,虽然内存单元
地址不变,但其中存放的数据可以改变
变量需要事先定义才能使用
变量定义(Define)伪指令为变量申请固定长度
为单位的存储空间,并可以同时将相应的存储单
元初始化
定义后的变量可以利用变量名等方法引用其中的
数据,即变量的数值
变量具有3个属性
段 地 址 ( SEG ) 、 偏 移 地 址 ( OFFSET ) 、 类 型
(TYPE)
第6章:1) 变量的定义
变量定义的汇编语言格式为:
变量名 伪指令 初值表
变量名为用户自定义标识符,表示初值表首元素
的逻辑地址,常称为符号地址。变量名也可以没
有
初值表是用逗号分隔的参数,主要由常量、数值表
达式或“?”组成。其中“?”表示未赋初值
多个存储单元如果初值相同,可以用复制操作符
DUP进行定义:
重复次数 DUP(重复参数)
变量定义伪指令有DB、DW、DD、DQ、DT等
第6章:字节变量的定义DB(Define Byte)
DB伪指令用于分配一个或多个字节单元,
并可以将它们初始化为指定值
初值表中每个数据一定是字节量,存放一
个8位数据:
可以是0~255的无符号数
或是-128~+127带符号数
也可以是字符串常数
;数据段
X
Y
db 'a',-5
db 2 dup(100),?
db 'ABC'
字节变量定义实例
第6章:字节变量的应用
mov al,X
;此处X表示它的第1个数据,故AL←'a'
dec X+1
;对X为始的第2个数据减1,故成为-6
mov Y,al
;现在Y这个字符串成为 'aBC'
第6章:字变量的定义DW(Define Word)
DW伪指令用于分配一个或多个字单元,并
可以将它们初始化为指定值
初值表中每个数据是字量,一个字单元可
用于存放任何16位数据:
一个段地址
一个偏移地址
两个字符
0~65535之间的无符号数
-32768~+32767之间的带符号数
;数据段
count
maxint
number
array
dw 8000h,?,'AB'
equ 64h
dw maxint
dw maxint dup(0)
字变量定义实例
第6章:双字变量的定义DD(Define Double word)
DD伪指令用于分配一个或多个双字单元,
并可以将它们初始化为指定值
初值表中每个数据是一个32位的双字量:
可以是有符号或无符号的32位整数
也可以用来表达16位段地址(高位字)和16位
的偏移地址(低位字)的远指针
vardd
DD 0,?,12345678h
farpoint DD 00400078h
第6章:2)变量的应用
变量具有存储单元的逻辑地址
程序代码中
通过变量名引用其指向的首个数据
通过变量名加减位移量存取以首个数据为基地
址的前后数据
例题 变量的定义和应用
第6章:例题:变量的定义
;数据段
bvar1 db 100,01100100b,64h,'d'
;字节变量:不同进制表达同一个数值,内存中有4个64H
minint = 5
;符号常量:minint数值为5,不占内存空间
bvar2 db -1,minint,minint+5
;内存中数值依次为FFH,5,0AH
db ?,2 dup(20h)
;预留一个字节空间,重复定义了2个数值20H
wvar1 dw 2010h,4*4
;字变量:两个数据是2010H、0010H,共占4个字节
wvar2 dw ?
;wvar2是没有初值的字变量
第6章:例题:变量的定义(续)
dvar
dd 12347777h,87651111h,?
;双字变量:2个双字数据,一个双字空间
abc
db ’a’,’b’,’c’,? ;定义字符,实际是字节变量
maxint equ 0ah
;符号常量:maxint=10
string db ’ABCDEFGHIJ’
;定义字符串:使用字节定义DB伪指令
crlfs
db 13,10,’$’
;回车符0DH、换行符0AH和字符'$'=24H
array1 dw maxint dup(0)
;10个初值为0的字量,可以认为是数组
array
db 2 dup(2,3,2 dup(4))
;6个字节内容依次为:02 03 04 04 02 03 04 04
第6章:例题:变量的应用
;代码段
mov dl,bvar1
dec bvar2+1
mov abc[3],dl
mov ax,word ptr dvar[0]
mov dx,word ptr dvar[2]
add ax,word ptr dvar[4]
adc dx,word ptr dvar[6]
mov word ptr dvar[8],ax
mov word ptr dvar[10],dx
;DL=100
;bvar2+1=4
;abc=’abcd’
;取双字到DX.AX
;加双字到DX.AX
;保存双字的求和结果
第6章:例题:变量的应用(续)
mov cx,maxint ;CX=10
mov bx,0
;BX=0
again: add string[bx],3 ;string每个数值加3
inc bx
loop again
;循环
lea dx,abc
;从abc开始
mov ah,9
;09H号DOS功能调用
int 21h
;显示结果:abcdDEFGHIJKLM
第6章:3)变量的定位
汇编程序按照指令的先后顺序一个接着一个分配
存储空间,按照段定义伪指令规定的边界定位属
性确定每个逻辑段的起始位置(包括偏移地址)
定位伪指令ORG控制数据或代码所在的偏移地址
ORG 参数
ORG伪指令是将当前偏移地址指针指向参数表达
的偏移地址。例如:
ORG 100h
;从100H处安排数据或程序
ORG $+10
;偏移地址加10,即跳过10个字节空间
汇编语言程序中,符号“$”表示当前偏移地址值
第6章
4.表达式
表达式由操作数和运算符组成。源程序中
的表达式经汇编后得到一个值作为操作数
操作数,可表达一个数据,也可能代表一
个存储单元的地址。可能是一个具体的数
值,也可能是一个标识符
运算符,用一个运算符可对一个或几个操
作数进行运算,构成一个表达式,有五类
算数运算符、逻辑运算符、关系运算符、分析
运算符、综合运算符
第6章 算数运算符
算数运算符包括加、减、乘、除(/)和取
模(MOD)。其中MOD为两数相除的余数,
但两操作数必须为正
82 MOD 16 ;结果为2
B5H MOD 20H ;结果为21
20H MOD 7 ;结果为4
第6章 逻辑运算符
包括AND、OR、NOT、XOR
两数进行逻辑运算是两数的对应位按位进行相应
的逻辑运算
11001100B
11001100B
11001100B
NOT FFH
AND 11110000B ;11000000B
OR 11110000B ;11111100B
XOR 11110000B ;00111100B
;00H
应注意的是,逻辑操作符和逻辑运算指令的操作
助记符相同。只有当他们出现在指令的操作数部
分时,汇编程序才将他们看成逻辑运算符
AND DX,PORTA AND 0FEH
第6章 关系运算符
关系运算符有:EQ、NE、LT、GT、LE、
GE
参加运算的两个操作数必须都是数据或者
是同一段中的存储单元地址,结果总是数
值。关系成立时,结果为全1,否则为全0
MOV BX,PORT LT 5
MOV BX,((PORT LT
((PORT GE 5) AND 30)
• MOV BX,20
• MOV BX,30
5) AND 20) OR
;PORT小于5
;PORT大于或等于5
第6章 分析运算符
可以把一个存储单元地址分解为段地址和偏移量
有OFFSET、SEG、TYPE、SIZE、LENGTH
表6.1 分析运算符表达式
带分析运算符的表达式
表达式的意义
OFFSET 变量名或标号
取出操作数所在段偏移地址
SEG 变量名或标号
取出操作数所在段地址
TYPE 变量名或标号
取出操作数的类型
SIZE 变量名
取出操作数的大小
LENGTH 变量名
取出操作数的长度
第6章 分析运算符
TYPE根据操作数分配的存储单元的类型,
返回值不同。字节为1、字为2、双字为4
LENGTH对于变量中使用DUP的情况,汇
编程序将给出分给该变量的单元数,而对
于其他情况则给出值1
DATA6 DW ‘AB’,’c’,’D’ ;LENGTH DATA6=1
ABC DW 100DUP(?) ;LENGTH ABC=100
SIZE用来计算一个变量存储区所占用的字
节数。SIZE ABC=200
SIZE=LENGTH*TYPE
第6章 综合运算符
有PTR(用来对存储单元规定类型)、THIS(用来改变
存储区的类型),用于规定所指变量或标号类型属性或距
离属性
PTR格式:类型 PTR 表达式
类型包括:BYTE、WORD、DWORD、NEAR、FAR,后两个为
标号类型
例:MOV BYTE PTR[1000],0
MOV WORD PTR[1000],0
THIS的操作对象:BYTE、WORD、DWORD、NEAR、
FAR(用于创建采用当前地址但为指定类型的操作数)
XYZ EQU THIS BYTE等效于:BYTE PTR XYZ
用来改变存储区类型,即可作为字节类型用,也可作为字类型使
用,则可如下处理:
• XYZ-2 EQU THIS TYPE
• XYZ-1 EQU THIS BYTE
• XYZ
DW ?
THIS的格式
格式:
变量 EQU THIS 类型
标号 EQU THIS 距离
功能:
THIS与EQU一起将EQU THIS右边的类型赋给左边的
变量或将EQU THIS右边的间距离赋给左边的标号。
例如:
DATA1 EQU THIS BYTE
TABLE DW 200 DUP(?)
又如:
LL1 EQU THIS FAR
MOV AX,100