汇编语言指令格式_第1页
汇编语言指令格式_第2页
汇编语言指令格式_第3页
汇编语言指令格式_第4页
汇编语言指令格式_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

1汇编语言指令格式由4部分组成:标号表示该指令在主存中的逻辑地址,每个指令助记符就代表一种指令,目的操作数和源操作数表示参与操作的对象,注释通常是对该指令或这段程序功能的说明。标号:指令助记符目的操作数,源操作数;注释2指令操作数的泛指表示r8 ——泛指8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DL

r16 ——泛指16位通用寄存器AX/BX/CX/DX/SI/DI/BP/SP

reg ——泛指r8或r16seg ——泛指段寄存器CS/DS/ES/SSm8 ——泛指8位存储器操作数单元(包括所有寻址方式)

m16 ——泛指16位存储器操作数单元(包括所有寻址方式)

mem ——泛指m8或m16i8 ——泛指8位立即数

i16 ——泛指16位立即数

imm ——泛指i8或i16dest——泛指目的操作数

src ——泛指源操作数38088指令系统概述Intel8088指令系统共有117条基本指令,可分成以下6类:①数据传送类指令②算术运算类指令③位操作类指令④串操作类指令⑤控制转移类指令⑥处理机控制类指令4学习指令的注意事项指令功能——该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式。指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式。指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响。其他——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等。52.3数据传送类指令把数据从一个位置传送到另一个位置 1、通用数据传送: MOV/XCHG/XLAT

2、堆栈操作: PUSH/POP

3、标志操作:CLC/STC/CMC/CLD/STD/CLI/STI

4、地址传送: LEA/LDS/LES6本节要求数据传送是计算机中最基本、最重要的一种操作。传送指令也是最常使用的一类指令。传送指令把数据从一个位置传送到另一个位置。除标志寄存器传送指令外,均不影响标志位重点掌握:MOV/PUSH/POP特别熟悉:

XCHG/XLAT/LEA72.3.1通用数据传送指令MOV,XCHG,XLAT8传送指令MOV传送指令把一个字节/字操作数从源地址传送至目的地址MOVreg/mem,imm;立即数送寄存器或主存:MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存:MOVreg/seg,mem ;主存送(段)寄存器:MOVreg/mem,seg ;段寄存器送寄存器或主存:传送指令不是万能的,应避免非法传送.9立即数传送moval,4 ;al←4,字节传送movdx,0ffh ;dx←00ffh,字传送movsi,200h ;si←0200h,字传送mov

byteptr

[si],0ah

;ds:[si]←0ah,byteptr

说明是字节操作mov

wordptr

[si+2],0bh

;ds:[si+2]←0bh,wordptr

说明是字操作

注意立即数是字节还是字,即明确指令是字节操作还是字操作。10寄存器传送mov

ax,bxmovah,almov

ds,axmov[bx],al11存储器传送mov

al,[bx] ;al←ds:[bx]mov

dx,[bp] ;dx←ss:[bp]mov

es,[si] ;es←ds:[si]注意:不存在存储器向存储器的传送指令12段寄存器传送mov[si],dsmov

ax,esmov

ds,ax

注意:对段寄存器的操作有一些限制13非法传送种种两个操作数的类型不一致例如源操作数是字节,而目的操作数是字;或相反两个操作数不能都是存储器传送指令很灵活,但主存之间的直接传送却不允许段寄存器的操作有一些限制段寄存器属专用寄存器,对他们的操作能力有限14两个操作数的类型要一致绝大多数双操作数指令(包括传送指令),除非特别说明,目的操作数与源操作数必须类型一致,或者同为字,或者同为字节,否则为非法指令。

MOVAL,050AH

;非法指令:050Ah为字,而AL为字节寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型。对于存储器单元与立即数同时作为操作数的情况,必须显式指明。byteptr指示字节类型,wordptr指示字类型。15两个操作数不能都是存储器8086指令系统不允许两个操作数都是存储单元(除串操作指令),没有主存至主存的数据传送。要实现这种传送,可通过寄存器间接实现。例:buffer1单元的数据传送到buffer2单元

movax,buffer1 ;ax←buffer1(将buffer1内容送ax)

movbuffer2,ax ;buffer2←ax

