1、 第一讲 第三章 指令系统--寻址方式 回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过程。 重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及有效地址的计算。 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲授内容: 3.1 8086/8088寻址方式 首先,简单讲述一下指令的一般格式: 操作码 操作数 …… 操作数 计算机中的指令由操作码字段和操作
2、数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。 例如:MOV AX,3000H 立即数可以是8位的,也可以是16位的。若是16位的,则存储时低位在前,
3、高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如: MOV AX,DS:[2000H]; 图2-2 (对DS来讲可以省略成 MOV AX,[2000H], 系统默认为数据段) 这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中
4、指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中。可以分成两种情况: (1) 以SI、DI、BX间接寻址,则通常操作数在现行数据
5、段区域中,即数据段寄存器(DS)*16加上SI、DI、BX中的16位偏移量,为操作数的地址, 例如: MOV AX, [SI] 操作数地址是:(DS)*16+(SI) (2) 以寄存器BP间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS)*16与BP的内容相加作为操作数的地址, 例如:MOV AX,[BP] 操作数地址是:(SS)*16+(BP) 若在指令中规定是段超越的,则BP的内容也可以与其它的段寄存器相加,形成操作数地址。 例如: MOV AX,DS:[BP] 操作数地址是:(DS)*16+(BP) 5.变址寻址 由指定的寄存器内容
6、加上指令中给出的8位或16位偏移量(当然要由一个段寄存器作为地址基准)作为操作数的偏移地址。(操作数在存贮器中) 可以作为寄存器变址寻址的四个寄存器是SI、DI、BX、BP。 ⑴若用SI、DI和BX作为变址,则与数据段寄存器相加,形成操作数的地址即默认在数据段; ⑵若用BP变址,则与堆栈段寄存器相加,形成操作数的地址即默认在堆栈段 例如: MOV AX,COUNT[SI]; 操作数地址是:(DS)*16+(SI)+COUNT 但是,只要在指令中指定是段超越的,则可以用别的段寄存器作为地址基准。 6.基址加变址寻址 把BX和BP看成是基址寄存器,把SI、DI看着是变址寄
7、存器,把一个基址寄存器(BX或BP)的内容加上一个变址寄存器(SI或DI)的内容,再加上指令中指定的8位或16位偏移量(当然要以一个段寄存器作为地址基准)作为操作数的偏移地址,如图所示。 操作数在存贮器中,其偏移地址由(基址寄存器)+(变址寄存器)+相对偏移量形成 基址寄存器――BX:数据段、BP:堆栈段; 变址寄存器――SI、DI。 例如:MOV AX,[BX][SI] 或 MOV AX,[BX+SI] 也可放置一个相对偏移量,如COUNT 、MASK等等,用于表示相对寻址。 MOV AX,MASK[BX][SI] MOV BH,COUNT[
8、DI][BP];MOV BH,COUNT[BP+DI] ² 若用BX作为基地址,则操作数在数据段区域 ² 若用BP作为基地址,则操作数在堆栈段区域 但若在指令中规定段是超越的,则可用其它段寄存器作为地址基准。 P.28 表2-1 段寄存器使用的基本约定 访问存储器类型 默认段寄存器 可指定段寄存器 段内偏移地址来源 取指令码 CS 无 IP 堆栈操作 SS 无 SP 串操作源地址 DS CS、ES、SS SI 串操作目的地址 ES 无 DI BP用作基址寄存器 SS CS、DS、
9、ES 根据寻址方式求得有效地址 一般数据存取 DS CS、ES、SS 根据寻址方式求得有效地址 习题与思考: 1.假定DS=2000H,ES=2100H,SS=1500H,SI=00A0H,BX=0100H,BP=0010H,数据变量VAL的偏移地址为0050H,请指出下列指令源操作数是什么寻址方式?其物理地址是多少? (1)MOV AX,0ABH (2)MOV AX,[100H] (3)MOV AX,VAL (4)MOV BX,[SI] (5)MOV AL,VAL[BX] (6)MOV CL,[BX][SI] (7)MOV VAL[SI]
10、BX (8)MOV [BP][SI],100 2.已知SS=0FFA0H,SP=00B0H,先执行两条把8057H和0F79H分别进栈的PUSH指令,再执行一条POP指令,试画出堆栈区和SP内容变化的过程示意图。(标出存储单元的地址) 第二讲 3.2 指令系统--数据传输、算术运算 回顾:8086/8088的内部结构和寄存器,8086/8088的工作过程。8086/8088的寻址方式及操作数地址的计算。 重点和纲要:要求学生了解指令的功能,掌握数据传送类,算术运算类指令的使用方法。(掌握指令内涵,会用)
11、 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲授内容: 3.2 8086/8088 指令系统 8086/8088的指令系统可以分为以下六个功能组。 1.数据传送(Data Transter) 2.算术运算(Arithmetic) 3.逻辑运算(Logic) 4.串操作(String menipulation) 5.程序控制(Program Control) 6.处理器控制(Proc
12、essor Control) 一、数据传送指令 主要介绍 MOV,XCHG、堆栈和地址传送指令。 1.数据传送MOV指令 一般格式:MOV OPRD1,OPRD2 MOV 是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。 功能:完成数据传送 具体来说,一条数据传送指令能实现: ⑴CPU内部寄存器之间数据的任意传送(除了代码段寄存器CS和指令指针IP以外)。 MOV AL,BL;字节传送 MOV CX,BX;字传送 MOV DS,BX ⑵立即数传送至CPU内部的通用寄存器组(即AX、 BX、CX、DX、BP、SP、SI、DI), MOV CL,
13、4 MOV AX,03FFH MOV SI,057BH ⑶CPU内部寄存器(除了CS和IP以外)与存储器(所有寻址方式)之间的数据传送。 MOV AL,BUFFER MOV AX,[SI] MOV [DI],CX MOV SI,BLOCK[BP] MOV DS,DATA[SI+BX] MOV DEST[BP+DI],ES ⑷ 能实现用立即数给存储单元赋值 例如:MOV [2000H],25H MOV [SI],35H 对于MOV 指令应注意几个问题: ①存储器传送指令中,不允许对CS和IP进行操作; ②两个操作数中,除立即寻址之外必须有
14、一个为寄存器寻址方式,即两个存储器操作数之间不允许直接进行信息传送; 如我们需要把地址(即段内的地址偏移量)为AREAl的存储单元的内容,传送至同一段内的地址为AREA2的存储单元中去,MOV指令不能直接完成这样的传送,但我们可以用CPU内部寄存器为桥梁来完成这样的传送: MOV AL,AREAl MOV AREA2,AL ③两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值;如:MOV AX,0;MOV DS,AX ④目的操作数,不能用立即寻址方式。 2.堆栈指令 (简述堆栈的概念及存取特点,如先进后出) 包括
15、入栈(PUSH)和出栈(POP)指令两类。仅能进行字运算。(操作数不能是立即数) ⑴ 入栈指令PUSH 一般格式:PUSH OPRD 源操作数可以是CPU内部的16位通用寄存器、段寄存器(CS除外)和内存操作数(所有寻址方式)。入栈操作对象必须是16位数。 功能:将数据压入堆栈 执行步骤为:SP=SP-2;[SP]=操作数低8位;[SP+1]= 操作数高8位 例如:PUSH BX 执行过程为:SP=SP-1,[SP]=BH;SP=SP-1,[SP]=BL,如图2-8所示。 ⑵ 出栈指令POP 一般格式:POP OPRD 功能:将数据弹
16、出堆栈 对指令执行的要求同入栈指令。 例如:POP AX 图2-8 POP [BX] POP DS 3.交换指令 XCHG 一般格式:XCHG OPRD1,OPRD2 功能:完成数据交换 这是—条交换指令,把一个字节或一个字的源操作数与目的操作数相交换。交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存储器之间进行。但段寄存器和立即数不能作为一个操作数,不能在累加器之间进行。 例如: XCHG AL,CL XCHG AX,DI
17、 XCHG BX,SI XCHG AX,BUFFER XCHG DATA[SI],DH 4.累加器专用传送指令 有三种,输入、输出和查表指令。前两种又称为输入输出指令。 ⑴ IN 指令 一般格式:IN AL,n ; B AL←[n] IN AX,n ; W AX←[n+1][n] IN AL,DX ; B AL←[DX] IN AX,DX ; W AX←[DX+1][DX] 功能:从I/O端口输入数据至AL或AX。 输入指令允许把一个字节或一个字由一个输入端口传送到AL或AX中。若端口地址超过255时,则必须用DX保存端口地
18、址,这样用DX作端口寻址最多可寻找64K个端口。 ⑵ OUT 指令 一般格式:OUT n,AL ; B AL→[n] OUT n,AX ; W AX→[n+1][n] OUT DX,AL ; B AL→[DX] OUT DX,AX ; W AX→[DX+1][DX] 功能:将AL或AX的内容输出至I/O端口。 该指令将AL或AX中的内容传送到一个输出端口。端口寻址方式与IN指令相同。 ⑶ XLAT指令 一般格式:XLAT ; AL=(DX)×16+(BX)+
19、AL)) 功能:完成一个字节的查表转换。 要求:①寄存器AL的内容作为一个256字节的表的下标。②表的基地址在BX中,③转换后的结果存放在AL中. TABLE: 例如:MOV BX,OFFSET TABLE MOV AL,8 …… IN AL,1 第9个字符 AAH XLAT ;查表
20、 OUT 1,AL ;(AL)= AAH 表长度256 本指令可用在数制转换、函数表查表、代码转换等场合。 5.地址传送指令(有三条地址传送指令) ⑴ LEA (Load Effective Address) 一般格式: LEA OPRD1,OPRD2 功能:把源操作数OPRD2的地址偏移量传送至目的操作数OPRD1。 要求:①源操作数必须是一个内存操作数,②目的操作数必须是一个16位的通用寄存器。这条指令通常用来建立串操作指令所须的寄存器指针。 例:LEA BX,BUFR;把变量BUFR的地址偏移量部分送到BX
21、 ⑵ LDS (Load pointer into DS) 一般格式: LDS OPRD1,OPRD2 功能:完成一个地址指针的传送。地址指针包括段地址部分和偏移量部分。指令将段地址送入DS,偏移量部分送入一个16位的指针寄存器或变址寄存器。 要求:源操作数是一个内存操作数,目的操作数是一个通用寄存器/变址寄存器。 例如:LDS SI,[BX] ;将把BX所指的32位地址指针的段地址部分送入DS,偏移量部分送入SI。图2-9 LDS指令示意 如图2-9所示。 ⑶ LES (Load pointer into ES) 一般格式: LES OPRD1
22、OPRD2 这条指令除将地址指针的段地址部分送入ES外,与LDS类似。例如: LES DI,[BX+COUNT] 6.标志寄存器传送(有四条标志传送指令) ⑴ LAHF (LOAD AH WITH FLAG) 将标志寄存器中的SF、ZF、AF、PF和CF(即低8位)传送至AH寄存器的指定位,空位没有定义。 ⑵ SAHF (STORE AH WITH FLAG) 将寄存器AH的指定位,送至标志寄存器的SF、ZF、AF、PF和CF位(即低8位)。根据AH的内容,影响上述标志位,对OF、DF和IF无影响。 ⑶ PUSHF (PUSH FLAG) 将标志寄存器压入
23、堆栈顶部,同时修改堆栈指针,不影响标志位。 ⑷ POPF (POP FLAG) 堆栈顶部的一个字,传送到标志寄存器,同时修改堆栈指针,影响标志位。 二、算术运算指令 8086/8088提供加、减、乘、除四种基本算术操作。这些操作都可用于字节或字的运算,也可以用于带符号数与无符号数的运算。 带符号数用补码表示。同时8086/8088也提供了各种校正操作,故可以进行十进制算术运算。 参与加、减运算的操作数可如上图所示。 1.加法指令 (Addition) ⑴一般形式:ADD OPRD1,OPRD2 功能:OPRD1←OPRD1+OPRD2 完成两个操作数相加,结果
24、送至目的操作数OPRD1。目的操作数可以是累加器,任一通用寄存器以及存储器操作数。 例如: ADD AL,30;累加器与立即数相加 ADD BX,[3000H];通用寄存器与存储单元内容相加 ADD DI,CX;通用寄存器之间 ADD DX,DATA[BX+SI];通用寄存器与存储单元内容相加 ADD BETA[SI],DX;存储器操作数与寄存器相加 这些指令对标志位CF、DF、PF、SF、ZF和AF有影响。 ⑵一般形式:ADC OPRD1,OPRD2;带进位的加法 功能:OPRD1←OPRD1+OPRD2 +CF 这条指令与上—条指令类似,只是在两个操作数相加
25、时,要把进位标志CF的现行值加上去,结果送至目的操作数。 ADC指令主要用于多字节运算中。若有两个四字节的数,已分别放在自FIRST和SECOND开始的存储区中,每个数占四个存储单元。存放时,最低字节在地址最低处,则可用以下程序段实现相加。 MOV AX,FIRST ADD AX,SECOND;进行字运算 MOV THIRD,AX MOV AX,FIRST+2 ADC AX,SECOND+2 MOV THIRD+2,AX 这条指令对标志位的影响与ADD相同。 ⑶一般形式:INC OPRD ; 功能:OPRD←OPRD+1 完成对指定的操作数OPRD加1,
26、然后返回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。 这条指令执行的结果影响标志位AF、OF、PF、SF和ZF,而对进位标志没有影响。 如:INC AL INC [BX] 2.减法指令(Subtraction) ⑴一般形式:SUB OPRD1,OPRD2 ; 功能:OPRD1←OPRD1-OPRD2 完成两个操作数相减,也即从OPRD1中减去OPRD2,结果放在OPRD1中。 例如: SUB CX,BX SUB [BP],CL ⑵一般形式:SBB OPRD1,OPRD2 ; 功能:OPRD1←OPRD1-OPRD2-CF
27、 这条指令与SUB类似,只是在两个操作数相减时,还要减去借位标志CF的现行值.本指令对标志位AF、CF、OF、PF、SF和ZF都有影响。 同ADC指令一样,本指令主要用于多字节操作数相减。 ⑶一般形式:DEC OPRD ; 功能:OPRD←OPRD-1-CF 对指令的操作数减1,然后送回此操作数, 在相减时,把操作数作为一个无符号二进制数来对待。指令执行的结果,影响标志AF、OF、PF、SF和ZF.但对CF标志不影响(即保持此指令以前的值)。 例如: DEC [SI] DEC CL ⑷一般形式:NEG OPRD 功能: (NEGDa
28、te) 取补 对操作数取补,即用零减去操作数,再把结果送回操作数。 例如: NEG AL NEG MULRE (AL=0011 1100)则取补后为1100 0100 即0000 0000-0011 1100=1100 0100 若在字节操作时对-128,或在字操作时对-32768取补,则操作数没变化,但标志OF置位。 此指令影响标志AF、CF、OF、PF、SF和ZF。此指令的结果一般总是使标志CF=1。除非在操作数为零时,才使CF=0。 ⑸一般形式:CMP OPRD1,OPRD2 ; 功能: OPRD1-OPRD2 比较指令完成两个操作数相减
29、使结果反映在标志位上,但并不送回结果(即不带回送的减法)。 例如: CMP AL,100 CMP DX,DI CMP CX,COUHT[BP] CMP COUNT[SI],AX 比较指令主要用于比较两个数之间的关系。在比较指令之后,根据ZF标志即可判断两者是否相等。 ² 相等的比较: ①若两者相等,相减以后结果为零,ZF标志为1,否则为0。 ②若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的大小。 ² 大小的比较: 如果是两个无符号数(如CMP AX,BX)进行比较,则可以根据CF标志的状态判断两数大小。若结果没有产生借位(CF=0),显
30、然AX≥BX;若产生了借位(即CF=1),则AX<BX。 习题与思考: 1.设有关寄存器及存储单元的内容如下: DS=2000H,BX=0100H,AX=1200H,SI=0002H,[20100H]=12H,[20101H]=34H,[20102H]=56H,[20103]=78H,[21200]=2AH,[21201H]=4CH,[21202H]=0B7H,[21203H]=65H。 试说明下列各条指令单独执行后相关寄存器或存储单元的内容。 (1)MOV AX,1800H (2)MOV AX,BX (3)MOV BX,[1200H] (4)
31、MOV DX,1100[BX] (5)MOV [BX][SI],AL (6)MOV AX,1100[BX][SI] 2.写出实现下列计算的指令序列。(假定X、Y、Z、W、R都为字变量) (1)Z=W+(Z+X) (2)Z=W-(X+6)-(R+9) 3.若在数据段中从字节变量TABLE相应的单元开始存放了0~15的平方值,试写出包含有XLAT指令的指令序列查找N(0~15)中的某个数的平方。(设N的值存放在CL中) 第三讲 3.3 指令系统-算术运算、逻辑运算、控制转移 回顾:8086/8088的内部结构和寄存器,8086/80
32、88的工作过程。8086/8088的寻址方式及操作数地址的计算。 重点和纲要:要求学生了解指令的功能,掌握算术运算类、逻辑运算和移位指令的功能和应用。(掌握指令内涵,会用) 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲述内容: 3.乘法指令(分为无符号乘法指令和带符号乘法指令两类) (1) 无符号乘法指令MUL 一般格式: MUL OPRD 完成字节与字节相乘、字与字相乘,且默认的操作数放在AL或AX中
33、而源操作数由指令给出。8位数相乘,结果为16位数,放在AX中;16位数相乘结果为32位数,高16位放在DX,低16位放在AX中。注意:源操作数不能为立即数。 例如: MOV AL,FIRST; MUL SECOND ;结果为AX=FIRST*SECOND MOV AX,THIRD; MUL AX ;结果DX:AX=THIRD*THIRD MOV AL,30H CBW ; 字扩展AX=30H MOV BX,2000H MUL BX ; (2) 带符号数乘法指令IMUL 一般格式:IMUL O
34、PRD ;OPRD 为源操作数 这是一条带符号数的乘法指令,同MUL一样可以进行字节与字节、字和字的乘法运算。结果放在AX或DX,AX中。当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位。 4.除法指令 (1) 无符号数除法指令 DIV 一般格式:DIV OPRD (2) 带符号数除法IDIV 一般格式:IDIV OPRD 该指令执行过程同DIV指令,但IDIV指令认为操作数的最高位为符号位,除法运算的结果商的最高位也为符号位。 在除法指令中,在字节运算时被除数在AX中;运算结果商在AL中,余数在AH中。字运算时被除数为DX:AX构成的
35、32位数,运算结果商在AX中,余数在DX中。 例如:AX=2000H,DX=200H,BX=1000H,则 DIV BX执行后,AX=2002H ,DX=0000。 除法运算中,源操作数可为除立即寻址方式之外的任何一种寻址方式,且指令执行对所有的标志位都无定义。 由于除法指令中的字节运算要求被除数为16位数,而字运算要求被除数是32位数,在8086/8088系统中往往需要用符号扩展的方法取得被除数所要的格式,因此指令系统中包括两条符号扩展指令。 (3) 字节扩展指令CBW 一般格式:CBW 该指令执行时将AL寄存器的最高位扩展到AH,即若D7=0,则AH=0;否则AH=0FFH。
36、 (4) 字扩展指令CWD 一般格式:CWD 该指令执行时将AX寄存器的最高位扩展到DX,即若D15=0,则DX=0;否则DX=0FFFFH。 CBW、CWD指令不影响标志位。 5.十进制调整指令 计算机中的算术运算,都是针对二进制数的运算,而人们在日常生活中习惯使用十进制。为此在8086/8088系统中,针对十进制算术运算有一类十进制调整指令。 在计算机中人们用BCD码表示十进制数,对BCD码计算机中有两种表示方法:一类为压缩BCD码,即规定每个字节表示两位BCD数;另一类称为非压缩BCD码,即用一个字节表示一位BCD数,在这字节的高四位用0填充。例如,十进制数25D,表示为压缩
37、BCD数时为:25H;表示为非压缩BCD数时为:0205H,用两字节表示。 相关的BCD转换指令见表2-2。 表2-2 十进制调整指令 指令格式 指令说明 DAA 压缩的BCD码加法调整 DAS 压缩的BCD码减法调整 AAA 非压缩的BCD码加法调整 AAS 非压缩的BCD码减法调整 AAM 乘法后的BCD码调整 AAD 除法前的BCD码调整 例如: ADD AL,BL DAA 若执行前:AL=28H,BL=68H,则执行ADD后:AL=90H,AF=1;再执行DAA指令后,正确的结果为:AL=96H,CF=0,AF=1。 MUL BL
38、AAM 若执行前:AL=07,BL=09,则执行MUL BL 后,AX=003FH,再执行AAM指令后,正确的结果为:AH=06H,AL=03H。 注意:BCD码进行乘除法运算时,一律使用无符号数形式,因而AAM 和AAD应固定地出现在MUL之前和DIV之后。 三、 逻辑运算和移位指令 包括逻辑运算、移位和循环移位指令 1.逻辑运算指令 (1) 一般格式:NOT OPRD 功能:对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。例如:NOT AL (2) 一般格式:AND OPRD1,OPRD2 功能:对两个操作数进行按位的逻辑“与
39、运算,结果送回目的操作数。 其中目的操作数OPRD1可以是累加器、任一通用寄存器,或内存操作数(所有寻址方式)。源操作数OPRD2可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。 8086/8088的AND指令可以进行字节操作,也可以进行字操作。 例如: AND AL,0FH ;可完成拆字的动作 AND SI,SI ; 将SI清0 (3) 一般格式:TEST OPRD1,OPRD2 功能:完成与AND指令相同的操作,结果反映在标志位上,但并不送回。通常使用它进行测试, 例如 若要检测 AL中的最低位是否为1,为1则转移。可用以下指令:
40、TEST AL,01H JNZ THERE …… THERE: 若要检测CX中的内容是否为0,为0则转移。该如何做呢? (4) 一般格式:OR OPRD1,OPRD2 功能:对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。 其中,目的操作数OPRD1,可以是累加器,可以是任—通用寄存器,也可以是一个内存操作数(所有寻址方式)。源操作数OPRD2,可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。 AND AL,0FH AND AH,0FOH OR AL,AH ; 完成拼字的动作 OR AX,0FFFH ;将AX低12位置1 OR
41、 BX,BX ; 清相应标志 (5) 一般格式:XOR OPRD1,OPRD2 功能:对两个指定的操作数进行“异或”运算,结果送回目的操作数。 其中,目的操作数OPRD1可以是累加器,可以是任一个通用寄存器,也可以是一个内存操作数(全部寻址方式)。源操作数可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。例如: XOR AL,AL ;使AL清0 XOR SI,SI ;使SI清0 XOR CL,0FH ;使低4位取反,高4位不变 逻辑运算类指令中,单操作数指令NOT的操作数不能为立即数,双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,且
42、目的操作数不能为立即数。它们对标志位的影响情况如下:NOT不影响标志位,其它四种指令将使CF=OF=0,AF无定义,而SF、ZF和PF则根据运算结果而定。 2.移位指令 (1)算术/逻辑移位指令 ① 算术左移或逻辑左移指令 SAL/SHL OPRD,M ; ② 算术右移指令 SAR OPRD,M ③ 逻辑右移指令 SHR OPRD,M M是移位次数,可以是1或寄存器CL 这些指令可以对寄存器操作数或内存操作数进行指定的移位,可以进行字节或字操作;可以一次只移1位,也可以移位由寄存器CL中的内容规定的次数 (2)循环移位指令 RO
43、L OPRD,M ;左循环移位 ROR OPRD,M ;右循环移位 RCL OPRD,M ;带进位左循环移位 RCR OPRD,M ;带进位右循环移位 前两条循环指令,未把标志位CF包含在循环的环中,后两条把标志位CF包含在循环的环中,作为整个循环的一部分。 循环指令可以对字节或字进行操作。操作数可以是寄存器操作数,也可以是内存操作数。可以是循环移位一次,也可以循环移位由CL的内容所决定的次数。 左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2。右移—位相当于除以2。 在数的输入输出过程中乘10的操
44、作是经常要进行的。而X10=X*2+X*8,也可以采用移位和相加的办法来实现*10。为保证结果完整,先将AL中的字节扩展为字。 MOV AH,0 SAL AX,1 ;X*2 MOV BX,AX ;移至BX中暂存 SAL AX,1 ;X*4 SAL AX,1 ;X*8 ADD AX,BX ;X*10 例1 BCD码转换为ASCII码 若在内存某一缓冲区中存
45、放着若干个单元的用BCD码表示的十进制数。每—个单元中放两位BCD码,要求把它们分别转换为ASCII码。高位的BCD码转换完后放在地址较高的单元。 分析:转换公式:ASCII=BCD+30H 算法:源串和目的串的表首分别设两个指针。取BCD转ASCII 后存入(先低位,后高位) MOV SI,OFFSET BCDBUFF;设置源地址指针 MOV CX,COUNT ;设计数初值 MOV DI,OFFSET ASCBUF ;设置目的地址指针 AGAIN:MOV AL,[SI] MOV BL,AL AND AL,0FH
46、 ;取低位BCD码 OR AL,30H ;转换成ASCII码 MOV [DI],AL ;存入 INC DI ;修改指针 MOV AL,BL PUSH CX MOV CL,4 SHR AL,CL OR AL,30H ;高位转换成ASCII码 MOV [DI],AL ;存入 POP CX INC DI INC SI ;修改指针 LOOP AGAIN ;重复工作 习题与思考: 1.写出实
47、现下列计算的指令序列。(假定X、Y、Z、W、R都为字变量) (1)Z=(W*X)/(R+6) (2)Z=((W-X)/5*Y)*2 2.假定DX=1100100110111001B,CL=3,CF=1,试确定下列各条指令单独执行后DX的值。 (1)SHR DX,1 (2)SHL DL,1 (3)SAL DH,1 (4)SAR DX,CL (5)ROR DX,CL (6)ROL DL,CL (7)RCR DL,1 (8)RCL DX,CL 3.试分析下列程序完成什么功能? MOV CL,4 SHL DX,CL MOV BL,A
48、H SHL BL,CL SHR BL,CL OR DL,BL 4.已知程序段如下: MOV AX,1234H MOV CL,4 ROL AX,CL DEC AX MOV CX,4 MUL CX INT 20H 试问:(1)每条指令执行后,AX寄存器的内容是什么?(2)每条指令执行后,CF,SF及ZF的值分别是什么?(3)程序运行结束时,AX及DX寄存器的值为多少? 第四讲: 3.4 指令系统-循环、子程序调用、中断、其他 回顾:8086/8088的内部结构和寄存器,8086/8088的工作过
49、程8086/8088的寻址方式及操作数地址的计算。 重点和纲要:要求学生了解串操作指令的功能。指令系统-循环、子程序调用、中断、其他(掌握指令内涵,会用) 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 35” ×2 提 问 3” ×2 小 结 2” ×2 讨 论 5” ×2 讲授内容: 四、 串操作类指令 (选讲或简单介绍) 串操作类指令可以用来实现内存区域的数据串操作。这些数据串可以是字节串,也可以是字串。 1.重复指令前缀 串操作类指令可以与重复指令前缀配合使用。从而可
50、以使操作得以重复进行,及时停止。重复指令前缀的几种形式见表2-3所示。 表2-3重复前缀 汇编格式 执行过程 影响指令 REP (1)若(CX)=0,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3) MOVS,STOS,LODS REPE/ REPZ (1)若(CX)=0或ZF=0,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3) CMPS,SCAS REPNE/ REPNZ (1)若(CX)=0或ZF=1,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3) CMPS,SCAS






