第四章 汇编语言 微型计算机原理与应用 电子教案 教学课件_第1页
第四章 汇编语言 微型计算机原理与应用 电子教案 教学课件_第2页
第四章 汇编语言 微型计算机原理与应用 电子教案 教学课件_第3页
第四章 汇编语言 微型计算机原理与应用 电子教案 教学课件_第4页
第四章 汇编语言 微型计算机原理与应用 电子教案 教学课件_第5页
已阅读5页,还剩154页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 指令系统与汇编语言程序设计 【内容简介】 首先讲述8086的寻址方式、指令系统、汇编语言语句格式、保护方式编程指令,然后讲述汇编语言程序设计、宏以及DOS功能调用,最后简要说明32位微处理器指令系统的功能与使用。 【重点难点】 重点是8086寻址方式、指令系统与汇编程序设计。难点是汇编语言程序设计。第4章 指令系统与汇编语言程序设计 4.1 概述 4.2 8086寻址方式 4.3 8086指令系统 4.4 汇编语言程序格式与常用伪指令 4.5 汇编语言程序设计 4.6 汇编语言程序上机过程4.1 概述 4.1.1 指令与程序 4.1.2 汇编语言基本概念指令与程序操作码操作数图4.1

2、指令的基本格式 所谓指令,就是指示计算机进行某一工作的命令,而程序是为求解某一问题或进行某项工作的若干条指令的有序集合。指令如图所示。一台计算机全部指令的集合称为指令系统。操作码域说明指令的类型与功能,操作数域也称为地址域,说明数据在存储器中的地址及操作结果存放的地址。 表示一条指令的二进制数称为指令字,按长度可分为单字节、双字节、三字节甚至四字节等。 按操作数的个数又可分为无操作数、单操作数、双操作数以至三操作数指令,也称为无地址、一地址、二地址以至三地址指令。 其中存放结果的称为目的操作数或目的地址,其它则称为源操作数或源地址。 用二进制代码表示指令系统的语言称为机器语言,用以设计的程序称

3、为机器语言程序。例如以下两条指令可构成一段程序,是把数据20H经寄存器CL,与累加器AL中的数相加,结果在AL中。 10110001 00100000 00000010 11000001汇编语言基本概念 用英文助记符表示指令系统的语言称为汇编语言,比如用ADD、SUB、JMP表示加、减、转移等操作。用汇编语言指令编写的程序称为汇编语言程序。 在计算机中,一条汇编语言指令对应于一条机器语言指令。因此,汇编语言指令实际上是机器指令的符号化表示。例如上一节的机器语言程序可由如下汇编语言指令来表示。 MOVCL,20H ADD AL,CL 汇编语言程序,人们易于编写、识别和理解。但是必须转换成机器语言

4、,计算机才能被识别和执行。这一转换过程称为汇编,由专门的汇编程序进行。通常,人们把用汇编语言编写的程序称为源程序,经汇编而生成的机器语言程序称为目标程序或目标代码。 另外,还有一些用来说明汇编过程,或对汇编过程进行辅助说明的指令,称为伪指令。4.2 8086寻址方式 在指令中,操作数或操作数的地址可用多种方式来表示,统称为寻址方式。同一条指令可有不同的寻址方式,以说明不同的操作对象。 4.2.1 数据类型 4.2.2 寻址方式4.2.1 数据类型 在计算机中,二进制数据有多种类型或用途。一种是指令处理的对象,即操作数;另一种是指令字;第三种是操作数的地址。在指令中,操作数又分为两种,一种是参加

5、运算或由计算机处理的对象,即数据操作数,简称为数据;另一种表示转移指令的目标地址,即转移地址。 1. 数据操作数 按照存储的位置,可分为三种:立即数、寄存器数据和存储器数据。 2. 转移地址操作数 表示转移目标地址,可在转移指令中直接给出,也可根据某一寻址方式求得。4.2.2 寻址方式 根据操作数的两大类型,寻址方式也分为两类,即数据寻址方式和转移地址寻址方式。 1. 数据寻址方式 在数据寻址方式中,有以下7种。 (1)立即数 立即数是指指令操作数域直接给出的就是参加运算或进行某种操作的数据,又称即时数,有8位、16位等形式。对于16位数据,低字节在先,高字节在后。例如指令: MOV AL,5

6、 执行后(AL)=05H,操作示意图如图(a)所示。 又如指令: MOVAX,2790H ;操作示意图如图(b)所示。 立即数只能是源操作数,不能是目的操作数。 (2)寄存器寻址 是指指令操作数域给出的是存放操作数的寄存器。对于8位操作数,寄存器有AL、AH、BL、BH、CL、CH、DL、DH;对于16位操作数,寄存器有AX、BX、CX、DX、SI、DI、SP、BP。 例如指令: MOV BX,AX 操作示意图如图所示。 (3)直接寻址 是指令操作数域给出的是存放操作数地址的偏移量,也称为有效地址,常用EA表示,寻址方式如图所示。例如指令: MOV BX,2000H 执行前(DS)= 4000

7、H,EA=2000H,(42000H)=1FH,(42001H)=75H。 执行后(BX)= 751FH,操作示意图如图所示。 如果操作数存放在其它段中,应指定段寄存器,又如指令: MOV AX,ES:2100H 执行前(ES)=1000H,EA=2100H, (12100H)=2AH,(12101H)=17H 执行后(AX)=172AH 在汇编语言中,可以使用符号地址代替数值地址。例如: MOV AX,VALUE VALUE是符号地址。符号地址出现在指令中,可省略方括号,例如 MOV AX,DATA。 (4)寄存器间接寻址 是指令操作数域给出的是存放操作数地址偏移量的寄存器。寄存器主要有BX

