汇编语言标志位(CF)及一些常用指令

汇编语言标志位(CF)及一些常用指令

英文翻译:

carry 进位 flag标志

NV: no overflow OV: overflow

UP: up DN:down

DI: disable interrupt EI: enable interrupt

PL: plus NG: negative

NZ: no zero ZR: zero

NA: no assistant carry AC: assistant carry

PO: parity odd PE: parity even 奇偶校验

NC: no carry CY: carry

汇编标志位:

标志名 标志 1 OF (溢出标志) OV NV DF (方向标志) UP DN IF (中断标志) DI EI SF (符号标志位) PL NG ZF (零标志) NZ ZR AF (辅助进位标志位) NA AC PF (奇偶标志) PO PE CF (进位标志 ) NC CY

OF 溢出(是/否) OV OVerflow NV Not oVerflow DF 方向(减量/增量) DN DowN UP UP

IF 中断(允许/关闭) EI Enable Interrupt DI Disable Interrupt SF 符号(负/正) NG NeGative PL PLus

ZF 零(是/否) ZR ZeRo NZ Not Zero AF 辅助进位(是/否) AC Auxiliary Carry NA Not Auxiliary PF 奇偶(是/否) PE Parity Even PO Parity Odd CF 进位(是/否) CY CarrY NC Not Carry 英文解释:

NV: no overflow OV: overflow

UP: up DN:down

DI: disable interrupt EI: enable interrupt

PL: plus NG: negative

NZ: no zero ZR: zero

NA: no assistant carry AC: assistant carry

PO: parity odd PE: parity even

NC: no carry CY: carry 标志 0

先熟悉一下FLAGS标志位:

OV、NV即溢出标志位OF=1或0,表示运算结果有无溢出。当算术运算的结果超出了带符号数的范围(8位带符号数的范围是-128——+127,16位的是-32728——+32767)。

DN、UP即方向标志位DF=1或0,表示串操作时按地址减或加的方式进行。

EI、DI即中断标志位IF=1或0,表示CPU可否响应可屏蔽中断请求。IF的状态对不可屏蔽中断及内部中断没有影响。

NG、PL即符号标志位SF=1或0,表示运算结果是负(最高位为1)或正(最高位为0)。 ZR、NZ即零标志位ZF=1或0,表示运算结果是0或非0。

AC、NA即辅助进位标志位AF=1或0,在8位加减法操作中表示低4位向高4位有无进借位。 PE、PO即奇偶标志位PF=1或0,表示逻辑运算结果中1的个数是否为偶数。

CY、NC即进位标志位CF=1或0,表示加减法操作中最高位有无进借位。

8086寄存器

通用寄存器

AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界传送数据。

BH&BL=BX(base):基址寄存器,常用于地址索引。

CH&CL=CX:计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器。

DH&DL=DX:数据寄存器,常用于数据传递。

段寄存器

CS(Code Segment):代码段寄存器

DS(Data Segment):数据段寄存器

SS(Stack Segment):堆栈段寄存器

ES(Extra Segment):附加段寄存器

指针寄存器和变址寄存器

SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。

BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置。

SI(Source Index):源变址寄存器,可用来存放相对于DS段之源变址指针。

DI(Destination Index):目的变址寄存器,可用来存放相对于ES段之目的变址指针。

IP(Instruction Pointer):指令指针

PSW(Program Status Word):程序状态寄存器

ZF(Zero Flag):零标志位,用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。

PF(Parity Flag):奇偶标志位,用来反映运算结果中“1”的个数的奇偶性,如果“1”的个数为偶数,则PF的值为1,否则其值为0。

SF(Sign Flag):符号标志位,用来反映运算结果的符号位,它与运算结果的最高位相同。 CF(Carry Flag):进位标志位,用来反映运算结果是否产生进位或借位,如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则为0。

OF(Overflow Flag):溢出标志位,用来反映有符号数加减运算所得结果是否溢出。如果运算结果超出当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

DF(Direction Flag):方向标志位,用来决定在串操作指令执行时有关指针寄存器发生调整的方向。

