首页 理论教育 探讨移位和循环移位指令的使用方法

探讨移位和循环移位指令的使用方法

时间:2023-06-29 理论教育 版权反馈
【摘要】:将以二进制格式表示的十进制数16右移2位时,在累加器中出现相当于十进制数4的二进制编码。由0或符号位的信号状态填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。可使用循环移位指令逐位左移或右移累加器1的整个内容。循环移位指令触发与移位指令相似的功能。循环移位指令后的数字或在累加器2的低字节中,低节中的数值表示要循环移位的数目。取决于指令的具体情况,循环移位也可以通过状态字的CC 1位进行。

探讨移位和循环移位指令的使用方法

可使用移位指令逐位左移或右移累加器1中低字的内容或整个累加器的内容(参见CPU寄存器)。左移n位相当于将累加器的内容乘以“2n”;右移n位相当于将累加器的内容除以“2n”。例如,将以二进制格式表示的十进制数3左移3位时,在累加器中出现相当于十进制数24的二进制编码。将以二进制格式表示的十进制数16右移2位时,在累加器中出现相当于十进制数4的二进制编码。

移位指令后的数字或在累加器2的低字节中,低字节中的数值表示要移位的数目。由0或符号位的信号状态(0代表正数、1代表负数)填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。复位状态字的CC 0和OV位为0。可使用跳转指令来判断CC 1位。移位运算是无条件的,即它们的执行不需要任何特殊的条件,且不影响逻辑运算的结果。

可使用循环移位指令逐位左移或右移累加器1的整个内容(参见CPU寄存器)。循环移位指令触发与移位指令相似的功能。然而,它使用累加器中移出的位的信号状态填充空出的位。

循环移位指令后的数字或在累加器2的低字节中,低节中的数值表示要循环移位的数目。取决于指令的具体情况,循环移位也可以通过状态字的CC 1位进行。复位状态字的CC 0位为0。

1.语句表(STL)的移位和循环移位指令

(1)SSI 带符号整型移位(16位)

指令格式为:SSI〈数目

SSI

〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~15。

SSI〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~15。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。