8、、BP、SI和DI。若没有特别说明, BX、SI、DI默认操作数在数据段(DS)中。BP默认操作数在堆栈段(SS)中。段寄存器中的的基地址左移4位与16位偏移量相加,生成20位的物理地址,如图所示。 例如指令: MOV AX,BX 设(DS)=3000H,(BX)=3000H,执行后(AX)=2C7DH,操作示意图如图所示。 又如指令:MOV AX,ES:SI;段寄存器为ES,数据在附加段中。 (5)寄存器相对寻址 指令操作数域给出的是一个基址寄存器和一个偏移量,基地址与偏移量相加,作为操作数地址的偏移地址EA,如图所示。例如指令: MOV AX,DATADI执行前(DS)=3000H, (D

9、I)=2000H, DATA=300H,执行后(AX)=201AH,操作示意图如图所示。 (6)基址加变址寻址 指令操作数域给出的是一个基址寄存器和一个变址寄存器,两寄存器中的数据相加,作为操作数的偏移地址EA。基址寄存器主要有BX、BP,变址寄存器主要有SI和DI。其中BX默认DS, BP默认SS,允许使用段跨越,如图所示。 例如指令:MOV AX,BXDI 或 MOV AX,BX+DI 执行前(DS)=2100H,(BX)=0158H,(DI)=10A5H, 执行后(AX)=1234H,操作示意图如图所示。 (7)相对基址加变址寻址 指令操作数域给出一个基址寄存器、变址寄存器和一个偏移量,

10、两寄存器中的数据及偏移量相加,作为操作数的偏移地址EA。基址寄存器主要有BX、BP,变址寄存器主要有SI和DI。BX默认DS, BP默认SS。 例如指令: MOV AX,MASKBXDI MOV AX,MASKBX+DI MOV AX,MASK+BX+DI 执行前(DS)=3000H,(BX)=2000H,(DI)=1000H, MASK=0250H 执行后(AX)=4675H,操作示意如图所示。 2. 转移地址寻址方式 主要用来确定转移指令和CALL指令的目标地址,其目标地址可能在当前代码段内,也可能在当前代码段外,故有4中方式。 (1)段内相对寻址 转移地址由IP的当前值与指令中给出的8位

11、或16位偏移量相加而生成。偏移量是一个带符号的数,用补码表示。其中8位偏移量称为段内短转移SHORT,转移范围为-128+127;16位偏移量称为段内近转移NEAR,转移范围-32768+32767。其示意如图所示。 段内相对寻址的特点是代码段寄存器CS的值保持不变。指令格式如下: JMP SHORT OPR ;IP(IP)+8位偏移量 JMP NEAR PTR OPR ;IP(IP)+16位偏移量 (2)段内间接寻址 转移指令的偏移地址存放在一个16位的寄存器或存储器单元中,用来取代IP中的当前值。该寄存器或存储器单元可由数据寻址方式中除立即数之外的任何一种方式得到。其示意如图所示。 段内间

12、接寻址的特点是CS的值不变,IP的值由16位寄存器或存储器单元中的数据所取代。 例如指令: JMP BX ;BX中的数送入指令指针IP中 又如指令: JMP WORD PTR BXSI ;按照基址加变址的方式获取操作数,送入IP中 (3)段间直接寻址 在指令中直接给出16位段地址和16位偏移地址,分别送入CS和IP中。 例如指令:JMP FAR PTR NEXTSUB 段间寻址由FAR来说明,其中NEXTSUB是符号地址,指令直接给出,包括转移目标的偏移地址和段地址。 (4)段间间接寻址 转移地址存放在存储器中的两个连续字单元中,第一个字是偏移地址,第二个字是段地址。存储器单元地址可用数据寻址

13、方式中除立即数和寄存器直接寻址以外的任何一种寻址方式来确定,如图所示。 例如指令: JMP DWORD PTR BX 由BX确定两个连续存储器单元,取出其中的数分别送入IP和CS中.4.3 8086指令系统 8086指令系统按功能可分为6种类型,即数据传送指令、算术运算指令、逻辑运算指令、串操作指令、程序控制指令和处理器控制指令。 4.3.1 数据传送类指令 4.3.2 算术运算类指令 4.3.3 逻辑运算与移位类指令 4.3.4 串操作类指令 4.3.5 控制转移类指令 4.3.6 处理器控制类指令4.3.1 数据传送类指令 数据传送类指令共有14条,可分为4种类型:通用数据传送指令、地址传

14、送指令、标志寄存器传送指令和输入输出指令。 1. 通用数据传送指令 (1)传送指令 MOV 格式:MOV DST,SRC 功能:DST(SRC) 说明:DST表示目的操作数地址,SRC表示源操作数地址,其中目的操作数不能是立即数、CS和IP寄存器;两存储器单元之间和两段寄存器之间不能直接传送;立即数不能直接传送到段寄存器;允许段跨越,不影响标志位。源/目操作数传送关系如图所示。 例如指令: MOV AX,DX ;源与目操作数均为16位 MOV AL,ES:BX ;目的操作数8位,即说明源操作数也为8位 【例4.1】 将地址为ADD1存储器单元中的数据传送到同段内地址为ADD2的存储器单元中。