IF(Interrupt Flag):中断标志位,IF=1处理可屏蔽中断,IF=0不出来可屏蔽中断。 TF(Trace Flag):跟踪标志位,该标志可用于程序调试,没有专门的指令来设置或清除。 AF(Auxiliary carry Flag):辅助进位标志位,在字操作时,发生低字节向高字节进位或借位时;在字节操作时,发生低4位向高4位进位或借位时。

相关指令

abc(c-carry):带进位加法指令。它利用了CF位上记录的进位值。

sbb(b-borrow):带借位减法指令。它利用了CF位上记录的借位值。

cmp(compare):比较指令。它的功能相当于减法指令,只是不保存结果。

je(e-equal):ZF=1则转移

jne(ne-not equal):ZF=0则转移

jb(b-below):CF=0则转移

jnb(nb-not below):CF=0则转移

ja(a-above):CF=0且ZF=0则转移

jna(na-not above):CF=1或ZF=1则转移

movesb(b-byte):传送一个字节

movesw(w-word):传送一个字

rep movesb(rep-repeat):循环执行字节串传送指令

rep movesw(rep-repeat):循环执行字串传送指令

cld(clear DF):将DF置0

std(set DF):将DF置1

pushf(push flag):将标志寄存器的值压栈

popf(pop flag):从栈中弹出数据送入标志寄存器

Debug中标志位的表示:

标志位 值为1 值为0

OF(Overflow Flag) OV(overflow) NV(no overflow)

SF(Sign Flag) NG(negative) PL(plus)

ZF(Zero Flag) ZR(zero) NZ(no zero)

PF(Parity Flag) PE(parity even) PO(parity odd)

CF(Carry Flag) CY(carry) NC(no carry)

DF(Direction Flag) DN(down) UP(up)

AF(Auxiliary carry Flag) AC(assistant carry) NA(no assistant carry) IF(Interrupt Flag) EI(enable interrupt) DI(disable interrupt)

TF(Trace Flag)

AX BX CX DX是CPU内部的通用寄存器中的数据寄存器,数据寄存器一般用于存放参与运算的数据或运算的结果,每一个数据寄存器都是16位的(即16个二进制位),但又可以将高,低8位分别作为两个独立的8位寄存器使用.它们的高8位记作AH,BH,CH,DH,低8位记作

AL,BL,CL,DL.这种灵活的使用方法给编程带来极大的方便,既可以处理16位数据,也能处理8位数据.

数据寄存器除了作为通用寄存器使用外,它们还有各自的习惯用法

AX 称为累加器,常用于存放算术逻辑运算中的操作数,另外所有的I/O指令都使用累加器与外设接口传送信息

BX 称为基址寄存器,常用来存放访问内在时的基地址,

CX 称为计数寄存器,在循环和串操作指令中用作计数器

DX 称为数据寄存器,在寄存器间接寻址中的I/O指令中存放I/O端口的地址

另外,在做双字长乘除法运算时,DX 与AX合起来存放一个双字长数(32位),其中DX存放高16位,AX存放低16位.

AH&AL=AX(accumulator):累加寄存器

BH&BL=BX(base):基址寄存器

CH&CL=CX(count):计数寄存器

DH&DL=DX(data):数据寄存器

SP(Stack Pointer):堆栈指针寄存器

BP(Base Pointer):基址指针寄存器

SI(Source Index):源变址寄存器

DI(Destination Index):目的变址寄存器

IP(Instruction Pointer):指令指针寄存器

CS(Code Segment)代码段寄存器

DS(Data Segment):数据段寄存器

SS(Stack Segment):堆栈段寄存器

ES(Extra Segment):附加段寄存器

OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1. SF sign Flag 符号标志 记录运算结果的符号,结果负时为1.

ZF zero flag 零标志 运算结果等于0时为1,否则为0.

CF carry flag 进位标志 最高有效位产生进位时为1,否则为0.

AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0. PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0.

DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大.

IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断. TF trap flag 陷阱标志 用于调试单步操作.

寻址方式:

立即寻址 MOV AX , 常数

直接寻址 MOV AX , [常数] ;加上中括号 或 MOV AX , 变量名或标号

寄存器寻址 MOV AX , 通用寄存器