这里buffer1和buffer2是两个字变量,实际表示直接寻址方式16段寄存器的操作有一些限制不允许立即数传送给段寄存器

MOVDS,100H ;非法,立即数不能传送段寄存器不允许直接改变CS值

MOVCS,[SI] ;不允许使用的指令不允许段寄存器之间的直接数据传送

MOVDS,ES

;非法,不允许段寄存器间传送17交换指令XCHG把两个地方的数据进行互换

XCHGreg,reg/mem ;reg←→reg/mem

可以在寄存器与寄存器之间交换数据 可以在寄存器与存储器之间交换数据

不能在存储器与存储器之间交换数据18寄存器与寄存器数据交换movax,1234h ;ax=1234hmovbx,5678h ;bx=5678hxchg

ax,bx ;ax=5678h,bx=1234hxchgah,al ;ax=7856h19寄存器与存储器数据交换xchgax,[2000h]xchgal,[2000h]20换码指令XLAT将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL XLAT ;al←ds:[bx+al]:换码指令执行前:要求在主存中建立一个字节表格,内容是要转换成的目的代码,表格的首地址存放于BX,AL存放相对表格首地址的位移量换码指令执行后:将AL寄存器的内容转换为目标代码21代码转换movbx,100hmoval,03hxlat

换码指令使用了隐含寻址的方式,它没有显式的操作数,但使用了BX和AL;

隐含寻址方式——采用默认操作数的寻址方式。222.3.2堆栈操作指令堆栈的概念堆栈的操作:进栈和出栈堆栈的特点PUSHr16/m16/seg;进栈指令:;SP←SP-2;SS:[SP]←r16/m16/segPOPr16/m16/seg;出栈指令:;r16/m16/seg←SS:[SP];SP←SP+223什么是堆栈堆栈是一个“先进后出”的主存区域,位于堆栈段中,使用SS段寄存器记录其段地址。堆栈只有一个出口,即当前栈顶。栈顶是地址较小的一端(低端),它用堆栈指针寄存器SP指定。24堆栈的操作堆栈只有两种基本操作:进栈和出栈,用户操作堆栈对应两条指令PUSH和POP。进栈指令PUSH:进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部出栈指令POP:

出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加225堆栈的实例和图例movax,7812Hpushaxpopax26堆栈的特点堆栈操作(进栈/出栈)的单位是字(双字节)数据从压栈和弹出时,都是“低对低,高对高”堆栈操作遵循先进后出原则可用存储器寻址随机存取堆栈中的数据堆栈常用来临时存放数据、传递参数、保存和恢复寄存器27现场的保护和恢复pushax ;进入子程序后pushbxpushds...popds ;返回主程序前popbxpopax282.3.3标志操作指令标志操作指令能够读写标志寄存器的内容29标志低字节出/入AH指令LAHF ;AH←FLAGS的低字节(出标志)LAHF指令将标志寄存器的低字节送寄存器AHSF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意SAHF

;FLAGS的低字节←AHSAHF将AH寄存器内容送FLAGS的低字节用AH的第7/6/4/2/0位相应设置SF/ZF/AF/PF/CF标志30标志寄存器出/入堆栈指令PUSHF;SP←SP-2;SS:[SP]←FLAGSPUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2POPF;FLAGS←SS:[SP];SP←SP+2POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2312.3.4地址传送指令LEA,LDS,LES32有效地址传送指令LEA将存储器操作数的有效地址传送至指定寄存器中

LEAr16,mem ;r16←mem的有效地址

例2.13:有效地址的获取

movbx,0400h

movsi,3ch

lea

bx,[bx+si+0f62h] ;BX=139EH