15、解:使用传送指令,程序如下: MOV AL,ADD1 MOV ADD2,AL 【例4.2】将立即数DAT1传送到段寄存器ES中。 解:由于ES不能直接传送立即数,因此需要借用其它寄存器来实现,程序如下: MOV AX,DAT1 MOV ES,AX (2)堆栈操作指令 压栈指令 PUSH 格式:PUSH SRC 功能:SP(SP)-2 (SP)+1,(SP)(SRC) 弹栈指令 POP 格式:POP DST 功能:DST(SP)+1,(SP) SP(SP)+2 说明:堆栈操作指令以字为单位,可以使用除立即数以外的其它寻址方式,允许段跨越;PUSH CS 合法,但POP CS非法;不影响状态标志位

16、。 (3)交换指令 XCHG 格式:XCHG OPR1,OPR2 功能:(OPR1)(OPR2) 说明:XCHG指令不适用段寄存器和立即数,不允许两存储器单元直接交换,两操作数可以是8位或16位。允许段跨越,不影响状态标志位。例如指令: XCHG AL,BL ;两操作数均为8位 XCHG AX,SS:SI ;AX寄存器指明操作数为16位 (4)换码指令 XLAT 格式:XLAT OPR 或 XLAT 功能:AL(BX)+(AL) 说明:OPR表示表格中的地址,BX存放表格首地址,AL存放待查值(偏移量),查得结果送AL中,不影响状态标志位。 【例4.5】在以DATA为首地址的主存区域中连续存放

17、着09的平方表,试编写查表程序。 解:首地址存入寄存器BX中,待查数据X送入AL中。 MOV BX,OFFSET DATA MOV AL,X XLAT DATA 或 XLAT 2. 地址传送指令 (1)有效地址送寄存器指令 LEA 格式:LEA REG,SRC 功能:REGSRC 说明:将源操作数的有效地址传送到指定的寄存器REG中,源操作数可以是除立即数和寄存器寻址以外的其它寻址方式;允许段跨越;不影响状态标志位。 【例4.6】将例中DATA首地址存入寄存器BX中。 解:使用LEA指令,程序如下: LEA BX,DATA (2)指定寄存器与段寄存器DS置数指令 LDS 格式:LDS REG,

18、SRC 功能:REG(SRC) DS(SRC+2) 说明:把存储器中两个连续字单元中的数据传送到指定寄存器和DS中,不影响状态标志。 例如指令: LDS SI,1508H ;把DS和1508H所指定单元的字操作数送入寄存器SI,下一单元的字操作数送入段寄存器DS中。 (3)指定寄存器与段寄存器ES置数指令 LES 格式:LES REG,SRC 功能:REG(SRC) ES(SRC+2) 说明:与指令LDS功能相同,段寄存器选择ES。 例如指令:LES DI,DI 3. 状态标志寄存器传送指令 (1)状态标志寄存器低8位送AH指令 LAHF 格式:LAHF 功能:AH(PSW的低字节) 说明:不

19、影响状态标志位。 (2)寄存器AH送状态标志寄存器低8位指令 SAHF 格式:SAHF 功能:PSW的低字节(AH) 说明:状态标志寄存器的低8位由装入的数值来确定。 (3)状态标志寄存器压栈指令 PUSHF 格式:PUSHF 功能:SP(SP)-2 (SP)+1,(SP)(PSW) 说明:不影响状态标志位。 (4)状态标志寄存器弹栈指令 POPF 格式:POPF 功能:PSW(SP)+1,(SP) SP(SP)+2 说明:影响状态标志寄存器,由装入的数值来确定。 4输入输出指令 有两条,即IN和OUT,实现AL或AX与外设端口之间的数据传送。 (1)输入指令 IN 格式:IN AL,PORT

20、 IN AX,PORT IN AL,DX IN AX,DX 功能:AL(PORT) AX(PORT+1,PORT) AL(DX) AX(DX)+1,(DX) 其中PORT是I/O端口地址,且在00H0FFH之间。 (2)输出指令 OUT 格式:OUT PORT,AL (2)输出指令 OUT 格式:OUT PORT,AL OUT PORT,AX OUT DX,AL OUT DX,AX 功能:PORT(AL) PORT+1,PORT(AX) (DX)(AL) (DX)+1,(DX)(AX) 说明:当端口地址为00H0FFH时,可直接寻址;当端口地址为0100H0FFFFH时,必须使用寄存器DX间接

21、寻址;不影响状态标志位。4.3.2 算术运算类指令 算术运算指令有20条,分5种类型,可对4种类型的数据进行运算,即无符号二进制数、带符号二进制数、无符号压缩型BCD码和无符号非压缩型BCD码。运算结果影响状态标志位。 1. 加法指令 (1)加法指令 ADD 格式:ADD DST,SRC 功能:DST(DST)+(SRC) 说明: 源/目操作数地址如图所示,其中目的操作数不能使用立即数,两存储器单元之间不允许直接加法运算;允许段跨越; ADD指令不区分两个加数是无符号数还是带符号数,运算结果的二进制形式相同, 影响状态标志位。 例如指令: ADD AL,BX ;AL寄存器指明操作是字节操作 A

22、DD WORD PTR BX,12H ;WORD PTR指明内存操作数为字操作数 又如指令:ADD AX,BX 设(AX)=1234H,(BX)=0F7C9H 指令执行后(AX)=09FDH,OF=0,SF=0,ZF=0,AF=0,PF=0,CF=1 (2)带进位加法指令 ADC 格式:ADC DST,SRC 功能:DST(DST)+(SRC)+CF 说明:进位位CF的值加到两数和的最低位,其它与ADD指令相同。 【例4.7】试编写程序,计算双字4A750000H + 78912365H 之和。 解:按照双字操作,由寄存器DX和AX组成32位累加器,先用ADD指令进行低字运算,再用ADC指令进