寄存器间接寻址 MOV AX , [(BX,BP,SI,DI)中的一个] ;以下四行均需加上中括号 寄存器相对寻址 MOV AX , [(BX,BP,SI,DI)中的一个 + 偏移量]

基址变址寻址 MOV AX , [基址寄存器 + 变址寄存器]

相对基址变址寻址 MOV AX , [基址寄存器 + 变址寄存器 + 偏移量]

XCHG OPRD1, OPRD2 交换指令

地址传送指令

LEA REG, OPRD 地址传送指令

LDS REG, OPRD (load pointer into DS)

LES REG, OPRD (Load pointer into ES )

堆栈指令

进栈指令 SP-2

PUSH SRC

出栈指令 SP+2

POP DST

标志操作指令

(1) 标志传送指令

LAHF (Load AH with Flags) 把标志位寄存器的低8位传送到寄存器AH的指定位 SAHF (Store AH into Flags) 与LAHF相反 (SF ZF AF PF CF)

CLC (Clear Carry flag) 清进位标志

CLD 清方向标志

STD 置方向标志

CLI 清中断允许

STI 置中断

ADC 带进位的加法指令 (Add and carry)

inc oprd 加一指令 (IN Crement)

SUB 减法指令 (SUBtraction)

SBB 带借位的减法 (SuBtract with Borrow)

DEC 减一指令 (DECrement)

Offset 偏移值

test 测试 移位 指令

AX:Accumulator

BX:Base

CX:Cout

DX:Date

SI:Source Index

DI:Destination Index

BP:Base Pointer

SP:Stack Pointer

CF:Carry Flag

ZF:Zero Flag

SF:Sign Flag

OF:Overflow Flag

PF:Parity Flag

AF:Auxiliary Flag

TF:Trap Flag

IF:Interrupt Flag AF:Auxiliary Flag CS:Code Segment DS:Data Segment ES:Extra Segment SS:Stack Segment

段寄存器 :CS DS SS ES

 

第二篇:汇编语言常用指令大全

MOV 指令为双操作数指令,两个操作数中必须有一个是寄存器.

MOV DST , SRC // Byte / Word

执行操作: dst = src

1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).

2.立即数不能直接送段寄存器

3.不允许在两个存储单元直接传送数据

4.不允许在两个段寄存器间直接传送信息

PUSH 入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word

入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈.

POP DST //Word

出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.

执行POP SS指令后,堆栈区在存储区的位置要改变.

执行POP SP 指令后,栈顶的位置要改变.

XCHG(eXCHanG)交换指令: 将两操作数值交换.

XCHG OPR1, OPR2 //Byte/Word

执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp

1.必须有一个操作数是在寄存器中

2.不能与段寄存器交换数据

3.存储器与存储器之间不能交换数据.

XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.

XLAT (OPR 可选) //Byte

执行操作: AL=(BX+AL)

指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.

LEA(Load Effective Address) 有效地址传送寄存器指令

LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中.

执行操作: REG = EAsrc

注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器

MOV BX , OFFSET OPER_ONE 等价于 LEA BX , OPER_ONE

MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中

LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中

LDS(Load DS with pointer)指针送寄存器和DS指令

LDS REG , SRC //常指定SI寄存器。

执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

LES (Load ES with pointer) 指针送寄存器和ES指令

LES REG , SRC //常指定DI寄存器

执行操作: REG=(SRC) , ES=(SRC+2) //与LDS大致相同,不同之处是将ES代替DS而已.

LAHF ( Load AH with Flags ) 标志位送AH指令

LAHF //将PSW寄存器中的低8位的状态标志(条件码)送入AH的相应位, SF送D7位, ZF送D6位......

执行操作: AH=PSW的低位字节。

SAHF ( Store AH into Flags ) AH送标志寄存器指令

SAHF //将AH寄存器的相应位送到PSW寄存器的低8位的相应位, AH的D7位送SF, D6位送ZF......

执行操作: PSW的低位字节=AH。

PUSHF ( PUSH the Flags) 标志进栈指令

PUSHF //将标志寄存器的值压入堆栈顶部, 同时栈指针SP值减2

执行操作: SP=SP-1,(SP)=PSW的高8位, SP=SP-1, (SP)=PSW的低8位