BX得到的是主存单元的有效地址EA(偏移地址)不是该单元的内容。33指针传送指令LDSr16,mem;r16←mem,;DS←mem+2LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器LESr16,mem;r16←mem,;ES←mem+2LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器34例:地址指针的传送movwordptr[3060h],0100hmovwordptr[3062h],1450hldssi,[3060h] ;ds=1450h,si=0100hlesdi,[3060h] ;es=1450h,di=0100h ;mem指定主存的连续4个字节作为逻辑地址(32位的地址指针),送入DS:reg或ES:reg。35输入输出指令INAL/AX,i8/DX;AL/AX←I/O端口输入IN指令将外设数据传送给CPU内的AL/AXOUTi8/DX,AL/AX;I/O端口←AL/AX输出OUT指令将CPU内的AL/AX数据传送给外设8086通过输入输出指令与外设进行数据传送362.4算术运算类指令实现二进制/BCD码数据的四则运算1、加法运算:ADD/ADC/INC2、减法运算:SUB/SBB/DEC/NEG/CMP3、乘法运算:MUL/IMUL4、除法运算:DIV/IDIV5、符号扩展:CBW/CWD6、十进制调整:DAA/DAS/AAA/AAS/AAM/AAD37本节要求四则运算是计算机经常进行的一种操作。算术运算指令也是经常使用的一类指令。请注意算术运算指令对标志的影响重点掌握:ADD/ADC/SUB/SBB/INC/DEC/CMP比较熟悉:

NEG/MUL/IMUL/DIV/IDIV一般了解:CBW/CWD认真理解:DAA/DAS/AAA/AAS/AAM/AAD38加法指令ADDADD指令将源与目的操作数相加,结果送到目的操作数。按状态标志的定义相应设置0或1。 ADDreg,imm/reg/mem;reg←reg+imm/reg/mem ADDmem,imm/reg ;mem←mem+imm/regADD指令的相关指令:ADC

SUB加法实例39例:加法运算movax,7348h ;ax=7348haddal,27h ;ax=736fh

OF=0、SF=0、ZF=0、PF=1、CF=0addax,3fffh ;ax=0b36eh OF=1、SF=1、ZF=0、PF=0、CF=040带进位加法指令ADCADC指令将源与目的操作数相加,再加上当前进位CF标志,结果送到目的操作数。按状态标志的定义相应设置0或1。 ADCreg,imm/reg/mem;reg←reg+imm/reg/mem+CF ADCmem,imm/reg ;mem←mem+imm/reg+CFADC指令主要与ADD配合,实现多精度加法运算。ADC指令的相关指令:ADD

SBB41例:无符号双字加法运算movax,4652h ;ax=4652haddax,0f0f0h ;ax=3742h,CF=1movdx,0234h ;dx=0234hadcdx,0f0f0h ;dx=f325h,CF=0上述程序完成: ;DX.AX=02344652H ;+ F0F0F0F0H ;= F3253742H42增量指令INCINC指令对操作数加1(增量)。INC指令不影响进位CF标志,按定义设置其他状态标志。

INCreg/mem

;reg/mem←reg/mem+1INC指令和DEC指令都是单操作数指令。主要用于对计数器和地址指针的调整。

incbx incbyteptr[bx]相关指令:DEC43减法指令SUBSUB指令将目的操作数减去源操作数,结果送到目的操作数。按照定义相应设置状态标志。

SUBreg,imm/reg/mem;reg←reg-imm/reg/mem SUBmem,imm/reg ;mem←mem-imm/regSUB指令的相关指令:SBB

ADD44例:减法运算movax,0b36eh ;ax=b36ehsubah,0f0h ;ax=c36eh OF=0、SF=1、ZF=0、PF=1、CF=1movwordptr[200h],0ef00h ;[200h]=ef00hsub[200h],ax ;[200h]=2b92h OF=0、SF=0、ZF=0、PF=0、CF=0subsi,si ;si=0 OF=0、SF=0、ZF=1、PF=1、CF=045带借位减法指令SBBSBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。按照定义相应设置状态标志。

SBBreg,imm/reg/mem ;reg←reg-imm/reg/mem-CF SBBmem,imm/reg ;mem←mem-imm/reg-CFSBB指令主要与SUB配合,实现多精度减法运算。SBB指令的相关指令:SUB

ADC46例:无符号双字减法运算movax,4652h ;ax=4652hsubax,0f0f0h ;ax=5562h,CF=1movdx,0234h ;dx=0234hsbbdx,0f0f0h ;dx=1143h,CF=1上述程序完成:

;DX.AX=02344652H ;- F0F0F0F0H ;= 11435562H47减量指令DECINC指令对操作数减1(减量)。DEC指令不影响进位CF标志,按定义设置其他状态标志。