23、行高字运算,程序如下: MOV AX, 0000H MOV DX, 4A75H ADD AX, 2365H ADC DX, 7891H (3)加1指令 INC 格式:INC DST 功能:DST(DST)+1 说明:操作数可以是除立即数之外的其它寻址方式,可以字节运算,也可以字运算,且不区分无符号数还是带符号数;允许段跨越;影响除CF之外的其它状态标志位。 2. 减法指令 (1)减法指令 SUB 格式:SUB DST,SRC 功能:DST(DST)-(SRC) 说明: 源/目操作数地址如图所示,目的操作数不能使用立即数,两存储器单元不能直接进行减法运算;允许段跨越。 不区分操作数是无符号还是符

24、号数,运算结果的二进制形式相同,影响状态标志位。 例如指令:SUB AX,BX 设(AX)=578FH,(DS)=1000H,(BX)=2000H,(12000H)=7890H 指令执行后 (AX)=0DEFFH,OF=0,SF=1,ZF=0,AF=0,PF=1,CF=1 (2)带借位减法指令 SBB 格式:SBB DST,SRC 功能:DST(DST)-(SRC)-CF 说明:被减数减去减数,同时再减进位位CF的值,其它与减法指令SUB相同。 (3)减1指令 DEC 格式:DEC DST 功能:DST(DST)1 说明:同INC指令。 例如指令:DEC CX (4)求补指令 NEG 格式:N

25、EG DST 功能:DST0(DST) 说明:操作数同INC指令,影响所有状态标志位,操作数为零时CF=1,其它情况下CF=0。 例如指令:NEG AX 设(AX)=0FFFFH 指令执行后(AX)=0001H,OF=0,SF=0,ZF=0,AF=1,PF=0,CF=1 (5)比较指令CMP 格式:CMP DST,SRC 功能:(DST)(SRC)置状态标志位 说明:进行减法运算,不送结果,置状态标志位。 3. 乘法指令 (1)无符号数乘法指令MUL 格式:MUL SRC 功能:AX(AL)(SRC) 字节操作 DX,AX(AX)(SRC) 字操作 说明: 源/目操作数均为无符号数; 目的操作

26、数必须是累加器AX或AL,源操作数可以是除立即数之外的其它寻址方式;源操作数允许段跨越; 除OF和CF之外的状态标志无定义;执行MUL指令后,若乘积的高字/高字节为0,则OF=CF=0;否则,OF=CF=1。 【例4.9】将DAT1和DAT2两个字节单元的无符号数相乘,乘积存放在DAT3字单元中。 解:使用无符号指令,程序如下: MOV AL,DAT1 MUL DAT2 MOV DAT3,AX (2)带符号数乘法指令IMUL 格式:IMUL SRC 功能:操作数为带符号数,其它与MUL相同。 说明:源/目操作数均为带符号数; 同MUL指令; 除OF和CF之外的标志无定义;执行IMUL指令后,若

27、乘积的高字/高字节是符号扩展位时,则OF=CF=0;否则,OF=CF=1。 4除法指令 (1)无符号数除法指令DIV 格式:DIV SRC 功能:AL(AX)/(SRC)的商 AH余数 AX(DX,AX)/(SRC)的商 DX余数 说明: 字节运算时16位的被除数存放在AX中,字运算时32位的被除数存放在DX,AX中;除数可以是除立即数之外的其它寻址方式,允许段跨越; 所有状态标志位无定义。 (2)带符号数除法指令IDIV 格式:IDIV SRC 功能:操作数是带符号数,其它与DIV相同。 说明:被除数的长度不是除数的倍时,被除数高位符号扩展,其它与DIV指令相同。 【例4.10】设(AX)=

28、0400H,(BL)=0B4H,执行指令 DIV BL和IDIV BL。 解: 执行指令 DIV BL 由于(AX)和(BL)为无符号数,因此指令DIV BL执行后: (AL)=05H AL商 (AH)=7CH AH余数 执行指令 IDIV BL 由于( AX)和(BL)为带符号的补码数,因此指令IDIV BL执行后: (AL)=0F3H=-13D AL商 (AH)=24H=36D AH余数 在除法运算时若商溢出,直接转入0型中断处理。 (3)CBW 符号位扩展指令 格式:CBW 字节转换为字 CWD 字转换为双字 功能:字节扩展 AH(AL)的符号位 字扩展 DX(AX)的符号位 5十进制调

29、整指令 在BCD码数据运算后必须修正,该类指令共有6条。 (1)非压缩BCD码加法调整指令 AAA 格式:AAA 功能:AL把AL中的和调整成非压缩BCD码格式 AH(AH)+调整产生的进位值 说明:影响状态标志CF和AF,其余标志位无定义。 例如指令:ADD AL,BL AAA (2)压缩BCD码加法调整指令 DAA 格式:DAA 功能:AL把AL中的和调整成压缩BCD码格式 说明:两加数为压缩BCD码,状态标志OF无定义,影响其余状态标志位。 例如指令:ADD AL,BL DAA (3)非压缩BCD码减法调整指令AAS 格式:AAS 功能:AL把AL中的差调整成非压缩BCD码格式 AH(A

30、H)-调整产生的借位 说明:两操作数为非压缩BCD码,影响状态标志CF和AF,其余标志位无定义。 (4)压缩BCD码减法调整指令 DAS 格式:DAS 功能:(AL)把AL中的差调整成压缩BCD码格式 说明:两操作数为压缩BCD码,状态标志OF无定义,影响其余标志 (5)非压缩BCD码乘法调整指令AAM 格式:AAM 功能:AX把AL中的乘积调整成非压缩的BCD码格式 说明:两乘数为非压缩BCD码,影响状态标志SF、ZF和PF,其余标志位无定义。 例如指令: MUL AL,BL AAM (6)非压缩BCD码除法调整指令 AAD 格式:AAD 功能:AL10(AH)+(AL) AH0 说明: 在