POPF ( POP the Flags ) 标志出栈指令

POPF //与PUSHF相反, 从堆栈的顶部弹出两个字节送到PSW寄存器中, 同时堆栈指针值加2

执行操作: PSW低8位=(SP), SP=SP+1, PSW高8位=(SP) , SP=SP+1

输入输出指令(IN,OUT):只限于使用累加器AX或AL与外部设备的端口传送信息. IN (INput)输入指令:信息从I/O通过累加器传送到CPU

IN AL , PORT //直接的字节输入,PORT是外设端口编号(即端口地址),只能取 00H ~ 0FFH共256个端口地址.

IN AX , PORT //直接的字输入,AX存储连续两个端口地址PORT+1,PORT

IN AL , DX //间接的字节输入,端口地址范围可通过DX设置为0000H ~ 0FFFFH共65536个端口地址

IN AX , DX //间接的字输入

OUT( OUTput)输出指令 :信息从CPU通过累加器传送到I/O

OUT PORT , AL //直接的字节输出,PORT规定与IN指令相同.

OUT PORT , AX

OUT DX , AL //间接的字节输出

OUT DX , AX

MOV AL,05H OUT 27H, AL //将字节05H传送到地址27H的端口

ADD(ADD)加法指令

ADD DST , SRC //Byte/Word

执行操作: dst=dst+src

1.两个存储器操作数不能通过ADD指令直接相加, 即DST 和SRC必须有一个是通用寄存器操作数.

2.段寄存器不能作为SRC 和DST.

3.影响标志位Auxiliary Crray Flag ,Carry Flag, Overflow Flag, Parity Flag, Sign Flag 和Zero Flag ,如下所示:

CF 根据最高有效位是否有进(借)位设置的:有进(借)位时CF=1, 无进(借)位时CF=0. OF 根据操作数的符号及其变化来设置的:若两个操作数的符号相同,而结果的符号与之相反时OF=1, 否则为0.

ZF 根据结果来设置:不等于0时ZF=0, 等于0时ZF=1

SF 根据结果的最高位来设置:最高位为0, 则SF=0.

AF 根据相加时D3是否向D4进(借)位来设置:有进(借)位时AF=1, 无进(借)位时AF=0 PF 根据结果的1的个数时否为奇数来设置:1的个数为奇数时PF=0, 为偶数时PF=1 ADC( ADd with Carry)带进位加法指令

ADC DST , SRC //Byte/Word

执行操作: dst=dst+src+CF //与ADD不同之处是还要加上进位标志位的值.

INC ( INCrement) 加1指令

INC OPR //Byte/Word

执行操作: OPR=OPR+1

1.OPR可以是寄存器和存储器操作数, 但不能是立即数和段寄存器

2.影响标志位OF,SF,ZF,PF 和AF,不影响CF.

SUB ( SUBtract ) 不带借位的减法指令

SUB DST , SRC //Byte/Word

执行操作:dst=dst - src

1.DST和SRC寻址方式及规定与ADD相同.

2.影响全部标志位.(判断标志位参见ADD)

SBB ( SuBtract with Borrow) 带借位减法指令

SBB DST , SRC //Byte/Word

执行操作:dst= dst - src - CF

DEC ( DECrement ) 减1指令

DEC OPR //Byte/Word

执行操作:OPR = OPR - 1 //除CF标志位, 其余标志位都受影响.

NEG ( NEGate ) 求补指令

NEG OPR

执行操作:opr = 0- opr //将操作数按位求反后末位加1.

CMP ( CoMPare ) 比较指令

CMP OPR1 , OPR2

执行操作:OPR1 - OPR2 //与SUB指令一样执行运算, 但不保存结果.

比较情况 无符号数 有符号数

A=B ZF=1 ZF=1

A>B CF=0 && ZF=0 SF^OF=0 && ZF=0

A<B CF=1 && ZF=0 SF^OF=1 && ZF=0

A>=B CF=0 || ZF=1 SF^OF=0 || ZF=1

A<=B CF=1 || ZF=1 SF^OF=1 || ZF=1

MUL ( unsigned MULtiple ) 无符号数乘法指令