DECreg/mem ;reg/mem←reg/mem-1INC指令和DEC指令都是单操作数指令。主要用于对计数器和地址指针的调整。

dec

si

decbyteptr[si]相关指令:INC48求补指令NEGNEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数。求补运算也可以表达成:将操作数按位取反后加1。NEG指令对标志的影响与用零作减法的SUB指令一样

NEGreg/mem

;reg/mem←0-reg/mem易混淆指令:NOT49例:求补运算movax,0ff64hnegal

;ax=ff9ch OF=0、SF=1、ZF=0、PF=1、CF=1subal,9dh

;ax=ffffh OF=0、SF=1、ZF=0、PF=1、CF=1negax

;ax=0001h OF=0、SF=0、ZF=0、PF=0、CF=1decal

;ax=0000h OF=0、SF=0、ZF=1、PF=1、CF=1negax

;ax=0000h OF=0、SF=0、ZF=1、PF=1、CF=050比较指令CMPCMP指令将目的操作数减去源操作数,按照定义相应设置状态标志。CMP指令执行的功能与SUB指令,但结果不回送目的操作数。

CMPreg,imm/reg/mem

;reg-imm/reg/mem

CMPmem,imm/reg

;mem-imm/reg相关指令:SUB类似指令:TEST51例:比较AL是否大于100cmpal,100 ;al-100jbbelow ;al<100,跳转到below执行subal,100 ;al≥100,al←al-100incah ;ah←ah+1below: ...

执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等。所以,CMP指令后面常跟条件转移指令,根据比较结果不同产生不同的分支。52乘法指令MULr8/m8;无符号字节乘法;AX←AL×r8/m8MULr16/m16;无符号字乘法;DX.AX←AX×r16/m16IMULr8/m8;有符号字节乘法;AX←AL×r8/m8IMULr16/m16;有符号字乘法;DX.AX←AX×r16/m1653乘法指令的功能乘法指令分无符号和有符号乘法指令:MUL和IMUL乘法指令的一个源操作数显式给出,另一个操作数隐含使用AL/AX,目标操作数为AX/DX.AX。字节量相乘:AL与r8/m8相乘,得到16位的结果,存入AX中;字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX中。乘法指令利用OF和CF判断乘积的高一半是否具有有效数值。54乘法指令对标志的影响乘法指令如下影响OF和CF标志:MUL

指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1。IMUL

指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1。乘法指令对其他状态标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1)。

对标志没有影响是指令的执行不改变标志的状态。55无符号和有符号数的乘法运算(例2.21)moval,0b4h;al=b4h=180

movbl,11h;bl=11h=17mul

bl;ax=Obf4h=3060,;OF=CF=1;AX高8位不为0moval,0b4h

;al=b4h=-76movbl,11h;bl=11h=17imul

bl;ax=faf4h=-1292,;OF=CF=1;AX高8位含有效数字操作56除法指令DIVr8/m8 ;无符号字节除法:AX÷r8/m8 AL←商,Ah←余DIVr16/m16

;无符号字除法:DX.AX÷r16/m16

AX←商,DX←余IDIVr8/m8

;有符号字节除法:AX÷r8/m8 AL←商,Ah←余IDIVr16/m16

;有符号字除法:DX.AX÷r16/m16

AX←商,DX←余57除法指令的功能除法指令分无符号和有符号除法指令:DIV和IDIV除法指令的除数显式给出(隐含使用一个操作数AX和DX作为被除数)。字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH;字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX。除法指令对标志没有定义。除法指令会产生结果溢出58除法错中断当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断——除法错中断。对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出。 对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,或者在字除时商不在-32768~32767范围内,则发生除法溢出。59无符号和有符号数的除法运算(例2.22)movax,0400h;ax=400h=1024movbl,0b4h;bl=b4h=180divbl;商al=05h=5;余ah=7ch=124movax,0400h;ax=400h=1024movbl,0b4h;bl=b4h=-76idiv

bl;商al=f3h=-13;余ah=24h=36操作60符号扩展指令CBW

;AL的符号扩展至AH ;如AL的最高有效位是0,则AH=00;AL的最高有效位为1,则AH=FFH。AL不变。CWD

