1、第五章 86系列微型计算机的指令系统,指令是让计算机完成某种操作的命令,指令的集合称作指令系统,不同系列计算机有不同的指令系统。指令是根据计算机CPU硬件特点研制出来的,指令的符号用规定的英文字母组成,称为助记符。它的程序目标代码短、运行速度快,因此,指令语言是面向机器的语言,它在自动控制、智能化仪器仪表、监测等领域应用非常广泛。,5.1 8086/8088汇编语言指令格式与寻址方式,5.1.1 8086/8088汇编语言指令语句格式86系列汇编语言指令语句格式如图:,指令助记符,操作数,1标号是给该指令所在地址取的名字,必须后跟冒号“:”,标号可以缺省,是可供选择的标识符。8086/8088
2、汇编语言中可使用的标识符必须遵循下列规则: (1)标识符由字母(a z、A Z)、数字(0一9)或某些特殊字符(,-,?)组成; (2)第一个字符必须是字母( a z、A Z )或某些特殊的符号(, - ,?),但“?”不能单独作标识符; (3)标识符有效长度为31个字符,若超过31个字符,则只保留前面的31个字符为有效标识符。,下面是有效的标识符:START: MY-CODE: ALPHA:NUM-1: LOOP1 : X:? MORE-350: BETA-1: DELAYIS:下面是无效的标识符:4LOOP: MAIN AB:BETA*: START=3: GAMA1:NUM+1: ?:
3、ONE*TWO: 2指令助记符是指令名称的代表符号,它是指令语句中的关键字,不可缺省。,3.操作数是参加本指令运算的数据,有些指令不需要操作数,可以缺省(举例);有些指令需要两个操作数,这时必须用逗号(,)将两个操作数分开。4.注释部分是可选项,允许缺省,如果带注释则必须用分号(;)开头,注释本身只用来对指令功能加以说明,给阅读程序带来方便,汇编程序不对它做任何处理。,5.1.2 86系列CPU的寻址方式,1立即数寻址8086指令系统中,有一部分指令所用的8位或16位操作数就在指令中提供,这种方式叫立即数寻址方式,例如:MOV AL,80H;MOV AX,1090H;采用立即数寻址方式的指令主
4、要用来对寄存器赋值。 特点:速度快。为什么? 不需要运行总线周期。,2寄存器寻址,如果操作数就在CPU的内部寄存器中,那么寄存器名可在指令中指出,这种寻址方式就叫寄存器寻址方式。例如:INC CX ;将CX的内容加1执行速度如何?操作就在CPU内部进行,不需要使用总线周期,因此,执行速度快。,问:通常情况下操作数放在哪里?,3直接寻址使用直接寻址方式时,数据总是在存储器中,存储单元的有效地址(什么地址?)由指令直接指出。例如:MOV AX,1070H;将DS段的1070H和1071H两单元的内容取到AX中。要注意的是采用直接寻址方式时,如果指令前面没有用前缀指明操作数在哪一段,则默认为段寄存器
5、是数据段寄存器DS。,操作数不在DS段,怎么办?CS:MOV BX,3000H;(加前缀)将CS段的3000H和3001H两单元的内容送BX设CS为5100H,则本指令在执行时, 将54000H和54001H两单元的内容取出送BX。注意:在汇编语言中常将“ ”方括号中的内容作为存储单元的地址。,4寄存器间接寻址,采用寄存器间接寻址方式时,操作数一定在存储器中,存储单元的有效地址由寄存器指出,这些寄存器可以为BX、BP、SI和DI之一,即有效地址等于其中某一个寄存器的值:,和直接寻址的情况一样,如果指令前面没有用前缀指明具体的段寄存器,则寻址时默认的段寄存器通常为DS。如寄存器为BP时,则对应的
6、段寄存器为SS。,采用寄存器间接寻址时,允许在指令中指定一个位移量。 MOV AX,BP+0050 BP=2000H SS=3000H 32050HAL 32051HAH,寄存器相对寻址,细分起来,寄存器间接寻址可分为以下四种: (1)以BX寄存器进行间接寻址数据段基址寻址用BX寄存器进行间接寻址时,默认的段寄存器为DS,因为BX称为基址寄存器,所以这种寻址方式也叫数据段基址寻址。例如:MOV AX,BX设DS = 5000H,BX = 6000H,则本指令在执行时,将56000H和56001H两单元的内容送AX。,(2)以BP寄存器进行间接寻址堆栈段基址寻址。 注意:操作数默认在堆栈段中,因
7、为BP称为基址寄存器,所以这种寻址方式通常称为堆栈段基址寻址。例如:,MOV BX,BP 设SS = 5000H,BP = 2000H。 则本指令在执行时,将52000H和52001H两单元的内容送BX。,(3)以SI、DI寄存器进行间接寻址变址寻址SI源变址寄存器DI目的变址寄存器,所以用这两个寄存器来进行间接寻址也叫变址寻址。 变址寻址通常用于对数组元素进行操作。,(4)将BX、BP和SI、DI寄存器组合起来进行间接寻址基址加变址的寻址,通常将BX和BP称为基址寄存器,将SI和DI称为变址寄存器。 8086指令系统允许把基址寄存器和变址寄存器组成起来构成一种新的寻址方式,叫基址加变址的寻址
8、。用这种寻址方式时,操作数的有效地址是:,例如: MOV AX,BX+SI+1000,设DS=1000H,BX=5000H,SI=3000H。则上面指令在执行时,有效地址为8000H,本指令将19000H和19001H两单元的内容取到AX中。相对的基址加变址上述指令,把BX换成BP,结果如何?,指出下列指令中源操作数和目的操作数的寻址方式。(1)MOV AX,1070H(2)MOV AX,BX(3)MOV AX,BXSI0050(4)AND AX, BX(5)MOV AX, 6000H,5.2、传送类指令,传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换
9、等场合。我们把这类指令分为四种,并把各种指令操作码助记符和对应的操作数列表格如表所示。,注意:1、POP指令中的目的操作数可以是除代码段寄存器CS之外的其他寄存器和存储器。 2、根据先进后出的原则,程序设计必须对称。,又如:假设数据表放在偏移地址为 2000H开始的内存中,取出“3”所对应的七段码,用如下几条程序来完成:,MOV BX, 2000HMOV AL,3XLAT执行结果 AL=30H,PUSHF和POPF指令一般用在子程序和中断程序的首尾,起保存主程序标志和恢复主程序标志的作用。,ADC指令为实现多字节的加法运算提供了方便。比如,有两个4字节的无符号数相加,这两个数分别放在2000H
10、和3000H开始的存储单元中,低位在前,高位在后,要求进行运算后,得到的和放在2000H开始的内存单元中。,多字节的加法程序段如下:CLC ;清进位CFMOV SI,2000H ;取第一个数的首地址MOV AX,SI ;将第一个数的低16位取到AXMOV DI,3000H ;取第二个数的首地址ADD AX,DI ; 第一个和第二个数的低16位相加MOV SI,AX ;相加结果送到2000H和2001单元MOV AX,SI+2 ;取第一个数的高16位送到AX中ADC AX,DI+2 ;两个数的高16位连同进位位相加MOV SI+2,AX ;相加的结果送到2002和2003单元,SAL 算术左移指
11、令 格式:SAL 目的操作数,计数值,SAL AL,1 指令执行前 CF=0, AL=10100001执行后AL=01000010,CF=1 最高位移出进CF,最低位补零,SHL 逻辑左移指令 格式:SHL 目的操作数,计数值,SHL AL,1 指令执行前 CF=0 ,AL=10100001执行后AL=01000010,CF=1与算术左移指令功能完全相同,SHR 逻辑右移指令 格式:SHR 目的操作数,计数值,SHR AL,1 指令执行前 AL=10100001,CF=0执行后AL=01010000,CF=1 最低位移出进CF,最高位补零 OF=?,SAR 算术右移指令 格式:SAR 目的操作
12、数,计数值,SAR AL,1 指令执行前 AL=10100001,CF=0执行后AL=11010000,CF=1 最低位移出进CF,最高位不变!功能与SHR完全不同!切记!,循环移位指令 格式:指令助记符 目的操作数,计数值,算术逻辑移位指令移出的数位会丢失吗?如何避免? ROL 循环左移 ROR 循环右移RCL 带进位位循环左移RCR 带进位位循环右移,ROL 循环左移指令 格式:ROL 目的操作数,计数值,ROL AL,1 指令执行前 CF=0 ,AL=10100001执行后AL=01000011,CF=1 最高位移到最低位,并复制一份进CF!,ROR 循环右移指令 格式:ROR 目的操作
13、数,计数值,ROR AL,1 指令执行前 AL=10100001,CF=0执行后AL=11010000,CF=1 最低位移到最高位,并复制一份进CF!,RCL 带进位位循环左移指令 格式:RCL 目的操作数,计数值,RCL AL,1 指令执行前 CF=0,AL=10100001执行后AL=01000010,CF=1 AL最高位移进CF,CF移到最低位,RCR 带进位位循环右移指令 格式:RCR 目的操作数,计数值,RCR AL,1 指令执行前 AL=10100001 , CF=0执行后AL=01010000,CF=1 CF 移到AL最高位,AL最低位移进,下面简单举例说明移位指令的应用:一般算
14、术移位指令可用于实现带符号数的简单乘除运算,而逻辑移位指令则用于无符号数的简单乘除。例 AX中已存放一带符号数,若要完成(AX)*32运算,可用以下程序段:MOV DX,AX ;SAL AX, 1 ;乘2AXADD AX, DX ;乘3AXSAR AX, 1 ;完成(AX)*3/2,字符串的扫描和比较,SCAS指令是用来从目的串中查找某个关键字,要求查找的关键字应事先置入AX或AL寄存器中。将AXAL寄存器中的关键字减去由DI所指向的目标串中一个元素,不传送结果,只根据结果置标志位。通常在SCAS指令之前加重复前缀REPNEREPNZ,用来从目标串中寻找关键字,操作一直进行到ZF1或(CX)0
15、为止(说明什么)。,例如,在某字符串中查找是否存在“$”字符。若存在,则将“$”字符所在地址送入BX寄存器中,否则将BX寄存器清“0”。程序如下:,CLD ; 清除方向标志DFMOV DI,0100H ; 送目标串首元素偏移地址MOV AL,$ ;关键字一ALREPNE SCASB ;找关键字AND CX,0FFHJZ ZERDEC DI (为什么减1)MOV BX,DI ;关键字所在地址BXJMP ST0ZER: MOV BX,0 ;未找到,0BXST0: HLT,CMPS指令是用来将源串的一个元素减去目标串中相对应的一个元素,不回送结果,只根据结果特征置标志,并修改SI和DI内容指向下一元素。 通常用来寻找两个串中的第一个不相同数据。(思考应该加什么样的重复前缀),CMPS指令前加重复前缀REPEREPZ例如检验一段被传送过的数据是否与源串完全相同,程序如下:,执行完上述程序,若两串相同,则BX寄存器内容为0;若两串不同,则BX指向源串中第一个不相同字节的地址,该字节的内容保留在AL寄存器中。,作业 P135 1、2、4、5、9,