《微机原理与接口技术徐惠民第3章.ppt》由会员分享,可在线阅读,更多相关《微机原理与接口技术徐惠民第3章.ppt(91页珍藏版)》请在三一文库上搜索。
1、微机原理与接口技术,第三章 8088/8086的指令系统,第三章 8088/8086的指令系统,主要内容 各种寻址方式 8086/8088的指令系统,指令系统:一台计算机所能识别和执行的全部 指令的集合。 指令的组成: 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分。 操作数是指令执行的参与者,即各种操作的对象。 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数。,指令的表示: 二进制代码 0000001011001111B (机器指令) 助记符 ADD CL,BH (汇编指令),3.1 8086/8088的寻
2、址方式,根据指令内容确定操作数地址的过程,称为寻址。 根据寻址计算所得到的操作数地址叫做操作数的有效地址(EA),也就是段内偏移地址。有效地址还需要与相应的段基地址组合才是20位的物理地址(PA) ,该工作由CPU完成。 操作数的来源:(1)直接包含在指令中; (2)在CPU的某寄存器中; (3)在内存中。,3.1 8086/8088的寻址方式,寻址方式有:,1、立即寻址 这种寻址的操作数直接放在指令中。不需要访问存储器。 例:MOV AL,34H MOV AX,1234H 需要注意在16位操作时,两个 字节数据的高低位存储位置。立即数只能是源操作数。立即寻址主要用来给寄存器或存储单元赋初值。
3、,注意:在8086/8088的汇编指令中,逗号前的操作数为目的操作数,逗号后的操作数为源操作数。,3.1 8086/8088的寻址方式,2、寄存器寻址 操作数就放在CPU的内部寄存器中,AX、BX、CX、DX、DI、SI、SP、BP、DS、ES和SS,不需要访问存储器。 例:INC CX MOV AX,BX 若执行前 AX =30A6H, BX =69EDH, CX =40D9H 则执行后 AX =69EDH, BX内容不变 CX =40DAH,3.1 8086/8088的寻址方式,3、直接寻址 有效地址(偏移地址EA)由指令直接给出,有效地址只包含位移量。 例: MOV AX,2000H 默
4、认的段寄存器是DS,也可以在指令中使用段超越前缀来指定段寄存器。 例:MOV AL,ES:2000H 有效地址EA=2000H,在指令中直接给出。 物理地址PA=(ES)10H + 2000H,3.1 8086/8088的寻址方式,4、寄存器间接寻址 操作数的地址在对应的寄存器中称为寄存器间接寻址。 EA取自基址寄存器BX,BP或变址寄存器SI,DI 中的一个,操作数在有效地址对应的存储单元中。 以SI, DI, BX间接寻址: 默认操作数在数据段DS中 以BP间接寻址: 默认操作数在堆栈段SS中(可与DS等其他段寄存器形成段超越) 例: MOV AX,BX 若(DS)=1492H,(BX)=
5、2000H 则EA=(BX)=2000H 物理地址PA=14920H+2000H=16920H, 执行(AX)=(16920H),3.1 8086/8088的寻址方式,5、变址寻址 在寄存器间接寻址的基础上再加一个16位的偏移量。 例:MOV AX,SI+COUNT 或 MOV AX, COUNTSI 若COUNT=3000H, (DS)=3000H (SI)=2000H, 则物理地址=35000H,EA=3000H+2000H =5000H PA=30000H+5000H =35000H,3.1 8086/8088的寻址方式,、基址加变址寻址 EA = 基址寄存器(BX或BP)变址寄存器(S
6、I或DI) 16位偏移量 若用BX: 默认操作数在数据段DS中 若用BP: 默认操作数在堆栈段SS中 例: MOV AX, BX+DI+6,3.1 8086/8088的寻址方式,寻址方式的书写格式 1、在方括号内部允许有一个或两个寄存器的名字,如果一对方括号内部有基址寄存器和变址寄存器,使用“”作为连接。 2、在方括号内部允许有位移量,使用或号作为连接符号。 3、在方括号外部允许有位移量,可以在左边或右边。 MOV AX,BX+SI+6 MOV AX,BX+SI6 MOV AX,6BX+SI MOV AX,BXSI6 MOV AX,BX+6SI,3.2 8086/8088的指令系统,Intel
7、 8086/8088指令系统共有117条基本指令,可分成6个功能组: 数据传送类指令 算术运算类指令 逻辑运算类指令 串操作类指令 控制转移类指令 处理器控制类指令,3.2.1数据传送指令,1数据传送MOV指令 一般格式:MOV OPRD1,OPRD2 MOV 是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。 功能:完成数据传送 具体来说,一条MOV数据传送指令能实现: CPU内部寄存器之间数据的任意传送(除了代码段寄存器CS和指令指针IP以外)。 MOV AL,BL;字节传送 MOV CX,BX;字传送 MOV DS,BX,3.2.1数据传送指令, 立即数传送至CPU内部的通用寄
8、存器组(即AX、 BX、CX、DX、BP、SP、SI、DI), MOV CL,4 MOV AX,03FFH MOV SI,057BH CPU内部寄存器(除了CS和IP以外)与存储器(所有寻址方式)之间的数据传送。 MOV AL,2000H MOV AX,SI MOV DI,CX MOV SI,BLOCKBP MOV DS,DATASI+BX MOV DESTBP+DI,ES,3.2.1数据传送指令, 能实现用立即数给存储单元赋值 MOV BYTE PTR 2000H,25H MOV WORD PTR SI,35H,3.2.1数据传送指令,对于MOV 指令应注意几个问题: MOV传送指令中,不允
9、许对CS和IP进行操作; 两个存储器操作数之间不允许直接进行信息传送; 如我们需要把地址(即段内的地址偏移量)为2000H的存储单元的内容,传送至同一段内的地址为3000H的存储单元中去,MOV指令不能直接完成这样的传送,但我们可以CPU内部寄存器为桥梁来完成这样的传送: MOV AL,2000H; MOV 3000H,AL,3.2.1数据传送指令, 两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值; (X) MOV DS, 100H; (X) MOV DS, ES; 目的操作数,不能用立即寻址方式。 MOV指令不影响标志位,3.2.1数据传送指令,2堆栈指令 堆栈:就
10、是一个按后进先出(LIFO)的原则组 织的一般内存区域即堆栈段。用SS指 示段地址。堆栈指针SP总是指向栈 顶(最后压入的数的地址)。SP的初 值规定了所用堆栈的大小(堆栈的深 度),一个 栈的深度最大为64kB 。 堆栈用途: 临时存放数据 传递参数 保存和恢复寄存器,3.2.1数据传送指令, 入栈指令PUSH 一般格式:PUSH OPRD 源操作数可以是CPU内部的16位通用寄存器、段寄存器(CS除外)和内存操作数(所有寻址方式)。入栈操作对象必须是16位数。 功能:将数据压入堆栈 执行步骤为:SP=SP-1; SP=操作数高8位; SP=SP-1; SP= 操作数低8位,3.2.1数据传
11、送指令,例:PUSH BX 执行过程为: SP=SP-1, SP=BH; SP=SP-1, SP=BL,3.2.1数据传送指令,(2) 出栈指令POP 一般格式:POP OPRD 目的操作数可以是CPU内部的16位通用寄存器、段寄存器(CS除外)和内存操作数(所有寻址方式)。出栈操作对象必须是16位数。 功能:将数据弹出堆栈 执行步骤为: 操作数低8位 = SP; SP=SP1; 操作数高8位 = SP; SP=SP+1;,3.2.1数据传送指令,3交换指令 XCHG 一般格式:XCHG OPRD1,OPRD2 功能:完成数据交换。把一个字节或一个字的源操作数与目 的操作数相交换。交换能在通用
12、寄存器之间、通用寄存器与存储器之间进行。但段寄存器和立即数不能作为一个操作数;不能在存储器与存储器之间对换数据。 例: XCHG AL,CL XCHG AX,DI XCHG BX,SI XCHG AX,2000H XCHG DATASI,DH,3.2.1数据传送指令,4累加器专用传送指令 输入输出指令IN , OUT IN指令一般格式: IN AL,n ; ALn IN AX,n ; AXn+1n IN AL,DX ; ALDX IN AX,DX ; AXDX+1DX 功能:从I/O端口输入数据至AL或AX. 输入指令允许把一个字节或一个字由一个输入端口传送到AL或AX中。若端口地址超过255
13、时,则必须用DX保存端口地址,这样用DX作端口寻址最多可寻找64K个端口。,8086/8088通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地址。 8088的对外数据线为8位,只有字节传送指令。 16位输入输出指令中的端口地址只能取偶数。,3.2.1数据传送指令,OUT指令一般格式: OUT n,AL ; ALn OUT n,AX ; AXn+1n OUT DX,AL ; ALDX OUT DX,AX ; AXDX+1DX 功能:将AL或AX的内容输出至I/O端口。 该指令将AL或AX中的内容传送到一个 输出端口。端口寻址方式与IN指令相同。,3.2.1数据传
14、送指令,(2)查表转换指令 格式:XLAT 功能:完成一个字节的查表转换: AL=(DS)16(BX)+(AL) 要求: 寄存器AL的内容作为一个256字节的表的下标; 表的基地址在BX中, 转换后的结果存放在AL中。,3.2.1数据传送指令,例:设(DS)=A000H,(BX)=0010H, 表的起始地址为A0010H,表中放数字0-9的ASCII码 MOV BX,0010H MOV AL,06H XLAT 执行该程序后,(AL)=36H 本指令可用在数制转换、 函数表查表、 代码转换等场合。,A000:0010,30H,31H,A000:0016,36H,3.2.1数据传送指令,5地址传送
15、指令(有三条地址传送指令) LEA (Load Effective Address) 一般格式: LEA OPRD1,OPRD2 功能:把源操作数OPRD2的地址偏移量传送至目的 操作数OPRD1。 要求:源操作数必须是一个内存操作数,目的操 作数必须是一个16位的通用寄存器。这条指令 通常用来建立串操作指令所须的寄存器指针。 例: LEA BX,2000H;把2000H单元的偏移地址 送到BX ,即BX=2000H,3.2.1数据传送指令, LDS (Load pointer into DS) 一般格式: LDS OPRD1,OPRD2 功能:完成一个地址指针的传送。地址指针包括段地址部分和
16、偏移量部分。指令将段地址送入DS,偏移量部分送入一个16位的指针寄存器或变址寄存器。 要求:源操作数是一个内存操作数,目的操作数是一个通用寄存器或变址寄存器。,3.2.1数据传送指令,例:LDS SI,BX ;其中(BX)=2000H;本指令将把BX所指的32位地址指针的段地址部分送入DS,偏移量部分送入SI。 DS:2000 20 2001 69 2002 73 2003 20 DS=0B10H, 执行 LDS SI,BX ,SI = 6920H DS= 2073H,3.2.1数据传送指令, LES (Load pointer into ES) 一般格式: LES OPRD1,OPRD2 这
17、条指令除将地址指针的段地址部分送入ES外,与LDS类似。 例如: LES DI,BX,3.2.1数据传送指令,6标志寄存器传送(有四条标志传送指令) LAHF (LOAD AH WITH FLAG) 将标志寄存器中的S、Z、A、P和C(即低8位)传送至AH寄存器的指定位,空位没有定义。 SAHF (STORE AH WITH FLAG) 将寄存器AH的指定位,送至标志寄存器的S、Z、A、P和C位。根据AH的内容,影响上述标志位,对O、D和I无影响。,3.2.1数据传送指令, PUSHF (PUSH FLAG) 将标志寄存器压入堆栈顶部,同时修改堆栈指针,不影响标志位。 POPF (POP FL
18、AG) 堆栈顶部的一个字,传送到标志寄存器,同时修改堆栈指针,影响标志位。,3.2.2算术运算指令,80868088提供加、减、乘、除四种基本算术操作。这些操作都可用于字节或字的运算,也可以用于带符号数与无符号数的运算。带符号数用补码表示。同时80868088也提供了各种校正操作,故可以进行十进制算术运算。 参与加、减运算的操作数可如下图所示:,3.2.2算术运算指令,1加法指令 (Addition) 一般形式:ADD OPRD1,OPRD2 ; 不带进位的加法 功能:OPRD1OPRD1+OPRD2 完成两个操作数相加,结果送至目的操作数OPRD1。目的操作数可以是累加器,任一通用寄存器以及
19、存储器操作数。 例: ADD AL,30 ;累加器与立即数相加 ADD BX,3000H ;通用寄存器与存储单元内容相加 ADD DI,CX ;通用寄存器之间 ADD DX,DATABX+SI;通用寄存器与存储单元内容相加 ADD BETASI,DX ;存储器操作数与寄存器相加 这些指令对标志位CF、OF、PF、SF、ZF和AF有影响。,3.2.2算术运算指令,一般形式:ADC OPRD1,OPRD2;带进位的加法 功能:OPRD1OPRD1+OPRD2 +CF 这条指令与上条指令类似,只是在两个操作数相加时,要把进位标志CF的现行值加上去,结果送至目的操作数。 ADC指令主要用于多字节运算中
20、。 例:若有两个四字节的数,已分别放在自FIRST和SECOND开始的存储区中,每个数占四个存储单元。存放时,最低字节在地址最低处,则可用以下程序段实现相加。 MOV AX,FIRST ADD AX,SECOND ;进行字运算 MOV THIRD,AX MOV AX,FIRST+2 ADC AX,SECOND+2 MOV THIRD+2,AX 这条指令对标志位的影响与ADD相同。,3.2.2算术运算指令,一般形式:INC OPRD ;增量指令 功能:OPRDOPRD+1 完成对指定的操作数OPRD加1,然后返回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。 这条指令执行的结果影
21、响标志位AF、OF、PF、SF和ZF,而对进位标志CF没有影响。 如:INC AL INC BYTE PTRBX,.2.2算术运算指令,2减法指令(Subtraction) 一般形式:SUB OPRD1,OPRD2 ;不考虑借位 功能:OPRD1OPRD1 - OPRD2 完成两个操作数相减,即从OPRD1中减去OPRD2,结果放在OPRD1中。 例: SUB CX,BX SUB BP,CL 指令对标志位AF、CF、OF、PF、SF和ZF都有影响。 例 说明执行“MOV BX, 4336H; SUB BX,0136H”后对标志位的影响。 解:4336H=0100 0011 0011 0110;
22、(-0136H)原=1000 0001 0011 0110; (-0136H)补=1111 1110 1100 1010 0100 0011 0011 0110 0100 0011 0011 0110 + 1111 1110 1100 1010 - 0000 0001 0011 0110 0100 0010 0000 0000 0100 0010 0000 0000 结果对比发现:两种计算结果值相同,标志位OF=ZF=SF=0,PF=1也相同,但CF、AF却相反,标志CF=0,AF=0的值正确的;所以若采用补码求和代替减法运算,要把CF、AF的结果值求反后作为最终结果,而其他值保持不变。,3.
23、2.2算术运算指令,一般形式:SBB OPRD1,OPRD2 ;考虑借位 功能:OPRD1OPRD1-OPRD2-CF 这条指令与SUB类似,只是在两个操作数相减时,还要减去借位标志CF的现行值 指令对标志位AF、CF、OF、PF、SF和ZF都有影响。 同ADC指令一样,本指令主要用于多字节操作数相减。 注意:若两个带符号数采用补码运算时,若CS表示最高位(符号位)的进位(对加法)或借位(对减法)(有进位或者借位时CS=1,否则为0);而CP表示数值部分最高位的进位(对加法)或借位(对减法)(有进位或者借位时CP=1,否则为0);当CS不等于CP时,结果产生溢出(OF=1),否则不产生溢出(O
24、F=0) ,即OF CS CP 。,3.2.2算术运算指令,形式:DEC OPRD;减量 功能:OPRDOPRD-1 对指令的操作数减1,然后送回此操作数,在相减时,把操作数作为一个无符号二进制数来对待。指令执行的结果,影响标志AF、OF、PF、SF和ZF但对CF标志不影响(即保持此指令以前的值)。 例: DEC BYTE PTRSI DEC CL,3.2.2算术运算指令,形式:NEG OPRD;求补 功能: (NEGDate) 对操作数OPRD取补: 相当于 用零减去操数,再把结果送回操作数。(也就是已知负数的补码求负数原码的绝对值或已知负数原码的绝对值求其补码的运算。) 例: NEG AL
25、 若AL00111100,则取补后为11000100(即00000000011110011000100,也就是求绝对值为00111100的负数的补码) 若在字节操作时对-128,或在字操作时对-32768取补,则操作数没变化,但标志OF置位。此指令影响标志AF、CF、OF、PF、SF和ZF。此指令的结果一般总是使标志CF=1(总有借位),除非在操作数为零时,才使CF=0。,3.2.2算术运算指令,形式:CMP OPRD1,OPRD2 (比较指令) 功能: OPRD1-OPRD2 比较指令完成两个操作数相减,使结果反映在标志位上,但并不送回结果(即不带回送的减法)。 例: CMP AL,100
26、CMP DX,DI 比较指令主要用于比较两个数之间的关系。在比较指令之后,根据ZF标志即可判断两者是否相等。,相等的比较: 若两者相等,相减以后结果为零,ZF标志为1,否则为0。 若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的大小。 大小的比较: 如果是两个无符号数(如CMP AX,BX)进行比较,则可以根据CF标志的状态判断两数大小。若结果没有产生借位(CF=0),显然AXBX;若产生了借位(即CF1),则AXBX。,3.2.2算术运算指令,带符号数比较: 例:比较54与24的大小 解: 54-24=54+(-24) -24补=11101000,54补=00110110 0
27、0110110 + 11101000 100011110 OF=0,SF=0,则被减数减数,即54 24 例:比较120与-74的大小 解:120-(-74)=120+74 01111000 - 01001010 011000010 OF=1,SF=1,则被减数减数,即120 -74,对有符号数的比较操作,若与的值相同,则被减数大于等于减数大,否则被减数小于减数小.,3.2.2算术运算指令,例:比较24与54的大小 解:24-54=24+(-54) 00011000 24的补码 + 11001010 -54的补码 11100010 OF=0,SF=1,则被减数减数,即24 54 例:比较-24
28、与120的大小 解:-24-120=-24补+ -120补 11101000 = -24补 + 10001000 = -120补 101110000 OF=1,SF=0,则被减数减数,即-24 120,对有符号数的比较操作,若与的值相同,则被减数大于等于减数大,否则被减数小于减数小.,3.2.2算术运算指令,3乘法指令 (1) 无符号乘法指令MUL 格式: MUL OPRD 完成字节与字节相乘、字与字相乘,且默认的操作数放在AL或AX中,而源操作数由指令给出。8位数相乘,结果为16位数,放在AX中;16位数相乘结果为32位数,高16位放在DX,低16位放在AX中。注意:源操作数不能为立即数。当
29、结果的高半部分不为0, 即(AH)0或(DX) 0,则CF=1,OF=1;否则CF=0,OF=0。 例如: MOV AL,FIRST; MUL SECOND ; 结果为AX=FIRST*SECOND MOV AX,THIRD; MUL AX ; 结果为DX:AX=THIRD*THIRD,(2) 带符号数乘法指令IMUL 格式: IMUL OPRD 同MUL一样可以进行字节与字节、字和字的乘法运算。结果放在AX或DX,AX中。当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位1,否则CF=0,OF=0.,对乘法运算, 及不确定,3.2.2算术运算指令,4除法指令 (1) 无符
30、号数除法指令 DIV 格式:DIV OPRD (2) 带符号数除法IDIV 格式:IDIV OPRD 该指令执行过程同DIV指令,但IDIV指令认为操作数的最高位为符号位,除法运算的结果商的最高位也为符号位 ,且余数的符号要与被除数相同。,在除法指令中,在字节运算时被除数在AX中;运算结果商在AL中,余数在AH中。字运算时被除数为DX:AX构成的32位数,运算结果商在AX中,余数在DX中。 例如:AX=2000H,DX=200H,BX=1000H,则 DIV BX执行后,AX=2002H ,DX=0000。 除法运算中,源操作数可为除立即寻址方式之外的任何一种寻址方式,且指令执行对所有的标志位
31、都无定义。IDIV运算时,若商超正常范围(如-128 - +127,或 -32768 - +32767),则产生0号中断。,3.2.2算术运算指令,例:设(AX)=0400H,(BL)=0B4H 即(AX)为无符号数的1024D,带符号数的+1024D (BL)为无符号数的180D,带符号数的-76D 执行 DIV BL的结果是:(AH)=7CH=124D 余数 (AL)=05H=5D 商 执行 IDIV BL的结果是:(AH)=24H=36D 余数 (AL)=0F3H=-13D 商,3.2.2算术运算指令,(3) 字节扩展指令CBW 格式:CBW 该指令执行时将AL寄存器的最高位扩展到AH,
32、即若D7=0,则AH=0;否则AH=0FFH。 (4) 字扩展指令CWD 格式:CWD 该指令执行时将AX寄存器的最高位扩展到DX,即若D15=0,则DX=0;否则DX=0FFFFH。 CBW、CWD指令操作不影响标志位。但这两条指令均为对带符号数符号位的扩展,若进行相除的数为无符号数,但需要扩展时,则在执行相应位扩展指令后,只需再将AH/DX中相应的扩展位清0即可。,字节与字扩展指令的用途:由于除法指令中的字节运算要求被除数为16位数,而字运算要求被除数是32位数,在8086/8088系统中往往需要用符号扩展的方法取得被除数所要的格式,因此指令系统中包括这两条符号扩展指令。,3.2.2算术运
33、算指令,5十进制调整指令 计算机中的算术运算,都是针对二进制数的运算,而人们在日常生活中习惯使用十进制。为此在8086/8088系统中,针对十进制算术运算有一类十进制调整指令。 在计算机中人们用BCD码表示十进制数,对BCD码计算机中有两种表示方法:一类为压缩(组合)BCD码,即规定每个字节表示两位BCD数;另一类称为非压缩(组合)BCD码,即用一个字节表示一位BCD数,在这字节的高四位用0填充。例如,十进制数25D,表示为压缩BCD数时为:25H;表示为非压缩BCD数时为:0205H,用两字节表示。,3.2.2算术运算指令,例:ADD AL,BL DAA 若执行前:AL=28H,BL=68H
34、,则执行ADD后:AL=90H,AF=1;再执行DAA指令后,正确的结果为:AL=96H,CF=0,AF=1。 例: MUL BL AAM 若执行前:AL=07,BL=09,则执行MUL BL 后,AX=003FH,再执行AAM指令后,正确的结果为:AH=06H,AL=03H。 注意:BCD码进行乘除法运算时,一律使用无符号数形式。 DAA/DAS指令对OF无定义,只影响其它条件标志; AAA/AAS指令只影响AF和CF标志;AAM/AAD指令对OF、AF和CF无定义,只影响SF、PF和ZF标志。,十进制调整指令一览表,3.2.3逻辑运算和移位指令,1逻辑运算指令 (1) 一般格式:NOT O
35、PRD 功能:对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。 例: NOT AX 执行前:( AX)=0000 0101 0000 0011=0503H 执行后 :(AX)=1111 1010 1111 1100=FAFCH,3.2.3逻辑运算和移位指令,(2) 一般格式:AND OPRD1,OPRD2 功能:对两个操作数进行按位的逻辑“与”运算,结果送回目 的操作数。其中目的操作数OPRD1可以是累加器、任一通用寄存器,或内存操作数(所有寻址方式)。源操作数OPRD2可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。 8086/8088的AND指令可
36、以进行字节操作,也可以进行字操作。 例: AND AL,0FH ;AL高4位置0,低4位保持不变 AND SI,0 ;将SI清0,3.2.3逻辑运算和移位指令,(3) 一般格式:TEST OPRD1,OPRD2 功能:完成与AND指令相同的操作,结果反映在标志位上,但并不送回。通常使用它进行测试: 例: 若要检测 AL中的最低位是否为1,为1则转移。可用以下指令: TEST AL,01H JNZ THERE :结果不为零(ZF=0)转移 THERE: 例:若要检测CX中的内容是否为0,为0则转移。该如何做呢? TEST CX,0FFFFH JZ THERE :结果为零(ZF=1)转移 THER
37、E:,3.2.3逻辑运算和移位指令,(4) 一般格式:OR OPRD1,OPRD2 功能:对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。其中,目的操作数OPRD1,可以是累加器,可以是任通用寄存器,也可以是一个内存操作数(所有寻址方式)。源操作数OPRD2,可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。 例: AND AL, 0FH AND AH,0F0H OR AL,AH OR AX,0FFFH ;将AX低12位置1,3.2.3逻辑运算和移位指令,(5) 一般格式:XOR OPRD1,OPRD2 功能:对两个指定的操作数进行“异或”运算,结果送回目的操作数。 其中,目
38、的操作数OPRD1可以是累加器,可以是任一个通用寄存器,也可以是一个内存操作数(全部寻址方式)。源操作数可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。 例: XOR AL,AL ;使AL清0 XOR CL,0FH ;使低4位取反,高4位不变 逻辑运算类指令中,单操作数指令NOT的操作数不能为立即数,双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,且目的操作数不能为立即数。它们对标志位的影响情况如下:NOT不影响标志位,其它四种指令将使CF=OF=0,AF无定义,而SF、ZF和PF则根据运算结果而定。,3.2.3逻辑运算和移位指令,2移位指令 (1)算术/逻辑移位指令 算术左移
39、或逻辑左移指令 SALSHL OPRD,M 算术右移指令 SAR OPRD,M 逻辑右移指令 SHR OPRD,M M是移位次数,可以是1或寄存器CL 这些指令可以对寄存器操作数或内存操作数进行指定的移位,可以进行字节或字操作;可以一次只移1位,也可以移位由寄存器CL中的内容规定的次数。 例: SAL AX, 1 SAL AX, CL,3.2.3逻辑运算和移位指令,(2)循环移位指令 ROL OPRD,M ;左循环移位 ROR OPRD,M ;右循环移位 RCL OPRD,M ;带进位左循环移位 RCR OPRD,M ;带进位右循环移位,3.2.3逻辑运算和移位指令,前两条循环指令,未把标志位
40、CF包含在循环的环中,后两条把标志位CF包含在循环的环中,作为整个循环的一部分。 循环指令可以对字节或字进行操作。操作数可以是寄存器操作数,也可以是内存操作数。可以是循环移位一次,也可以循环移位由CL的内容所决定的次数。 左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2。右移位相当于除以2.,3.2.3逻辑运算和移位指令,算数移位指的是对带符号数进行移位,而逻辑移位是对无符号数移位,对于算数右移要保持符号位不变,而逻辑移位用“0”来填补已空出的位。并根据移位操作的结果置标志寄存器中的状态标志(AF标志除外)。若移位位数是1位,移位结果使最
41、高位(符号位)发生变化,则将溢出标志OF置“1”;若移多位,则OF标志将无效。 而对于循环移位指令则只影响CF和OF标志。CF标志总是保持移出的最后一位的状态;OF同前面所述。,3.2.3逻辑运算和移位指令,例:在数的输入输出过程中乘10的操作是经常要进行的。而X*10=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,3.2.3逻辑运算和移位指令,例: BCD码转换为ASC
42、II码 若在内存某一缓冲区中(2000H)存放着30个单元的用BCD码表示的十进制数。每个单元中放两位BCD码,要求把它们分别转换为ASCII码。高位的BCD码转换完后放在地址较高的单元。 分析:转换公式:ASCIIBCD+30H 算法:源串和目的串的表首分别设两个指针。 取BCD转ASCII后存入 (先低位,后高位)。,2000H,3000H,85H,35H,38H,3.2.3逻辑运算和移位指令,MOV SI,2000H ;源地址指针 MOV CX, 30 ;计数初值 MOV DI,3000H ;目的地址指针 LP: MOV AL,SI MOV BL,AL AND AL, 0FH ;低位BC
43、D码 OR AL, 30H;转换成ASCII MOV DI, AL ;存入 INC DI ;修改指针 MOV AL,BL,PUSH CX MOV CL,4 SHR AL,CL OR AL,30H ;高位 MOV DI,AL POP CX INC DI INC SI ;修改指针 LOOP LP ;重复工作,3.2.4串操作类指令,串操作类指令可以用来实现内存区域的数据串操作。这些数据串可以是字节串,也可以是字串。 源操作数用寄存器SI寻址,默认在数据段DS中。 目的操作数用寄存器DI寻址,默认在附加段ES中。 字串长度默认在CX中,存取或搜索的值默认在AL中。 每执行一次串操作指令,SI和DI将
44、自动修改: 1(对于字节串)或2(对于字串) 执行指令CLD指令后,DF = 0,地址指针增1或2 执行指令STD指令后,DF = 1,地址指针减1或2,3.2.4串操作类指令,1重复指令前缀 串操作类指令可以与重复指令前缀配合使用。从而可以使操作得以重复进行,及时停止。重复指令前缀的几种形式见下表:,3.2.4串操作类指令,2串指令 MOVS指令(move string) 功能:把数据段中由SI间接寻址的一个字节(或一个字)传送到附加段中由DI间接寻址的一个字节单元(或一个字单元)中去,然后,根据方向标志DF及所传送数据的类型(字节或字)对SI及DI进行修改,在指令重复前缀REP的控制下,可
45、将数据段中的整串数据传送到附加段中去。该指令不影标志位。,3.2.4串操作类指令,例: 在数据段中有一字符串,其长度为17,要求把它们传送 到附加段中的一个缓冲区中,其中源串存放在数据段中 从符号地址MESS1开始的存储区域内,每个字符占一个 字节;MESS2为附加段中用以存放字符串区域的首地址。 实现上述功能的程序段如下: LEA SI,MESS1 ;置源串偏移地址 LEA DI,MESS2 ;置目的串偏移地址 MOV CX,17 ;置串长度 CLD ;方向标志复位 REP MOVSB ;字符串传送,3.2.4串操作类指令, CMPS指令(compare string) 功能:把数据段中由S
46、I间接寻址的一个字节(或一个字)与附加段中由DI间接寻址的一个字节(或一个字)进行比较操作,使比较的结果影响标志位,然后根据方向标志DF及所进行比较的操作数类型(字节或字)对SI及DI进行修改,在指令重复前缀REPE/REPZ或者REPNE/REPNZ的控制下,可在两个数据串中寻找第一个不相等的字节(或字),或者第一个相等的字节(或字)。,3.2.4串操作类指令,例: 在数据段中有一字符串,其长度为17,存放在数据段中从符号地址MESS1开始的区域中;同样在附加段中有一长度相等的字符串,存放在附加段中从符号地址MESS2开始的区域中,现要求找出它们之间不相匹配的位置。 实现上述功能的程序段如下
47、; LEA SI,MESS1 ;装入源串偏移地址 LEA DI,MESS2 ;装入目的串偏移地址 MOV CX,17 ;装入字符串长度 CLD ;方向标志复位 REPE CMPSB 该程序段执行之后,SI或DI的内容即为两字符串中第一个不匹配字符的下一个字符的位置。若两字符串中没有不匹配的字符则当比较完毕后,CX0,退出重复操作状态。,3.2.4串操作类指令, SCAS指令(scan string) 功能:用由指令指定的关键字节或关键字(分别存放在AL及AX 寄存器中),与附加段中由DI间接寻址的字节串(或字串)中的一个字节(或字)进行比较操作,使比较的结果影响标志位,然后根据方向标志DF及所进行操作的数据类型(字节或字) 对DI进行修改,在指令重复前缀REPE/REPZ或REPNE/REPNZ的控制下,可在指定的数据串中搜索第一个与关键字节(或字)匹配的字节(或字),或者搜索第一个与关键字节(或字)不匹配的字节(或字)。,3.2.4串操作类指令,例:在附加段中有一个字符串,存放在以符号地址MESS2开始的区域中,长度为17,要求在该字符串中搜索空格符(ASCII码为20H)。 实现上述功能的程序段如下: LEA DI,MESS2 ;装入目的串偏移地址 MOV AL,20H ;装入关键字节 MOV CX,17 ;装入字符串长度 CLD
链接地址:https://www.31doc.com/p-3195581.html