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.