MUL SRC //Byte/Word .

执行操作:Byte => AX= AL *src //字节运算时目的操作数用AL, 乘积放在AX中

Word => DX=AX *src //字运算时目的操作数用AX, DX存放乘积的高位字, AX放乘积的低位字

1.目的数必须是累加器 AX 或AL,指令中不需写出

2. 源操作数SRC可以是通用寄存器和各种寻址方式的存储器操作数, 而绝对不允许是立即数或段寄存器.

IMUL (sIgned MULtiple) 有符号数乘法指令

IMUL SRC //与MUL指令相同,但必须是带符号数

DIV ( unsigned DIVide) 无符号数除法指令

DIV SRC //Byte/Word 其中: SRC的规定同乘法指令MUL

执行操作:Byte => AX / src //字节运算时目的操作数在AX中,结果的商在AL中 ,余数在AH中

Word=> DX,AX /src //字运算时目的操作数在DX高位字和AX低位字中,结果的商在AX中 ,余数在DX中

存储器操作数必须指明数据类型:BYTE PTR src 或 WORD PTR src

IDIV (sIgned DIVied) 有符号数除法指令

IDIV SRC //Byte/Word 与DIV指令相同,但必须是带符号数

CBW (Convert Byte to Word) 字节转换为字指令

CBW

执行操作: AL中的符号位(D7)扩展到8位AH中,若AL中的D7=0,则AH=00H,若AL中的D7=1,则AH=FFH.

CWD (Convert Word to Double word) 字转换为双字指令

CWD

执行操作: AX中的符号位(D15)扩展到16位DX中,若AX中的D15=0,则DX=0000H,若AX中的D15=1,则DX=FFFFH

十进制调整指令

当计算机进行计算时,必须先把十进制数转换为二进制数,再进行二进制数运算,最后将结果又转换为十进制数输出.

在计算机中,可用4位二进制数表示一位十进制数,这种代码称为BCD ( Binary Coded Decimal ).

BCD码又称8421码,在PC机中,BCD码可用压缩的BCD码和非压缩的BCD码两种格式表示.

压缩的BCD码用4位二进制数表示一个十制数,整个十进数形式为一个顺序的以4位为一组的数串.

非压缩的BCD码以8位为一组表示一个十进制数,8位中的低4位表示8421的BCD码,而高4位则没有意义.

压缩的BCD码调整指令

DAA (Decimal Adjust for Addition) 加法的十进制调整指令

DAA

执行操作:执行之前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存话在AL寄存器中.

DAS (Decimal Adjust for Subtraction) 减法的十进制调整指令

DAS

执行操作:执行之前必须先执行SUB或SBB指令,减法指令必须把两个压缩的BCD码相减,并氢结果存放在AL寄存器中.

非压缩的BCD码调整指令

AAA (ASCII Adjust for Addition) 加法的ASCII调整指令

AAA

执行操作:执行之前必须先执行ADD或ADC指令,加法指令必须把两个非压缩的BCD码相加,并把结果存话在AL寄存器中.

AAS (ASCII Adjust for Subtraction) 减法的ASCII调整指令

AAS

执行操作:执行之前必须先执行SUB或SBB指令,减法指令必须把两个非压缩的BCD码相减,并氢结果存放在AL寄存器中.

MOVS ( MOVe String) 串传送指令

MOVB //字节串传送 DF=0, SI = SI + 1 , DI = DI + 1 ;DF = 1 , SI = SI - 1 , DI = DI - 1 MOVW //字串传送 DF=0, SI = SI + 2 , DI = DI + 2 ;DF = 1 , SI = SI - 2 , DI = DI - 2 执行操作:[DI] = [SI] ,将位于DS段的由SI所指出的存储单元的字节或字传送到位于ES段的由DI 所指出的存储单元,再修改SI和DI, 从而指向下一个元素.

在执行该指令之前,必须预置SI和DI的初值,用STD或CLD设置DF值.

MOVS DST , SRC //同上,不常用,DST和SRC只是用来用类型检查,并不允许使用其它寻址方式来确定操作数.

1.目的串必须在附加段中,即必须是ES:[DI]

