汇编语言源程序中以语句表示指令,语句有三种基本类型:
1、指令:汇编后形成一条机器语言指令,它们之间是一一对应的,在程序执行时指令得以执行。
2、伪指令:只是告诉汇编程序如何进行汇编,汇编后没有生成机器语言指令,他在程序汇编时得以执行。
3、宏指令:它是由用户自己定义的指令,由指令和伪指令构成,他在程序汇编进行时宏展开,以相应的指令和伪指令替代宏指令。
1/1、汇编语言中语句的组成
汇编语言中的语句由以下四部分组成:
名称 空格或: 操作助记符 空格 操作数 ;注释
注 : 每条语句可以有名称,也可以没有名称。这种名称有两种含义:
1. 标号: 当语句中名称与助记符之间以冒号间隔时,该名称表示标号,用于表示指令的地址(段地址、偏移地址)。
2. 变量名: 当语句中名称与助记符之间以空格间隔时,该名称表示变量名,用于表示存放数据的储存空间。
1/2、汇编语言中的常数与表达式
常数 :
数值:B(二进制)、 D(十进制)、 H(十六进制)
字符串: 单引号内部 ,表示各字符的ASCII 码
表达式 : 由操作数和操作符组成
""" 算数操作符:+、-、*、/、MOD 逻辑操作符:AND OR NOT XOR 关系操作符:EQ(相等)、 EN (不等) LT (小于)、 GT (大于) LE (小于等于)、GE(大于等于) """
1/3 标号、变量
#标号用于指示相应指令的地址,与助记符之间用冒号间隔 例 : START:MOV AX,1000 注: 标号START代表了指令“ START:MOV AX,1000”的地址,这样,可以使用转移语句JMP START ,转移到改地址。
#变量由伪指令来定义,之间用空格而不是冒号 格式为: 变量名 DB/DW/DD/DQ/DT 表达式 ;定义(8/16/32/64/80) 注: 1、变量名可有可无 2、一个或多个表达式或常数之间用逗号分隔 3、一个、多个问号(?),这是表示只给变量分配存储空间 4、重复方式,这时表达式的形式为 重复次数 DUP (表达式)
5、$ 出现在表达式中时,表示当前汇编语句的偏移地址
6、伪指令 DW DD 的特殊用法
伪指令DD DW 除定义变量外,还可以用来预置变量的段内偏移地址
DW 用法格式 : 变量名1 DW 变量名2
例: AD2 DW AD1 ; AD2指向AD1的起始地址
DD 用法格式和上面用法相同
例: AD4 DD AD1 ; AD4指向AD1的起始地址(只是DD为双字,第一个字内存放段内偏移地址,第二个字为段地址)
1/4 属性操作符和PTR 操作符
PTR操作符可以用来暂时改变已经定义过的变量或标号的类型(包括BYTE字节型、WORD字型、DWORD双字型,也可以取标号的类型NEAR近型、FAR远型)
使用格式 : 类型 PTR 表达式
#属性操作符 SEG 取出段地址 OFFSET 取出偏移地址 TYPE 取出其类型 LENGTH 取出变量重复的次数 SIZE 取出变量的大小
2/1 数据与转移地址的寻址方式
1、数据的寻址方式:寻找指令操作所需数据的方法
2、转移地址的寻址方式: 寻找转移指令所需程序地址的方法
#数据的寻址方式 8086CPU指令系统的常用数据寻址方式有8种:立即寻址、寄存器寻址、存储器寻址(5种:直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、基址变址且相对寻址)、隐含寻址 以下通过一些例子介绍较难理解的寻址方式: #寄存器相对寻址 MOV CX,VAR1[BX] ; (CX)<--((BX)+OFFSET VAR1) MOV AL,VAR2[DI-15] ; (AL)<--((DI)+(OFFSET VAR2 -15)) MOV 5[SI+24],DX ;((SI)+(5+24))<--(DX) #基址变址寻址 MOV DX,[BX][SI] ;(DX)<--((BX)+(SI)) MOV AX,[BP][SI] ;(AX)<--((BP)+(SI)) BP默认段地址在SS段 #基址变址且相对寻址 MOV VAR1[BP][DI],AX ;((BP)+(DI)+OFFSET VARI)<--AX #隐含寻址 MOVSB ;指令含义:从(DS:SI)的存储单元中取出一个字节,传送 到(ES:DI)存储单元,并且SI和DI的内容自动增1(当DF=1)时,或自动减1(当DF=1时) #转移地址的寻址方式 转移地址的寻址方式有4种:段内直接方式与间接方式、段间直接方式与间接方式
2/1
数据传送类指令 :通用传送类指令 MOV
获取有效地址指令 LEA
获取地址指针指令 LDS, LES
标志传送指令 LAHF, SAHF
数据交换指令 XCHG
字节转换指令 XLAT
堆栈操作指令 PUSH, POP, PUSHF, POPF
#通用传送指令 格式MOV DST,SRC ; 说明:将源操作数中的一个字节或一个字传送到目的操作数所指定的位置。 注意:MOV指令不能直达的路径: (1)、立即数 段寄存器 (2)、存储单元 存储单元 (3)、段寄存器 段寄存器 如果要完成以上这些数据的传送,可以分以下步骤完成 立即数--通用寄存器--段寄存器 """ MOV AX,3A01H MOV DS,AX """ 存储单元--通用寄存器--存储单元 """ MOV AX,VAR1 MOV VAR2,AX """ 段寄存器--通用寄存器--段寄存器 """ MOV AX,CS MOV DS,AX """ (CS寄存器不能用作目的寄存器) 对于双操作指令,两个操作数的类型必须匹配: ~两者都指定了类型,则必须一致,否则出错 ~两者之一指定了类型,一般指令无措 ~两者都无类型,则指令出错 对于操作数的类型 ~立即数是无类型的 ~不含变量名的直接寻址、寄存器相对寻址、寄存器间接寻址、基址变址寻址、基址变址且相对寻址的操作数也是无类型的 ~利用PTR操作符可指定或暂时改变存储单元的类型 从形式上看,立即数有:由常数等组成的表达式、所有由属性操作符得到的标号或变量的属性(OFFSET SEG LENGTH TYPE 等 )
1 #取有效地址指令LEA 2 格式:LEA REG16,MEM 3 说明:取有效地址指令LEA可以将源操作数的有效地址送入16位寄存器REG16,它传送的不是MEM(存储单元)的内容,而是存储单元的有效地址。这里源操作数MEM只能是直接寻址方式 4 5 例如: 6 LEA DI,VAR1 :等同于 MOV DI,OFFSET VAR1 7 LEA BX,VAR1+15 8 9 #取地址指针指令 LDS LES 10 格式:LDS REG16,MEM :(DS)<--(MEM+2),(REG16)<--(MEM) 11 LES REG16,MEM :(ES)<--(MEM+2),(REG16)<--(MEM) 12 说明:取地址指令LDS可以将双字节变量MEM内容的高16位送入到DS,低16位送入指定的REG16中,取地址指令LES可以将双字节变量MEM内容的高16位送入到ES,低16位送入指定的REG16中. 13 注意:这里的REG16不允许为段寄存器
1 格式 :LAFH ;(AH)<--PSW的寄存器的低8位 2 SAHF ;PSW的寄存器的低8位<--(AH) 3 说明:指令LAHF可以将PSW寄存器中的低8位传送到集训器AH中,而指令 SAHF可以将AH的内容传送到PSW寄存器的低8位。源操作数和目的操作数的寻址方式均为隐含寻址方式
1 #数据交换指令 XCHG 2 格式:XCHG DST,SRC ;DTS<-->SRC 3 说明:数据交换指令完成两个操作数之间数据的交换,但两者不能同时为存储单元,XCHG指令可以完成寄存器与寄存器之间、寄存器和存储单元之间的内容交换,但应该注意,这里不能采用段寄存器。
1 #字节转换指令 2 格式:XLAT ;(AL)<--((BX)+(AL)) 3 说明:字节转换指令XLAT可以将有效地址BX+AL的存储单元的内容送入AL。当输入为一个字节(AL的内容时)时,输出也是一个字节(同样存放在AL中) 4 例: 5 在DS段: 6 7 TABLE DB 30H,31H,32H,33H,34H 8 在CS段: 9 MOV AL,4 10 LEA BX,TABLE 11 XLAT 12 13 '''即AL=34H 字符'4' '''
1 #堆栈操作指令 2 堆栈必须按字操作!且操作数不能为立即数 3 堆栈的段地址由SS指定,堆栈的偏移地址由SP指定 4 5 格式:PUSH SRC 6 PUSHF 7 POP SRC 8 POPF 9 10 说明:将SRC压入堆栈 11 将PSW的内容压入堆栈 12 从堆栈弹出一个字送入到SRC 13 从堆栈中弹出一个字送入到PSW 14
2/2
算数运算类指令:
加减法指令 ADD ADC INC SUB SBB DEC NEG
比较指令 CMP
乘除法指令 MUL IMUL DIV IDIV
符号扩展指令 CBW CWD
BD数运算调整指令 AAA DAA AAS DAS AAM AAD
#加法指令 ADD ADC 格式:ADD DST,SRC ;(DST)<--(SRC)+(DST) ADC DST,SRC ;(DST)<--(SRC)+(DST)+(CF) 说明:ADC为带进位的加法指令 ADD ADC指令会正常影响PSW中的6个状态标志位:CF AF OF SF ZF PF #增量指令 INC DST ;(DST)<--(DST)+1 INC指令可以影响PSW中的5个标志位,但不会影响CF位。 #减法指令 SUB SBB 格式:SUB DST,SRC SBB DST,SRC 说明:同加法 #减量指令 格式:DEC DST 说明:同加法
1 #比较指令 2 格 式:CMP DST,SRC ;(DST)-(SRC),并设置PSW中的 状态标志位 3 说 明:(DST)-(SRC),并设置PSW中的 状态标志位,但其结果不保存到DST。CMP指令会影响PSW中的6个状态标志位 4 对两个数进行CMP运算,其主要的目的是为了比较两个数的大小、相等关系 5 ~若两个数相等,则ZF=1 6 ~SF等同于最高位 7 ~CF OF视具体情况而定, 8 当两个无符号数进行比较时, 9 如果CF=0 ZF=0则表示DST>SRC 10 如果CF=1 则表示DST<SRC 11 当两个有符号数进行比较时, 12 OF=1表示运算产生了溢出,但大小的比较要根据OF和SG共同决定,当 OF 与上 SF == 0 时,DST >=SRC,当OF SF 同时为1时,DST<SRC
微处理器状态字PSW各标志位(9个):
CF:进位标志 D7或D15有无进位,有进位CF=1
PF:奇偶标志 操作结果的低8位含有‘1’的个数,偶数个为1,奇数个为0
AF:辅助进位标志 D3位有无进位,有进位AF=1
ZF:零标志位 运算结果为0时ZF=1
SF:符号标志 操作结果为负SF=1
OF:溢出标志 溢出OF=1
DF:方向标志DF=0时,变址寄存器(SI,DI)的内容递增
TF:陷阱标志 TF=1时,CPU处于单步执行方式
IF :中断允许标志 IF=1时,CPU能够响应中断请求
两点说明:
CPU只要涉及运算,其结果就会影响状态标志
段寄存器不能参与运算