SSI:移位数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。移位数目大于16时,始终产生相同的结果(ACCU 1=16#0000、CC 1=0或ACCU 1=16#FFFF、CC 1=1)。当移位数目大于0时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。

978-7-111-46052-7-Chapter04-267.jpg

(2)SSD 带符号长整型移位(32位)

指令格式为:SSD

SSD〈数目〉

〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~32。

SSD(右移带符号的长整型)逐位向右移动ACCU 1的整个内容。由符号位的信号状态填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。

SSD〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~32。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将移位指令视为NOP操作。

SSD:移位数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。移位数目大于32时,始终产生相同的结果(ACCU 1=32#00000000、CC 1=0或ACCU 1=32#FFFFFFFF、CC 1=1)。当移位数目大于0时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。

例:

978-7-111-46052-7-Chapter04-268.jpg

SLW(左移字)逐位向左移动ACCU 1-L的内容。由零填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。

SLW〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~15。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。

SLW:移位数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。移位数目大于16时,始终产生相同的结果:ACCU 1-L=0、CC 1=0、CC 0=0和OV=0。当0〈移位数目≤16时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。

例:

978-7-111-46052-7-Chapter04-269.jpg

(4)SRW 右移字(16位)

指令格式为:SRW

SRW〈数目〉

〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~15。

SRW(右移字)逐位向右移动ACCU 1-L的内容。由零填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。

SRW〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~15。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。

SRW:移位数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。移位数目大于16时,始终产生相同的结果:ACCU 1-L=0、CC 1=0、CC 0=0和OV=0。当0〈移位数目≤16时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。

例:

978-7-111-46052-7-Chapter04-270.jpg

(5)SLD 左移双字(32位)

指令格式为:SLD

SLD〈数目〉

〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~32。

SLD(左移双字)逐位向左移动ACCU 1的整个内容。由零填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。

SLD〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~32。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。

SLD:移位数目由ACCU 2-L-L中的数值指定。允许的数值范围为0~255。移位数目大于32时,始终产生相同的结果:ACCU 1=0、CC 1=0、CC 0=0和OV=0。当0<移位数目≤32时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。

例:

978-7-111-46052-7-Chapter04-271.jpg

(6)SRD 右移双字(32位)

指令格式为:SRD

SRD〈数目〉

〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~32。

SRD(右移双字)逐位向右移动ACCU 1的整个内容。由零填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。

SRD〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~32。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。

SRD:移位数目由ACCU 2-L-L中的数值指定。允许的数值范围为0~255。移位数目大于32时,始终产生相同的结果:ACCU 1=0、CC 1=0、CC 0=0和OV=0。当0〈移位数目≤32时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。

例:

978-7-111-46052-7-Chapter04-272.jpg

例1:

978-7-111-46052-7-Chapter04-273.jpg

(7)RLD 循环左移双字(32位)

指令格式为:RLD

RLD〈数目〉

〈数目〉的数据类型为整型、无符号。要循环移位的位数目,范围为0~32。

RLD(循环左移双字)逐位向左循环移动ACCU 1的整个内容。循环移位指令空出的位由ACCU 1中移出位的信号状态填充。最后移出的位被装载到状态位CC 1中。而地址〈数目〉或ACCU 2-L-L中的数值则指定要循环移位的位数目。

RLD〈数目〉:地址〈数目〉指定循环移位的数目。允许的数值范围为0~32。当〈数目〉大于0时,将状态字的位CC 0和OV复位为0。当〈数目〉等于0时,则将此循环移位指令视为NOP操作。

RLD:循环移位的数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。当ACCU2-L-L内的数值大于0时,将状态字的位CC 0和OV复位为0。如果循环移位的数目为零,则将此循环移位指令视为NOP操作。

例:

978-7-111-46052-7-Chapter04-274.jpg

RRD(循环右移双字)逐位向右循环移动ACCU 1的整个内容。循环移位指令空出的位由ACCU 1中移出位的信号状态填充。最后移出的位被装载到状态位CC 1中。而地址〈数目〉或ACCU 2-L-L中的数值则指定要循环移位的位数目。

RRD〈数目〉:地址〈数目〉指定循环移位的数目。允许的数值范围为0~32。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此循环移位指令视为NOP操作。

RRD:循环移位的数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。当ACCU2-L-L的数值大于0时,复位状态字的位为0。

例:

978-7-111-46052-7-Chapter04-275.jpg

(9)RLDA 通过CC 1循环左移ACCU 1(32位)

指令格式为:RLDA

RLDA(通过CC 1循环左移双字)通过CC 1将ACCU 1的整个内容循环左移1位。复位状态字CC 0和OV为0。

978-7-111-46052-7-Chapter04-276.jpg

(10)RRDA 通过CC 1循环右移ACCU 1(32位)

指令格式为:RRDA

RRDA(通过CC 1循环右移双字)将ACCU 1的整个内容循环向右移动1位。复位状态字的位CC 0和OV为0。

978-7-111-46052-7-Chapter04-277.jpg(www.xing528.com)

978-7-111-46052-7-Chapter04-278.jpg

2.梯形图(LAD)的移位和循环移位指令

(1)SHR_I 整数右移

指令符号为:

EN(使能输入)和ENO(起用输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为INT,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(移位指令的结果)的数据类型为INT型,存储区为I、Q、M、L、D。

978-7-111-46052-7-Chapter04-279.jpg

SHR_I(整数右移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHR_I指令用于将输入IN的0~15位逐位向右移动。16~31位不受影响。输入N用于指定移位的位数。如果N大于16,命令将按照N等于16的情况执行。自左移入的、用于填补空出位的位置将被赋予位15的逻辑状态(整数的符号位),如图4-10所示。这意味着,当该整数为正时,这些位将被赋值“0”,而当该整数为负时,则被赋值为“1”。可在输出OUT位置扫描移位指令的结果。如果N不等于0,则SHR_I会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。

978-7-111-46052-7-Chapter04-280.jpg

图4-10 整数右移

例:

SHR_I框由I0.0位置上的逻辑“1”激活。装载MW0并将其右移由MW2指定的位数。结果将被写入MW4。置位Q4.0。

978-7-111-46052-7-Chapter04-281.jpg

(2)SHR_DI 右移长整数

指令符号为:

EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为DINT,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(移位指令的结果)的数据类型为DINT型,存储区为I、Q、M、L、D。

978-7-111-46052-7-Chapter04-282.jpg

SHR_DI(右移长整数)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHR_DI指令用于将输入IN的0~31位逐位向右移动。输入N用于指定移位的位数。如果N大于32,命令将按照N等于32的情况执行。自左移入的、用于填补空出位的位置将被赋予位31的逻辑状态(整数的符号位)。这意味着,当该整数为正时,这些位将被赋值“0”,而当该整数为负时,则被赋值为“1”。可在输出OUT位置扫描移位指令的结果。如果N不等于0,则SHR_DI会将CC0位和OV位设为“0”。ENO与EN具有相同的信号状态。

SHR_DI框由I0.0位置上的逻辑“1”激活。装载MD0并将其右移由MW4指定的位数。结果将被写入MD10。置位Q4.0。

978-7-111-46052-7-Chapter04-283.jpg

(3)SHL_W 字左移

指令符号为:

EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为WORD,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(字移位指令的结果)的数据类型为WORD,存储区为I、Q、M、L、D。

978-7-111-46052-7-Chapter04-284.jpg

SHL_W(字左移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHL_W指令用于将输入IN的0~15位逐位向左移动。16~31位不受影响。输入N用于指定移位的位数。若N大于16,此命令会在输出OUT位置上写入“0”,并将状态字中的CC 0和OV位设置为“0”。将自右移入N个零,用以补上空出的位置,如图4-11所示。可在输出OUT位置扫描移位指令的结果。如果N不等于0,则SHL_W会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。

978-7-111-46052-7-Chapter04-285.jpg

图4-11 整数左移

例:

SHL_W框由I0.0位置上的逻辑“1”激活。装载MW0并将其左移由MW2指定的位数。结果将被写入MW4。置位Q4.0。

978-7-111-46052-7-Chapter04-286.jpg

(4)SHR_W 字右移

指令符号为:

EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为WORD,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(字移位指令的结果)的数据类型为WORD,存储区为I、Q、M、L、D。

978-7-111-46052-7-Chapter04-287.jpg

SHR_W(字右移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHR_W指令用于将输入IN的0~15位逐位向右移动。16~31位不受影响。输入N用于指定移位的位数。若N大于16,此命令会在输出OUT位置上写入“0”,并将状态字中的CC 0位和OV位设置为“0”。将自左移入N个零,用以补上空出的位置。可在输出OUT位置扫描移位指令的结果。如果N不等于0,则SHR_W会将CC 0位和OV位设为“0”。ENO与EN有相同的信号状态。

例:

SHR_W框由I0.0位置上的逻辑“1”激活。装载MW0并将其右移由MW2指定的位数。结果将被写入MW4。置位Q4.0。

978-7-111-46052-7-Chapter04-288.jpg

(5)SHL_DW 双字左移

指令符号为:

EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为DWORD,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(双字移位指令的结果)的数据类型为DWORD,存储区为I、Q、M、L、D。

SHL_DW(双字左移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHL_DW指令用于将输入IN的0~31位逐位向左移动。输入N用于指定移位的位数。若N大于32,此命令会在输出OUT位置上写入“0”并将状态字中的CC 0和OV位设置为“0”。将自右移入N个零,用以补上空出的位置。可在输出OUT位置扫描双字移位指令的结果。如果N不等于0,则SHL_DW会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。

978-7-111-46052-7-Chapter04-289.jpg

例:

SHL_DW框由I0.0位置上的逻辑“1”激活。装载MD0并将其左移由MW4指定的位数。结果将被写入MD10。置位Q4.0。

(6)SHR_DW 双字右移

指令符号为:

EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为DWORD,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(双字移位指令的结果)的数据类型为DWORD,存储区为I、Q、M、L、D。

978-7-111-46052-7-Chapter04-290.jpg

978-7-111-46052-7-Chapter04-291.jpg

SHR_DW(双字右移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHR_DW指令用于将输入IN的0~31位逐位向右移动。输入N用于指定移位的位数。若N大于32,此命令会在输出OUT位置上写入“0”并将状态字中的CC 0位和OV位设置为“0”。将自左移入N个零,用以补上空出的位置,如图4-12所示。可在输出OUT位置扫描双字移位指令的结果。如果N不等于0,则SHR_DW会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。

978-7-111-46052-7-Chapter04-292.jpg

图4-12 双字右移

例:

SHR_DW框由I0.0位置上的逻辑“1”激活。装载MD0并将其右移由MW4指定的位数。结果将被写入MD10。置位Q4.0。

978-7-111-46052-7-Chapter04-293.jpg

(7)ROL_DW 双字循环左移

指令符号为:

978-7-111-46052-7-Chapter04-294.jpg

EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要循环移位的值)的数据类型为DWORD,存储区为I、Q、M、L、D。N(要循环移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(双字循环指令的结果)的数据类型为DWORD,存储区为I、Q、M、L、D。

ROL_DW(双字循环左移)指令通过使能(EN)输入位置上的逻辑“1”来激活。ROL_DW指令用于将输入IN的全部内容逐位向左循环移位。输入N用于指定循环移位的位数。如果N大于32,则双字IN将被循环移位((N-1)对32求模,所得的余数)+1位。自右移入的位置将被赋予向左循环移出的各个位的逻辑状态,如图4-13所示。可在输出OUT位置扫描双字循环指令的结果。如果N不等于0,则ROL_DW会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。

978-7-111-46052-7-Chapter04-295.jpg

图4-13 双字循环左移

例:

ROL_DW框由I0.0位置上的逻辑“1”激活。装载MD0并将其向左循环移位由MW4指定的位数。结果将被写入MD10。置位Q4.0。

978-7-111-46052-7-Chapter04-296.jpg

(8)ROR_DW 双字循环右移

指令符号为:

978-7-111-46052-7-Chapter04-297.jpg

EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要循环移位的值)的数据类型为DWORD,存储区为I、Q、M、L、D。N(要循环移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(双字循环指令的结果)的数据类型为DWORD,存储区为I、Q、M、L、D。

ROR_DW(双字循环右移)指令通过使能(EN)输入位置上的逻辑“1”来激活。ROR_DW指令用于将输入IN的全部内容逐位向右循环移位。输入N用于指定循环移位的位数。如果N大于32,则双字IN将被循环移位((N-1)对32求模,所得的余数)+1位。自左移入的位置将被赋予向右循环移出的各个位的逻辑状态,如图4-14所示。可在输出OUT位置扫描双字循环指令的结果。如果N不等于0,则ROR_DW会将CC 0位和OV位置为“0”。ENO与EN具有相同的信号状态。

978-7-111-46052-7-Chapter04-298.jpg

图4-14 双字循环右移

例:

ROR_DW框由I0.0位置上的逻辑“1”激活。装载MD0并将其向左循环移位由MW4指定的位数。结果将被写入MD10。置位Q4.0。

978-7-111-46052-7-Chapter04-299.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