31、指令DIV之前使用,被除数是两位非压缩BCD码,存放在AX中,AH中存放十位数字,AL中存放个位数字,且高4位均为0;除数是一位非压缩的BCD码,高4位为0;调整结果在AL中,AH中清0;执行其后的DIV指令后,AL中为一位非压缩BCD码的商,AH中为一位BCD码的余数; 影响状态标志SF、ZF和PF,其余OF、CF和AF标志位无定义。4.3.3 逻辑运算与移位类指令 逻辑运算与移位指令有13条,分为3类,即逻辑运算指令、移位指令和循环移位指令,可对位/16位寄存器或存储器中的数据进行操作。 1. 逻辑运算指令 逻辑运算指令有5条,其中源/目操作数地址同算术运算指令。 (1)逻辑“与”指令 A

32、ND 格式:AND DST,SRC 功能:DST(DST)(SRC) 说明:使状态标志CF和OF清0,AF无定义,SF、ZF和PF由运算结果设置。 例如指令: AND AX,1110 1111 0111 1111B ;使AX中第7、12位清0,其余位不变 (2)逻辑“或”指令 OR 格式:OR DST,SRC 功能:DST(DST)(SRC) 说明:对状态标志位的影响同AND指令。 例如指令: OR BX, 0001 0000 1000 0000B ;使BX中第7位、12位置1,其余位不变。 (3)逻辑“异或”指令 XOR 格式:XOR DST,SRC 功能:DST(DST)(SRC) 说明:

33、对状态标志位的影响同AND指令。 例如指令: XOR AL,1010 0000B ;使AL的第5、7位取反,其余位不变。 【例4.11】 将AX和CF清零。 解:实现方法有多种,如下: 方法1: AND AX,0 方法2: XOR AX,AX 方法3: SUB AX,AX (4)逻辑“非”指令 NOT 格式:NOT DSTDST 功能:DST( DST ) 说明:不影响标志位。 (5) TEST测试指令 格式:TEST DST,SRC 功能:(DST)(SRC) 置状态标志,不送结果 说明:执行过程与AND指令相同,设置状态标志,不送结果;对状态标志位的影响同AND指令。 例如指令: TEST

34、 AX,0040H ;测试AX中第6位是否为1 2移位指令 移位指令有4条,包括算术/逻辑左移与右移,其作用如图所示。 (1)算术左移指令 SAL 格式:SAL DST,CNT 功能:左移,如图(a)所示,相当于操作数乘以2。 说明: DST可以是除立即数之外的任一种寻址方式,移位次数由CNT决定,CNT可以是1或寄存器CL;DST可以是字节,也可以是字; 影响状态标志CF、SF、PF和ZF,AF无定义,OF只在CNT=1时有效。 (2)算术右移指令SAR 格式:SAR DST,CNT 功能:右移,如图(b)所示,相当于操作数除以2。 说明:操作数同指令SAL,对状态标志位的影响同指令SAL。

35、 (3)逻辑左移指令SHL 格式:SHL DST,CNT 功能:左移,如图(c)所示,相当于无符号数乘2。 说明:操作数同指令SAL,对状态标志位的影响同指令SAL。 (4)逻辑右移指令 SHR 格式:SHR DST,CNT 功能:右移,如图(d)所示,相当于无符号数除2。 说明:操作数同SAL指令,对状态标志位的影响同指令SAL。 3循环移位指令 循环移位指令有4条,包括带进位/不带进位的循环左移与右移,其作用如图所示。 (1)循环左移指令 ROL 格式:ROL DST,CNT 功能:循环左移,如图(a)所示。 说明:影响状态标志位CF,OF只在CNT=1时有效,不影响SF、PF、ZF和AF

36、。 (2)循环右移指令 ROR 格式:ROR DST,CNT 功能:循环右移,如图(b)所示。 说明:同指令ROL。 (3)带进位循环左移指令 RCL 格式:RCL DST,CNT 功能:带进位循环左移,如图(c)所示。 说明:同指令ROL。 (4)带进位循环右移指令 RCR 格式:RCR DST,CNT 功能:带进位循环右移,如图(d)所示。 说明:同指令ROL。 【例4.12】在寄存器DX和AX中存放有32位无符号二进制数,试编写程序,实现乘运算。 解:由于是32位数据,因此需要先对低16位左移,再对高16位带进位左移,重复两遍,即乘4,程序如下: SHL AX, 1 RCL DX, 1