;AX的符号扩展至DX ;如AX的最高有效位是0,则DX=00;AX的最高有效位为1,则DX=FFH。AX不变。什么是符号扩展符号扩展指令常用于获得倍长的数据,如被除数符号扩展指令不影响标志位实例介绍61符号扩展的概念符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。符号扩展不改变数据大小。例如:对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100)。对于数据ff00H(表示有符号数-256),其最高位D15为1,符号扩展后高16位都是1,成为ffffff00H(仍表示有符号数-256)。62例2.23:符号扩展moval,80h ;al=80hcbw ;ax=ff80haddal,255 ;al=7fhcbw ;ax=007fh63例2.24:有符号数除法AX÷BXcwdidiv

bx本例中,利用符号扩展指令得到了除法指令所需要的倍长于除数的被除数DX.AX。

对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数。

64十进制调整指令十进制数调整指令对BCD码运算的结果进行十进制调整,以得到正确的BCD码运算结果。

BCD码运算分压缩和非压缩两种,它们的调整方法不同。压缩BCD码:一个字节中容纳两个BCD码,其范围为:00H~99H。非压缩BCD码: 一个字节中仅容纳1个BCD码,其范围为:00H~09H。65BCD码一位十进制数用4位二进制编码来表示:二进制编码的十进制数(BCD:BinaryCodedDecimal)

常用的是BCD码是8421BCD码,它用4位二进制编码中的0000~1001来表示“0”~“9”这10个数码。8086支持压缩BCD码和非压缩BCD码的调整运算。真值8(1位十进制)64(2位十进制) 二进制编码08H

40H

压缩BCD码08H

64H

非压缩BCD码08H

0604H66压缩BCD码加/减调整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8) DAA

;AL←将AL的加和调整为压缩BCD码(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8) DAS

;AL←将AL的减差调整为压缩BCD码使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令DAA和DAS指令对OF标志无定义,其他标志受影响,例如CF反映压缩BCD码相加或减的进位或借位状态请看实例67压缩BCD码的加减运算实现压缩BCD码加法:68+28=96

moval,68h ;al=68h,压缩BCD码表示真值68movbl,28h ;bl=28h,压缩BCD码表示真值28addal,bl ;二进制加法:al=68h+28h=90hdaa ;十进制调整:al=96h

实现压缩BCD码减法:68-28=40moval,68h ;al=68h,压缩BCD码表示真值68movbl,28h ;bl=28h,压缩BCD码表示真值28subal,bl ;二进制减法:al=68h-28h=40hdas ;十进制调整:al=40h操作68非压缩BCD码加、减调整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8) AAA

;AL←将AL的加和调整为非压缩BCD码 ;AH←AH+调整的进位(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8) AAS

;AL←将AL的减差调整为非压缩BCD码 ;AH←AH-调整的借位使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令AAA和AAS指令在调整中产生了进位或借位,则AH要加上进位或减去借位,同时CF=AF=1,否则CF=AF=0;他们对其他标志无定义请看实例69非压缩BCD码的加减运算实现非压缩BCD码加法:68+9=77movax,0608h ;ax=0608h,非压缩BCD码表示真值68movbl,09h ;bl=09h,非压缩BCD码表示真值9addal,bl ;二进制加法:al=08h+09h=11haaa ;十进制调整:ax=0707h实现非压缩BCD码减法:68-09=59movax,0608h ;ax=0608h,非压缩BCD码表示真值68movbl,09h ;bl=09h,非压缩BCD码表示真值9subal,bl ;二进制减法:al=08h-09h=ffhaas ;十进制调整:ax=0509h操作70非压缩BCD码乘、除调整指令(MULr8/m8) AAM

;AX←将AX的积调整为非压缩BCD码(DIVr8/m8) AAD

;AX←将AX中的商调整为非压缩BCD码AAM指令跟在字节乘MUL之后,将乘积调整为非压缩BCD码AAD指令跟在字节除DIV之前,先将非压缩BCD码的被除数调整为二进制数AAM和AAD指令根据结果设置SF、ZF和PF,但对OF、CF和AF无定义请看实例71非压缩BCD码的乘除运算实现非压缩BCD码乘法:8×9=72movax,0608h

;ax=0608h,非压缩BCD码表示真值68movbl,09h