2.源串允许使用段跨越前缀来修饰,但偏移地址必须是[SI].

STOS (STOre into String) 存入串指令

STOS DST

STOSB //存放字节串 ( DI ) = AL

STOSW //存放字串 ( DI ) = AX

执行品作:把AL或AX中的内容存放由DI指定的附加段的字节或字单元中,并根据DF值修改及数据类型修改DI的内容.

1.在执行该指令之前,必须把要存入的数据预先存入AX或AL中,必须预置DI的初值.

2.DI所指向的存储单元只能在附加段中,即必须是ES:[DI]

LODS ( LOaD from String ) 从串取指令

LODS SRC

LODSB //从字节串取 AL=(SI)

LODSW //从字串取 AX= (SI±1) (SI)

执行操作:把由SI指定的数据段中字节或字单元的内容送入AL或AX中,并根据DF值及数据类型修改SI的内容.

1.在执行该指令之前,要取的数据必须在存储器中预先定义(用DB或DW),必须预置SI的初值.

2.源串允许使用段超越前缀来改变数据存储的段区.

REP (REPeat)重复操作前缀

REP String Primitive //其中:String Primitive可为MOVS,STOS或LODS指令

执行操作:使REP前缀后的串指令重复执行,每执行一次CX=CX-1,直至CX=0时退出REP.

方向标志设置

CLD (CLear Direction flag) 清除方向标志指令

CLD

执行操作:令DF=0, 其后[SI],[DI]执行增量操作

STD (SeT Direction flag) 设置方向标志指令

STD

执行操作:令DF=1, 其后[SI],[DI]执行减量操作

CMPS (CoMPare String) 串比较指令

CMPS SRC , DST

CMPSB //字节串比较 (SI)-(DI)

CMPSW //字串比较 (SI+1)(SI) - (DI+1)(DI)

执行操作:把由SI指向的数据段中的一个字节或字与由DI指向的附加段中的一个字节或字相减,不保留结果,只根据结果置标志位.

SCAS (SCAn String ) 串扫描指令

SCAS DST

SCASB

SCASW

执行操作:把AX或AL的内容与由DI指向的在附加段中的一个字节或字相减,不保留结果,根据结果置标志位.

AND, OR , XOR 和 TEST都是双字节操作指令,操作数的寻址方式的规定与算术运算指令相同.

NOT是单字节操作指令,不允许使用立即数.

逻辑运算均是按位进行操作,真值表如下:

AND (位与&) OR ( 位或| ) XOR ( 位异或^ )

1 & 1 = 1 1 | 1 = 1 1 ^ 1 = 0

1 & 0 = 0 1 | 0 = 1 1 ^ 0 = 1

0 & 1 = 0 0 | 1 = 1 0 ^ 1 = 1

0 & 0 = 0 0 | 0 = 0 0 ^ 0 = 0

A:逻辑运算指令

AND (and) 逻辑与指令

AND DST , SRC //Byte/Word

执行操作:dst = dst & src

1.AND指令执行后,将使CF=0,OF=0,AF位无定义,指令执行结果影响SF,ZF和PF标志位.

2.AND指令典型用法A:用于屏蔽某些位,即使某些位为0.

屏蔽AL的高4位:即将高4位和0000B相与,低4位和1111B相与

MOV AL , 39H //AL= 0011 1001B[39H]

ADD AL , 0FH // AL= 0000 1001B[09H] 即0011 1001B[39H] & 0000 1111B[0FH] = 0000 1001B[09H]

3.AND指令典型用法B:取出某一位的值(见TEST)

OR (or) 逻辑或指令

OR DST , SRC //Byte/Word

执行操作:dst = dst | src

1.OR指令执行后,将使CF=0, OF=0, AF位无定义,指令执行结果影响SF, ZF和PF标志位.

2.常用于将某些位置1.

将AL的第5位置1:

MOV AL , 4AH // AL=0100 1010B[4AH]

OR AL , 10H // AL=0101 1010B[5AH] 即0100 1010B[4AH] | 0001 0000B[10H] =0101 1010B [5AH]

XOR (eXclusive OR) 逻辑异或指令

XOR DST , SRC //Byte/Word

执行操作:dst = dst ^ src