37、SHL AX, 1 RCL DX, 14.3.4 串操作类指令 在程序设计中经常遇到成组数据处理,比如对一串字符进行处理,可以是字节串,也可以是字串。所处理的字符长度可达64KB字节。串操作指令隐含寄存器和标志位的作用如表所示。串操作指令有5条,重复前缀有3条。表4.1 串指令的寄存器和标志位作用寄存器作用SI源串变址寄存器,段地址在DS中(允许段超越前缀修改)DI目的串变址寄存器,段地址在ES中(不允许修改)CX重复执行次数计数器AL/AXLODS指令目的操作数,STOS指令的源操作数FLAGDFDF=0时SI、DI自动增值(字节增1,字增2)DF=1时 SI、DI自动减值(字节减1,字减2

38、)ZF控制比较/扫描操作结果 1串传送指令 MOVS 格式:MOVS DST,SRC MOVSB (字节) MOVSW (字) 功能:(DI)(SI) 字节操作:SI(SI)1,DI(DI)1 字操作:SI(SI)2,DI(DI)2 说明: 指令MOVS在操作数地址的前面用关键字BYTE/WORD PTR说明是字节传送还是字传送; 当标志位DF=0时,地址递增;DF=1时,地址递减; 2. 串比较指令CMPS 格式:CMPS SRC,DST CMPSB (字节) CMPSW (字) 功能:(SI)-(DI) 置状态状态标志,不送结果 字节操作:SI(SI)1,DI(DI)1 字操作:SI(SI

39、)2,DI(DI)2 说明:同指令MOVS。 3.串扫描指令SCAS 格式:SCAS DST SCASB (字节) SCASW (字) 功能:用AL/AX中的数据减去DI指示的数据,置状态标志,但不送结果。 字节操作:(AL)-(DI),DI(DI)1 字操作时:(AX)-(DI),DI(DI)2 说明:同指令MOVS。 4. 串装入指令 LODS 格式:LODS SRC LODSB (字节) LODSW (字) 功能:从SI指示的存储器单元读取数据,送入AL/AX中。 字节操作:(AL)(SI),SI(SI)1 字 操 作:(AX)(SI),SI(SI)2 说明:同指令MOVS。 5. 串存

40、储指令STOS 格式:STOS DST STOSB (字节) STOSW (字) 功能:把AL/AX中的数据传送到DI指示的存储器单元中。 字节操作:(DI)(AL),DI(DI)1 字操作时:(DI)(AX),DI(DI)2 说明:同指令MOVS。 6. 串重复前缀指令 串重复前缀指令有三条,用来修饰串操作指令,使之重复执行。 (1)重复前缀指令 格式:REP String primitive ;可作用于指令MOVS、LODS或STOS (2)相等时重复前缀指令 格式:REPE/REPZ String primitive ;可作用于指令CMPS或SCAS (3)不相等时重复前缀指令 格式:R

41、EPNE/REPNZ String primitive ;可作用于指令CMPS或SCAS 【例4.13】 若在主存TABLE起始的区域中存放有1K字节的数据,试编程将该数据块传送到NEXT起始的区域中。 解:首先设置源/目操作数起始地址,然后使用重复传送指令编程,程序如下: MOV AX,SEG TABLE ;SEG是取值运算符,将TABLE标号所在段的段地址送入累加器AX中 MOV DS,AX MOV AX,SEG NEXT MOV ES,AX MOV SI,OFFSET TABLE ;OFFSET是取值运算符,将TABLE所在段的段内偏移地址送入寄存器SI中 MOV DI,OFFSET N

42、EXT MOV CX,1024 CLD ;使DF=0 REP MOVSB控制转移类指令 控制转移指令有28条,分5种类型,主要用于控制程序的执行流程。 1. 无条件转移指令 可段内转移,也可以段间转移,有4种寻址方式,详见4.2.2 节。 格式:JMP OPR ;其中OPR为标号 功能:段内转移 IPOPR偏移地址,CS不变 段间转移 CSOPR段地址,IPOPR偏移地址 2. 条件转移指令 以状态标志寄存器(PSW)相应位的值为依据,满足条件则转移,属段内短转移,相对偏移量为-128+127字节。 (1)单标志位转移指令 JZ/JE OPR 功能:若ZF=1,结果为0,转移到OPR处执行程序

43、,否则顺序执行。 JNZ/JNE OPR 功能:若ZF=0,结果不为0,转移到OPR处执行程序,否则顺序执行。 JC OPR 功能:若CF=1,有进位,转移到OPR处执行程序,否则顺序执行。 JNC OPR 功能:若CF=0,无进位,转移到OPR处执行程序,否则顺序执行。 JO OPR 功能:若OF=1,有溢出,转移到OPR处执行程序,否则顺序执行。 JNO OPR 功能:若OF=0,无溢出,转移到OPR处执行程序,否则顺序执行。 JS OPR 功能:若SF=1,结果为负,转移到OPR处执行程序,否则顺序执行。 JNS OPR 功能:若SF=0,结果为正,转移到OPR处执行程序,否则顺序执行。

44、 JPE/JP OPR 功能:若PF=1,奇偶标志为1,转移到OPR处执行程序,否则顺序执行。 JPO/JNP OPR 功能:若PF=0,奇偶标志为0,转移到OPR处执行程序,否则顺序执行。 (2)无符号数比较转移指令 JA/JNBE OPR 功能:若CF=0或ZF=0,被减数高于减数,转移到OPR处执行程序,否则顺序执行。 JNA/JBE OPR 功能:若CF=1或ZF=1,被减数低于或等于减数,转移到OPR处执行程序,否则顺序执行。 JNAE/JB OPR 功能:若CF=1,被减数低于减数,转移到OPR处执行程序,否则顺序执行。 JAE/JNB OPR 功能:若CF=0,被减数不低于减数,

45、转移到OPR处执行程序,否则顺序执行。 (3)带符号数比较转移指令 JL/JNGE OPR 功能:若SFOF=1,被减数小于减数,转移到OPR处执行程序,否则顺序执行。 JNL/JGE OPR 功能:若SFOF=0,被减数大于或等于减数,转移到OPR处执行程序,否则顺序执行。 JLE/JNG OPR 功能:若ZF=1或SFOF=1,被减数小于或等于减数,转移到OPR处执行程序,否则顺序执行。 JNLE/JG OPR 功能:若ZF=0且SFOF=0,被减数大于减数,转移到OPR处执行程序,否则顺序执行。 2. 循环控制指令 控制程序的重复执行,以CX中的值或CX与ZF标志位的值结合,作为转移条件