;bl=09h,非压缩BCD码表示真值9mul

bl

;二进制乘法:al=08h×09h=0048haam

;十进制调整:ax=0702h实现非压缩BCD码除法:68÷9=7(余5)movax,0608h ;ax=0608h,非压缩BCD码表示真值68movbl,09h ;bl=09h,非压缩BCD码表示真值9aad ;二进制扩展:ax=68=0044hdivbl ;除法运算:商al=07h,余数ah=05h操作722.4节总结四则运算是计算机经常进行的一种操作。算术运算指令也是经常使用的一类指令。这一节要重点掌握:

ADD/ADCSUB/SBBINC/DECCMP8086除直接支持二进制数的算术运算;还提供对BCD码运算的调整指令,实现了间接的十进制算术运算操作。请看表2.3,进行简单的综合。73表2.38086支持的4种数据类型的算术运算742.5位操作类指令以二进制位为基本单位进行数据的操作1、逻辑运算: AND

OR

XOR

NOT

TEST

2、移位: SHL

SHR

SAR

3、循环移位:ROL

ROR

RCL

RCR常用指令,应该特别熟悉;同时,注意这些指令对标志位的影响。75逻辑与指令AND逻辑与运算:与1相“与”结果不变,与0相“与”结果为0;结果送目的操作数。

ANDreg,imm/reg/mem ;reg←reg∧imm/reg/mem

ANDmem,imm/reg ;mem←mem∧imm/regAND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。屏蔽作用——对指定位置076逻辑或指令OR逻辑或运算:与0相“或”结果不变,与1相“或”结果为1;结果送目的操作数。

OR

reg,imm/reg/mem ;reg←reg∨imm/reg/mem

OR

mem,imm/reg ;mem←mem∨imm/regOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。对指定位置177逻辑异或指令XOR逻辑异或运算:与0相“异或”结果不变,与1相“异或”的结果取反。结果送目的操作数。

XORreg,imm/reg/mem

;reg←reg⊕imm/reg/mem XORmem,imm/reg

;mem←mem⊕imm/regXOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。对指定位取反78逻辑非指令NOT逻辑非运算:按位取反。原来是“0”的位变为“1”;原来是“1”的位变为“0”。

NOTreg/mem

;reg/mem←~reg/mem单操作数指令逻辑非指令NOT易与NEG指令混淆

79逻辑运算moval,45handal,31h;逻辑与al=01hmoval,45horal,31h;逻辑或al=75hmoval,45hxoral,31h;逻辑异或al=74hmoval,45hnotal;逻辑非al=bah45h0100010131h0011000180逻辑指令的应用AND指令可用于复位某些位(同0相与),不影响其他位

andbl,11110110B ;将BL中D3和D0位清0,其他位不变OR指令可用于置位某些位(同1相或),不影响其他位

or

bl,00001001B

;将BL中D3和D0位置1,其他位不变XOR指令可用于求反某些位(同1相异或),不影响其他位

xorbl,00001001B

;将BL中D3和D0位求反,其他位不变81测试指令TEST对两个操作数执行逻辑与运算:只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0。测试指令进行逻辑与的结果不回送目的操作数。 TESTreg,imm/reg/mem

;reg∧imm/reg/mem TESTmem,imm/reg

;mem∧imm/regTEST指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。82例2.30:测试某些位为0或1 testal,01h ;测试AL的最低位D0

jnzthere ;标志ZF=0,即D0=1

;则程序转移到there ... ;否则ZF=1,即D0=0,顺序执行there:...TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况。这条指令之后,一般都是条件转移指令,目的是利用测试条件转向不同的程序段。83移位指令(shift)移位指令将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作

SHLreg/mem,1/CL ;逻辑左移,LSB补0,MSB进CF SHRreg/mem,1/CL ;逻辑右移,LSB进CF,MSB补0

SALreg/mem,1/CL ;算术左移,LSB补0,MSB进CF SARreg/mem,1/CL ;算术右移,LSB进CF,MSB不变算术左移SAL与逻辑左移SHL实为同一条指令

移位指令的功能见图2.7

reg/mem是被移位的操作数 1/CL表示移位次数

移位指令对标志的影响

移位指令的实

温馨提示

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

评论

0/150

提交评论