1.XOR指令常用于使某个操作数清零,同时使CF=0,清除进位标志.

2.XOR指令使某些位维持不变则与 '0' 相异或,若要使某些位取反则与 '1'相异或. 将AL的高4位维持不变,低4位取反:

MOV AL, B8H //AL=1011 1000B[B8H]

XOR AL, 0FH //AL=1011 0111B[B7H] 即1011 1000B[B8H] ^ 0000 1111[0FH]=1011 0111B[B7H]

测试某一个操作数是否与另一确定操作数相等:

XOR AX , 042EH

JZ .... //如果AX==042EH, 则ZF=TRUE(1), 执行JZ...

NOT (not) 逻辑非指令

NOT OPR //Byte/Word

执行操作:opr = ~opr // ~ 01100101 [65H] =10011010 [9AH]

1.操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数.

2.NOT指令不影响任何标志位。

将AL各位取反:

MOV AL,65H //AL=0110 0101B[65H]

NOT AL //AL=1001 1010B[9AH] 即 ~ 0110 0101B[65H]=1001 1010B[9AH] TEST (test) 指令

TEST OPR1 , OPR2 //Byte/Word

执行操作:opr1 & opr2

1.两个操作数相与的结果不保存,结果影响标志位PF,SF和ZF,使CF=0, OF=0,而AF位无定义.

2.TEST指令常用于在不改变原有的操作数的情况下,检测某一位或某几位的条件是否满足.只要令用来测试的操作数对应检测位为1,其余位为0,相与后判断零标志ZF值的真假. 检测某位是否为1:

令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则 JNZ... TEST AL , 0000 00001B //测试AL最低位是否为1:: 令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令

JNZ THER //最低位若为1, 则ZF=FALSE(0), 执行JNZ THER, 否则执行下一条指令.

或者:先对操作数求反,令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则JZ...

MOV DL , AL //将AL 传送到DL,主要是不要影响AL的值. 以下测试AL的b2位是否为1

NOT DL //先对操作数求反

TEST 0000 0100B //令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令 JZ THER //若AL的b2位为1,则ZF=TRUE(1), 执行JZ THER

B:移位指令[所有的移位指令都影响标志位CF、OF、PF、SF和ZF、AF无定义.] 非循环逻辑移位:把操作数看成无符数来进行移位.

SHL ( SHift logical Left )逻辑左移指令

SHL OPR , CNT //Byte/Word

执行操作:使OPR左移CNT位,并使最低CNT位为全0.

1.OPR操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数.

2.移位次数由CNT决定.每次将OPR的最高位移出并移到CF,最低位补0.

MOV CL , 7 //若移位多次, 先预置移位次数CL

SHL DX , CL //CNT可取1或CL寄存器操作数

SHR (SHift logical Right) 逻辑右移指令

SHR OPR , CNT //Byte/Word

同SHL,每次将OPR的最低位D0移出并移到CF.最高位补0.

非循环算术移位:将操作数看成有符号数来进行移位.

SAL (Shift Arithmetic Left) 算术左移指令

SAL OPR , CNT //Byte/Word

SAL指令与SHL指令完全相同

SAR(Shift Arithmetic Right) 算术右移指令

SAR OPR , CNT //Byte/Word

SAR指令每次移位时,将最高位移入次高位的同时最高位值不变,最低位D0移出并移到CF.

循环移位指令

ROL ( ROtate Left) 循环左移指令

ROL OPR , CNT //Byte/Word

每次移位时,最高位移出并同时移到CF和最低位D0.

ROR (ROtate Right)循环右移指令

ROR OPR,CNT //Byte/Word

每次移位时,最低位D0移出并同时移到CF和最高位.

带进位循环移位指令

RCL (Rotate Left through Carry)带进位循环左移指令

RCL OPR,CNT //Byte/Word

RCR (Rotate Right through Carry)带进位循环右移指令

RCR OPR ,CNT //Byte/Word

处理器控制指令

CLC (CLear Carry) 进位位置0指令

CLC //执行操作后,CF=0

CMC (CoMplement Carry) 进位位求反指令

CMC //执行操作后,CF=!CF

STC (SeT Carry) 进位位置1指令

