第四章 汇编语言程序设计(assembly language programming)
§4.1 汇编语言(assembly language) 一.概述
汇编语言:一种符号语言,它用助记符表示指令的操作码和操作数,
用标号或符号代表地址、常量和变量,与机器语言几乎一一对应 汇编:把汇编语言源程序翻译成机器语言目标程序的过程 汇编语言源程序 手工汇编或汇编程序 机器语言目标程序
汇编程序:用来完成汇编工作的程序,有 小汇编ASM 宏汇编MASM 动态调试程序DEBUG 二.汇编语言的语句
格式: [名称] 指令助记符 [操作数] [;注释] 带方括号的项有时可没有,注释项完全可以没有
每个部分用空格分开
每行最多可有132个字符,但最好不要超过屏宽80
语句可分成指令性语句和指示性语句(伪指令语句) 指令性语句汇编后可生成机器码
[标号:] 指令助记符 [操作数] [;注释] 指示性语句指示汇编程序处理一些工作
[名称] 伪指令(指示符) [操作数] [;注释] 1.名称(或称标识符)
给指令或存储单元地址起的名字,由字母、数字、字符组成 字母:A~Z ,a~z 数字:0~9
字符:可打印 + - * / = ( ) [ ] 〈 〉 ; . ' ’ ,
_ : ? @ $ &
(非打印 空格 制表符TAB 回车 换行)
(界符: , ; : .( )[ ]〈 〉+ - * / = ? _ @ &
$ ' ’ 界符用来表示某个标志的结束)
? 数字不能作名称的第一个字符,圆点 .仅能作第一个字符 ? 保留字不能作标识符($、?是保留字,与其它字符组合除外) ? 名称最长为31个字符
? 当名称后跟冒号,表示该名称是其后指令的标号,代表该指令
的开始地址,其他指令可以用该标号作为转移地址
? 当名称不跟冒号,它可能是标号或变量名,伪指令前的名称不
跟冒号
冒号隐含NEAR属性,例:
供段内调用写成 OUTPUT:OUT DX ,AL 供段间调用写成 OUTPUT OUT DX ,AL 2.指令助记符
1
8086/8088指令,也可以是伪指令,如果指令有前缀(LOCK、REP
等)则前缀和指令用空格分开
3.操作数
指令执行的对象,可能有一、二个或没有 名称 指令助记符 操作数 注释
RET ;返回(无操作数) COUNT: INC CX ;CX加1(1个操作数) MOV AL,BL ;AL?BL(2个操作数) 伪指令可有多个操作数
COST DB 3,4,5,6,7,8 ;(6个操作数,用逗号分开) 操作数可以是常数、寄存器名、标号、变量、表达式, MOV AX,[BP+4];(第二个操作数为表达式) 4.注释
可选项,使程序易读,汇编时不作处理
注释前面要加分号,它可位于操作数之后,也可位于行首
三.常量与变量
1.常量,也叫常数,没有属性的纯数,汇编时已确定的值
·数字常量为0~65535中的数(16位寄存器使用,伪操作可定义32
位),进制加后缀说明,十进制加D(可省),二进制加B,八进制加Q,十六进制加H,若十六进制第一位为字母,则前头应加0
·字符和字符串叫串常量,是ASCII码字符串,必须加单(或双)
引号
例:‘A’,“ABC”,汇编后变成41H,414243H 2.变量,用于表达数值(或串)的标识符,有三个属性 ① 段属性(SEGMENT) ② 偏移地址属性(OFFSET)
③ 类型属性(TYPE),用DB、DW、DD定义 §4.2 伪指令(pseudo-instruction) 一.符号定义伪指令 1.等值EQU
格式:符号名 EQU 表达式
用来给符号定义一个值,程序中出现该符号就用其值代替,EQU
只能定义一次
DATA EQU 1234 ;代表一个数 XYZ EQU ALPHA[SI] ;代表一个地址 2.等号 =
格式:符号名 = 表达式
意义与EQU一样,但程序中可重新定义符号的值 EMP = 6 ;EMP代表6 EMP =EMP + 1 ;EMP现在代表7 3.解除PURGE
2
格式:PURGE 符号名(符号1,符号2,??,符号n) 用于解除所定义的符号使该符号在以后的定义中有效 例:原定义 TAB EQU 5
可用 PURGE TAB 来解除 然后可重新定义 TAB EQU 10 二.数据定义伪指令
用于预置存储器或定义变量 1.定义字节DB
格式:[变量名称] DB 表达式
例:DATA1 DB 2,3,4,5;从DATA1单元开始存放4字节数据 2.定义字DW
格式:[变量名称] DW 表达式
例:TAB DW 1234H;TAB单元内容为34H,TAB+1单元内容为
12H
3.定义双字DD
格式:[变量名称] DD 表达式
每个数据二字(四字节)低位部分在低地址,高位部分在高地址 ·用DB/DW/DD定义的数每行不得超过16项,超过16项必须换行 DB/DW/DD用法
<1> SUM DB ? ;给SUM单元分配一个字节,内容未定 <2> TAB DB 20 DUP(0);给TAB开始单元分配20字节,内容为0 <3> TIME DW 100 DUP(?);给TIME开始单元分配100字,内容
未定
<4> ADDR DD TABLE ;TABLE的地址(双字)给ADDR 100H 01 例:DATA SEGMENT
101H 02 ORG 100H 102H 03 103H 04 TABLE DB 1,2,3,4
104H 00 ADDR DD TABLE 105H 01 106H A2 DATA ENDS
107H 13 假设汇编后DS=13A2H
┇ (如果ADDR用DW定义,只得偏移量) (如果TABLE是变量,ADDR得地址,是常量,ADDR得数值) <5> LETTER DB ‘ABCDEFG’;将字符串以ASCII码形式填入
LETTER开始的内存
<6> HIS DB 3 DUP(‘WELCOME!’,0DH,0AH);从HIS单元开
始重复3次存放WELCOME!和回车换行符
4.标号LABEL
格式:标号名 LEBEL 类型
标号用于说明可执行代码在汇编语言程序中的位置,即符号地址,
供调用和转移之用
标号有三个属性 段属性
3
偏移量属性
距离属性(即格式中的类型):NEAR(近程)和FAR(远程) NEAR:本标号为段内标号,调用本标号只提供偏移地址,段
基址为当前代码段
FAR:本标号为段间标号,调用本标号提供偏移地址和段基址 一个具有NEAR属性的标号也可用标号加冒号作后缀,并排列在
代码行的开头来隐含
如 AGAIN LABEL NEAR XOR AX,BUFF[BX] 可写成 AGAIN:XOR AX,BUFF[BX]
例:ROOT LABEL NEAR ;以下程序所用的ROOT标号是段内属
性
COMP PROC NEAR ;以下程序所用的过程下的标号是段内
属性
TIME PROC FAR ;以下程序所用的过程下的标号是段间属
性
三.运算符 1.算术运算符
+、-、*、/、MOD即加、减、乘、除、除法取余数(如19 MOD
7=5)
操作数是数字,结果也是数字
存储器地址运算时只有加减,例TAB+2、BETA-5等 2.逻辑运算符
AND、OR、XOR、NOT即与、或、异或、非 操作数是数字,结果也是数字 例:AND BX,DAT AND 0FEH 3.关系算符
EQ、NE、LT、GT、LE、GE即相等、不等、小于、大于、小于
等于、大于等于
若关系是假结果为0,若关系是真结果为0FFFFH 例:MOV BX,PAD LT 3
则PAD的值小于3时,汇编成MOV BX,0FFFFH 否则,汇编成MOV BX,0 4.分析运算符
可把存储器操作数分解成它的组成部分,如段值、段内偏移量、
类型
5.合成算符
由已存在的存储器操作数生成一个段值与偏移量相同,而类型不
同的新的存储器操作数
以下讨论分析算符和合成算符 1.取段基址SEG
它加于一个变量或标号之前,回送段基址,例:
4
ASSUME CS:SEG BEGIN ;令CS为BEGIN程序段段基址 MOV AX,SEG VARN ;将VARN的段基址送AX 2.取偏移量OFFSET
它加于一个变量或标号之前,取其偏移量,例:
MOV BX,OFFSET SUM ;将SUM的段内偏移量存入BX 3.取类型码TYPE
它加于一个变量或标号之前,取其类型代码
DB DW DD DQ DT NEAR FAR 1 2 4 8 10 -1 -2 例:NG1 DB ‘A’,‘D’,3 NG2 DW 88,265 ??
MOV AL,TYPE NG1 ;NG1定义字节,AL ? 1 MOV AL,TYPE NG2 ;NG2定义字,AL ? 2 4.取长度LENGTH
它加于一个变量之前,取分配给变量的项数 例:TAB DB 150 DUP(?) ;150项,150字节 FUM DW 150 DUP(?) ;150项,300字节 则,MOV CX,LENGTH TAB ;CX ? 150 MOV AX,LENGTH FUM ;AX ? 150
·注意:LENGTH返回的存储区必须用DUP()来定义,否则返
回为1
5.取字节数SIZE
它加于一个变量之前,取回变量所占字节总数,有 SIZE = LENGTH * TYPE
由上例,LENGTH TAB = 150,TYPE TAB = 1 LENGTH FUM = 150,TYPE FUM = 2 可知: SIZE TAB = 150 SIZE FUM = 300 以上5个叫数值返回算符 6.类型指示PTR
格式:类型 PTR 地址表达式
表示PTR右边的(存储器)操作数是左边的类型,有: BYTE、WORD、DWORD、NEAR、FAR
例:INC BYTE PTR [BX] ;将BX指向的单元字节加1 MOV WORD PTR [DI],99 ;立即数99送DI指向的字中 JMP NEAR PTR FOK ;以近程方式跳转到FOK(只取
FOK偏移地址)
7.指定符THIS(合成算符) 用于定义当前所指单元中的类型 格式:THIS 类型/距离
经THIS定义过的标号具有当前汇编段、偏移量和所规定的类型
5