ROL OPRD,m 循环左移 ROR OPRD,m 循环右移 RCL OPRD,m 带进位的循环左移 RCR OPRD,m 带进位的循环右移
其中,m是移位次数,或为1或为CL。操作数OPRD可以是通用寄存器,可以是存储器操作数。 前两条循环指令没有把进位标志CF包含在循环的环中;后两条循环指令把进位标志CF包含在循环的环中,即作为整个循环的一部分。 这些指令只影响标志CF和OF。
对于不带进位的循环移位指令而言,如果操作数是8位后,操作数就能复原;如果操作是16位后,操作数就能复原。对于带进位的循环移位指令而言,如果操作数是8位,那么在移位9次后,操作数就能复原;如果操作是16位,那么在移位17次后,操作数就能复原。 例如:MOV CL,9 RCR AL,CL 指令执行前(AL)=23H 0010 0011 0010 0011
指令执行后(AL)=23H
通过带进位循环移位指令和其他移位指令的结合,可以实现两个或多个操作数的重新结合。 例如:实现把AL的高4位与低4位交换。 ROL AL,4 ROR AL,4 RCL AL,5 RCR AL,5
例如:把AL的最低位送入BL的最低位,保持AL不变:
例如:(AX)=0012H,(BX)=0034H,要求把它们装配在一起形成(AX)=1234H MOV CL,8 ROL AX,CL
XOR AX,BX(OR AX,BX) (五)转移指令
1.无条件转移指令(没有条件碰到就转) (1)无条件段内直接转移指令 格式:JMP 标号
这条指令使控制无条件地转移到标号地址处。
例如:NEXT:MOV AX,CX JMP NEXT JMP OVER OVER: MOV AX,1
无条件段内直接转移指令格式如下:由操作码和地址差值构成。
指令的操作码 地址差
地址差:是程序中该无条件转移指令的下一条指令的开始地址到转移目标地址(标号所指定的开始地址)的差值 。因为,在执行无条件段内转移指令时,实际的动作是把指令中的地址差加到指令指针IP上,使IP之内容为目标地址,从而达到转移的目的。段内无条件直接转移指令中的地址差可用一个字节表示,也可用一个字表示。如果地址差只要用一个字节表示,就称为短转移;如果地址差要用一个字表示,就称为近转移。
段内短跳转:(-128~127)
JMP SHORT QUEST 段内近跳转:(64KB) JMP NEAR PTR PROG (2)无条件段内间接转移指令 格式:JMP OPRD
这条指令使控制无条件地址转移到由操作数OPRD的内容给定的目标地址处。操作数OPRD可以是通用寄存器,也可以是字存储单元。 (3)无条件段间直接转移指令 格式:JMP FAR PTR 标号
这条指令使控制无条件地转移到标号所对应的地址处。标号前的符号“FAR PTR”向汇编程序说明这是段间转移。 例如:JMP FAR PTR EXIT
EXIT是定义在另一个代码段中的标号。
无条件段间直接转移指令的具体动作时把指令中包含的目标地址的段值和偏移分别置入CS和IP。
这种在指令中直接包含转移目标地址的转移方式称为绝对转移。 (4)无条件段间间接转移指令
格式:JMP OPRD
这条指令使控制无条件地转移到由操作数OPRD的内容给定的目标地址处。操作数OPRD必须是双字存储单元。
例如:JMP DWORD PTR [1234H]
双字存储单元的低字内容送IP; 双字存储单元的高字内容送CS。
例如:(IP)=2BC0H,(CS)=0200H,位移量D=5119H,(BX)=1200H,(DS)=212AH,(224A0)=0600H,(275B9)=098AH
试为以下的转移指令找出转移的偏移地址:(求IP) (1)段内直接寻址
(2)使用BX及寄存器间接寻址方式的段内间接寻址 (3)使用BX及寄存器相对寻址方式的段内间接寻址 答案:(1)偏移地址=D+IP=5119H+2BC0H=7CD9H
(2)JMP BX (16d*DS+BX)=212A0+1200=(224A0)=0600H
(3)JMP [BX+D] (16d*DS+BX+D)=212A0+1200+5119=(275B9)=098AH 2.条件转移指令
8086 8088 提供了大量的条件转移指令,它们根据某标志位或某些标志位的逻辑运算来判别条件是否成立。如果条件成立,则转移,否则继续顺序执行。所有条件转移都只是段内转移。条件转移指令不影响标志。有些条件转移指令有两个助记符,还有些条件转移指令有三个助记符。使用多个助记符的目的是便于记忆和使用。条件转移指令使用的最多的转移指令。通常,在条件转移指令前,总有用于条件判别的有关指令。 {
(1)根据单个条件标志的设置情况转移
①.JZ(或JE)(Jump if zero,or equal)结果为零(或相等)则转移 格式:JZ(或JE) OPRD 测试条件:ZF=1
②.JNZ(或JNE)(Jump if not zero,or not equal)结果不为零(或不相等)则转移 格式:JNZ(或JNE) OPRD 测试条件:ZF=0
③.JS(Jump if sign)结果为负则转移 格式:JS OPRD
测试条件:SF=1
④.JNS(Jump if not sign)结果为正则转移 格式:JNS OPRD 测试条件:SF=0
⑤.JO(Jump if overflow)溢出则转移 格式:JO OPRD 测试条件:OF=1
⑥.JNO(Jump if not overflow)不溢出则转移 格式:JNO OPRD 测试条件:OF=0
⑦.JP(或JPE)(Jump if parity ,or parity even)奇偶位为1则转移 格式:JP(或JPE) OPRD 测试条件:PF=1
⑧.JNP(或JPO)(Jump if not parity ,or parity odd)奇偶位为0则转移 格式:JNP(或JPO) OPRD 测试条件:PF=0
⑨.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry)低于,或者不高于或等于,或进位位为1则转移 格式:JB(或JNAE,JC) OPRD 测试条件:CF=1
⑩.JNB(或JAE,JNC)(Jump if not below,or above or equal ,or not carry)不低于,或者高于或者等于,或进位位为0则转移 格式:JNB(或JAE,JNC) OPRD -测试条件:CF=0
(2)比较两个无符号数,并根据比较的结果转移
①JB(或JNAE,JC)
格式:JB(或JNAE,JC) OPRD
②JNB(或JAE,JNC)
格式:JNB(或JAE,JNC) OPRD
③JBE(或JNA)(Jump if below or equal,or not above)低于或等于,或不高于则转移 格式:JBE(或JNA) OPRD 测试条件:CFVZF=1
④JNBE(或JA)(Jump if not below or equal,or above)不低于或等于,或高于则转移 格式:JNBE(或JA) OPRD 测试条件:CFVZF=0
(3)比较两个带符号数,并根据比较的结果转移
①JL(或LNGE)(Jump if less,or not greater or equal)小于,或者不大于或者等于则转移 格式:JL(或LNGE) OPRD 测试条件:SFVOF=1
②JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则转移 格式:JNL(或JGE) OPRD 测试条件:SFVOF=0
③JLE(或JNG)(Jump if less or equal, or not greater )小于或等于,或者大于则转移 格式:JLE(或JNG) OPRD 测试条件:(SFVOF)VZF=1
④JNLE(或JG)(Jump if not less or equal, or greater )不小于或等于,或者大于则转移 格式:JNLE(或JG) OPRD