STC //执行操作后,CF=1

NOP (No Operetion) 无操作指令

NOP //此指令不执行任何操作,其机器码占一个字节单元

HLT (HaLT) 停机指令

HLT

执行操作后,使机器暂停工作,使处理器CPU处于停机状态,以等待一次外部中断到来,中断结束后,程序继续执行,CPU继续工作.

JMP ( JuMP ) 无条件转移指令

名称 格式 执行操作

段内直接短跳转 JMP SHORT OPR IP=IP+8 位偏移量

段内直接近转移 JMP NEAR PTR OPR IP=IP+16位偏移量

段内间接转移 JMP WORD PTR OPR IP=(EA)

段间直接转移 JMP FAR PTR OPR IP=OPR 偏移地址, CS=OPR 段地址

段间间接转移 JMP DWORD PTR OPR IP=(EA),CS=(EA+2)

1.无条件转移到指定的地址去执行从该地址开始的指令.

2.段内转移是指在同一代码段的范围内进行转移,只需改变IP寄存器内容.

3.段间转移则要转移到另一个代码段执行程序,此时要改变IP寄存器和CS段寄存器的内容.

条件转移指令:根据上一条指令所设置的条件码(标志位)来判断测试条件.

根据五个标志位:ZF、SF、OF、 PF、 CF的两种状态(0 FALSE或1 TRUE)产生10种测试条件.

Name Flag Flag == TRUE [1] Flag ==FALSE [ 0]

Zero Falg ZF JE/JZ OPR //结果为零转移JNE/JNZ OPR //结果不为零转移

Sign Falg SF JS OPR //结果为负转移JNS OPR //结果为正转移

Overflow Flag OF JO OPR //溢出转移JNO OPR //不溢出转移

Parity Flag PF JP/JPE OPR //结果为偶转移 JNP/JPO OPR //结果为奇转移 Carry Flag CF JC OPR //有进位转移 JNC OPR //无进位转移

两个数比较:

情况 指令 满足条件 指令 满足条件

A < B JC CF==1 JL SF^OF==1 && ZF==0

A ≥ B JNC CF==0 JNL SF^OF==0 || ZF==1

A ≤ B JNA CF==1 || ZF==1 JLG SF^OF==1 || ZF==1

A > B JA CF==0 && ZF==0 JG SF^OF==0 && ZF==0

测试CX转移指令

JCXZ OPR //CX==0时转移

LOOP(LOOP)循环指令

LOOP OPR 测试条件:CX ≠ 0 //OPR在程序中实际是个标号

LOOPZ OPR 测试条件:ZF == 1 && CX ≠ 0

LOOPNZ OPR 测试条件:ZF == 0 && CX ≠ 0

执行操作: 先执行CX=CX-1,再检测上面的测试条件,如满足则IP=IP+符号扩展的D8,不满足则退出循环.

过程调用及返回指令

CALL (CALL) 过程调用指令

CALL DST //DST在程序中实际是子程序标号

执行操作:先将过程的返回地址(即CALL的下一条指令的首地址)存入堆栈,然后转移到过程入口地址执行子程序.

调用方式 格式 断点保护入栈情况 过程入口地址

段内直接 CALL NEAR PTR PR1 (SP-1)(SP-2)←IP , CS不进栈 CS值保持不变,IP←DST

段内间接 CALL WORD PTR (EA) (SP-1)(SP-2)←IP , CS不进栈 CS值保持不变,IP←(EA)

段间直接 CALL FAR PTR PR1 (SP-1)(SP-2)←CS , (SP-3)(SP-4)←IP IP←DST偏移地址,CS←DST段地址

段间间接 CALL DWORD PTR (EA) (SP-1)(SP-2)←CS , (SP-3)(SP-4)←IP

IP←(EA),CS←(EA+2)

注:为了表明是段内调用,可使用NEAR PTR属性操作符作说明.

RET(RETurn)子程序返回指令

RET

RET EXP //带立即数返回

子程序返回指令RET放在子程序末尾,它使子程序在执行完全部任务后返回主程序继续执行被打断后的程序.返回地址在子程序调用时入栈保存的断点地址-IP或IP和CS.