46、,属段内短转移,相对偏移量为-128+127字节。 (1)循环指令 格式:LOOP OPR 功能:CX(CX)1,测试(CX)0,转移到标号处继续循环,否则退出循环。 (2)相等或为0时转移 格式:LOOPZ/LOOPE OPR 功能:CX(CX)1,测试(CX)0且ZF=1,转移到标号处继续循环,否则退出循环。 (3)不相等或不为0时转移 格式:LOOPNZ/LOOPNE OPR 功能:CX(CX)1,测试(CX)0且ZF=0,转移到标号处继续循环,否则退出循环。 (4)测试转移指令 格式:JCXZ OPR 功能:测试(CX)=0,转移到标号处继续循环,否则顺序执行。 【例4.14】 编写程

47、序,求1+2+3+100的累加和,结果保存在AX寄存器中。 解:采用循环累加的方法编程,程序如下: MOV AX,0 MOV CX,100 LP: ADD AX,CX LOOP LP 3. 子程序调用与返回指令 子程序通过指令CALL调用,执行完后,通过指令RET返回,有种寻址方式,可以段内调用,也可以段间调用。 (1)子程序调用指令 格式:CALL DST ;其中DST为子程序名(也称为过程名)。 功能: 段内调用 SP(SP)2 (SP)+1,(SP)(IP) ;返回地址压栈 IPDST偏移地址 段间调用 SP(SP)2 (SP)+1,(SP)(CS) ;返回段地址压栈 SP(SP)2 (

48、SP)+1,(SP)(IP) ;返回偏移地址压栈 IPDST偏移地址 CSDST段地址 (2)子程序返回指令 RET 作为子程序的最后一条指令,从堆栈中弹出断点地址,装入IP或IP与CS中,即返回到主程序的断点处。若带参数(指令RET N),使堆栈指针SP移动N个偶数字节单元。 格式:RET 或 RET N ;其中N是一个整型表达式 功能: 段内返回 IP(SP)+1,(SP) SP(SP)+2 带参数返回时还要再执行下面的一步操作 SP(SP)+N 段间返回 IP(SP)+1,(SP) SP(SP)+2 CS(SP)+1,(SP) SP(SP)+2 带参数返回时还要再执行下面的一步操作 SP

49、(SP)+N4. 中断指令 (1)中断指令INT 格式:INT OPR 功能:SP(SP)2 (SP)+1,(SP)PSW SP(SP)2 (SP)+1,(SP)(CS) SP(SP)2 (SP)+1,(SP)(IP) IP(OPR4) CS(OPR4+2) 其中OPR为中断类型码,其值在0255范围内。 (2)溢出中断指令INTO 格式:INTO 功能:PSW、CS、IP压栈 IP(10H) CS(12H) (3)中断返回指令IRET 格式:IRET 功能:IP(SP)+1,(SP) SP(SP)+2 CS(SP)+1,(SP) SP(SP)+2 PSW(SP)+1,(SP) SP(SP)+

50、2 指令INT和INTO只影响控制标志IF和TF,使IF=TF=0,不影响其余标志位;中断返回指令IRET影响所有标志位。4.3.6 处理器控制类指令 处理器控制指令只完成简单的控制功能,指令中不设地址码,共有12条,分为两类,其中标志类指令影响相应状态标志位外,其余指令不影响状态标志位,如表所示。指令类型助记符格式功能说明标志操作指令STD方向标志置1 (地址减量) DF=1 CLD方向标志清0 (地址增量) DF=0 STC进位标志置1 CF=1 CLC进位标志清0 CF=0 CMC进位标志取反 CF=CF STI中断允许标志置1(开中断) IF=1 CLI中断允许标志清0(关中断) IF

51、=0 系统控制指令ESC换码,向外处理机提供数据 HLT处理器暂停,直到出现中断复位信号 NOP空操作,占有一个字节,不执行任何操作 LOCK总线锁定 WAIT等待状态,定期检查TEST信号 表4.2 处理器控制指令4.4 汇编语言程序格式与常用伪指令 汇编语言有约定的书写格式,这就要求读者在编程时,严格遵循约定CLC的格式,合理使用伪指令和宏。 4.4.1 汇编语言程序格式 4.4.2 常量、变量、表达式与运算符 4.4.3 常用伪指令 4.4.4 宏指令 4.4.5 条件汇编 4.4.6 保护方式编程指令4.4.1 汇编语言程序格式1汇编语言程序格式 一个完整的汇编语言程序往往需要分成若干

52、段来书写。一般情况下,格式如下: NAME1 SEGMENT 语句1 NAME1 ENDS NAME2 SEGMENT 语句 NAME2 ENDS END 标号 其中,NAME1,NAME2分别为段名,由段定义伪指令 SEGMENT/ENDS来说明,最后的END是程序结束伪指令。 任何一个汇编语言源程序必须有一个逻辑代码段和一条指示源程序结束的伪指令END。堆栈段、数据段和附加段可根据程序的需要选用。2汇编语言语句格式 在汇编语言程序中,指令又称为语句。在一个程序中,除述指令外,通常还有一些伪指令。下面对8086汇编语言中的3种基本语句予以介绍 (1)指令语句 在8086指令系统中,一条指令就

53、是一条语句,书写格式如下: 标号: 操作码 操作数 ;注释 各字段之间用空格隔开,两个操作数之间用逗号隔开,方括号表示可选项。 标号:是由字母开头的字符串组成,以冒号“:”结束,表示一条指令的符号地址。标号最长31个字符,由字母AZ、数字09和一些特殊字符?、.、_、$组成。但是数字不能作为标号的第一个字符,圆点仅能用作标号第一个字符。 助记符:表示操作性质的指令,如果带有前缀,用空格分开。 操作数:指令操作的对象,按指令要求,可能有一个、两个或者没有。操作数有两个时用逗号“,”分开。操作数可以是常数、寄存器名、标号、变量或表达式等。 注释:以分号“;”开头,是对语句或程序的说明,仅在源程序清

54、单中列出,不作其它处理。 (2)伪指令语句 是一种说明性的语句,用来对汇编过程进行控制,比如对数据列表、存储空间分配、程序起始地址及段定义等,汇编时不生成目标代码。伪指令语句格式如下: 符号名 伪指令 参数 ;注释 符号名:同标号,但是后面没有冒号“:”,在不同的伪指令语句中,符号名可以是常量名、变量名、过程名、段名、结构名、记录名等。 伪指令:是要求汇编程序完成具体操作的命令,比如数据定义伪指DB、DW、DD等,段定义伪指令SEGMENT和ENDS等。 参数:是对汇编过程的进一步说明,可以是常量、变量、标号、过程名、结构名、记录名或一些专用符号,比如BYTE、FAR等;参数的个数由伪指令确定

55、。 注释:与指令语句中的注释相同。 (3)宏指令语句 宏指令是将程序中多次使用的程序段定义为一条指令,即宏指令。在对宏指令汇编时,以原程序代码取代宏指令。宏指令格式如下: 标号: 宏指令名 参数1 ,参数2 , ;注释 4.4.2 常量、变量、表达式与运算符 在汇编语言程序中,数据的表示形式大体上分为两种类型,即常量与变量。用运算符把常量或变量连接起来的式子,称为表达式。表达式也可作为语句中的操作数。 1常量 在汇编语言程序中保持不变的量称为常量,有两种,即数字常量与字符串常量。 (1)数字常量 数字常量有多种,即二进制、八进制、十进制和十六进制等常量。例如: 10011001B,274Q,2

56、89D和0B2E4H等。 (2)字符串常量 字符串常量是用单引号括起来的一个或多个字符,在存储器中以ASCII码的形式存储,比如A,存储为41H,0123存储为30H,31H,32H,33H。 2变量 变量代表存放在某存储单元中的数据,在程序运行期间可以改变,常以变量名的形式出现在程序中。变量名是在程序中建立起来、可认为是存放数据的存储单元的符号地址。变量名的取名规则与标号相同。例如SUM、PORT_VAL、NEXT、LOP1等。变量必须在使用之前定义,一般在数据段中进行。 【例4.15】定义三个变量DATA1、DATA2、DATA3。 解:在程序中的数据段定义,语句如下: DATA SEGM

57、ENT DATA1 DB 12H DATA2 DW 1234H DATA3 DD 12345678H DATA ENDS (1)变量的属性 经过定义后的变量有三种属性,即段属性、偏移量属性和类型属性。即变量所在段的段基值、距段起始地址的偏移地址、变量占用存储器单元的字节数。 (2)变量的定义 变量必须在使用之前定义,由汇编语言提供的伪指令来实现的,即为变量分配存储器单元,预置初值,常用的伪指令有DB、DW、DD、DQ、DT等。其格式如下: 变量名 伪指令名 表达式 ;定义一个数据存储区 表达式可以是数值表达式、地址表达式、字符串、?、或 N DUP(表达式),也可以有多个。 数值表达式:为变量

58、定义数值数据。例如伪指令: SUM DB 45,89H,10010101B NUMBER DW 4576H,1,128 TOTAL DD 7897AFE2H,4567H 数据存放时,低字节存放在低地址单元中,高字节存放在高地址单元中。 地址表达式:为变量定义存储器地址。只能使用DW和DD定义。其中DW变量的偏移地址,而DD定义变量的偏移地址和段地址。例如: ADDR1 DW OFFSET SUM ;取偏移地址 ADDR2 DD NUMBER ;定义偏移地址和段地址 字符串:可作为表达式使用,存放字符的ASCII码值。例如伪指令:XYZ DB ABCD ;按字节依次存储A、B、C、D的ASCII

59、码值 DATA DW CD,76 ;按字依次存放CD和76的ASCII码值 N DUP(表达式):可以复制某个(或某些)操作数,也可以嵌套。 例如伪指令: DATA1 DB 2 DUP(4, 3 DUP(1),30H) DATA2 DB 3 DUP(?) (3)变量的使用 经过DB,DW、DD等伪指令定义后可使用,即直接引用它的变量名。 【例4.16】 数值变量的引用。 解:首先定义变量,然后引用,程序如下: DA1 DB 0FFH DA2 DW 2345H MOV AL,DA1 ;使用前面定义的变量DA1 MOV BX,DA2 ;使用前面定义的变量DA2 【例4.17】 地址变量的引用。 解

60、:引用变量名,取其偏移量,程序如下: DA3 DB 10H DUP(0) DA4 DW 20H DUP(1) MOV DA3SI,AL MOV DX,DA4BXDI 3表达式与运算符 表达式是用运算符或操作符把常量、变量、标号等连接起来而构成的式子,在程序汇编的过程中确定。在8086汇编语言中主要有三类型的运算符和两类操作符。其中运算符有算术运算符、逻辑运算符和关系运算符;操作符有数值返回操作符和属性操作符。 (1)算术运算符 算术运算符如表所示。 +、-:单目运算符,表示数的正负。 、*、/ 、MOD:加、减、乘、除,其操作数与运算结果均为整数;除法运算结果只取商的整数部分;减法运算符用于变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论