8.3.4 /R 作为浮点数(32位,IEEE-FP),累加器2的内容除以累加器1的内容
11 移位和循环移位指令
11 移位和循环移位指令
11.1 移位指令
11.1.1 移位指令概述
说明
使用移位指令,可以将累加器 1 低字中的内容或整个累加器的内容向左或向右逐 位移动(请参见“CPU 寄存器”)。将累加器中的内容左移相当于完成乘 2 加 权;将累加器中的内容右移相当于完成除 2 加权的运算。例如,如果将十进制数 值“3”的等效二进制数左移 3 位,则累加器中的结果是十进制数“24”的二进 制数。如果将十进制数 值“16”的等效二进制数右移 2 位,则累加器中的结果 是十进制数“4”的二进制数。
移位指令后的数字或累加器 2 低字中低字节的数字,指出需移几位。执行移位指 令所空出的位既可以用零填入,也可以用符号位的信号状态填入(“0”代表“正”,
“1”代表“负”)。最后移出的位装入状态字的 CC 1 位。状态字的 CC 0 和 OV 位清零。可用跳转指令判断 CC 1 位的状态。移位操作是无条件的,也就是说,
它们的执行不根据任何条件,也不影响逻辑运算结果。
下述移位指令可供使用:
• SSI 移位有符号整数(16 位)
• SSD 移位有符号双整数(32 位)
• SLW 字左移(16 位)
• SRW 字右移(16 位)
• SLD 双字左移(32 位)
• SRD 双字右移(32 位)
长沙工控帮教育科技有限公司整理
11.1.2 SSI 移位有符号整数(16 位)
格式:
SSI
SSI <数值>
地 址 数据类型 说 明
<数值> 整数,无符号 移位的位数在 0 和 15 之间。
说明
使用 SSI(右移有符号整数)指令,可以将累加器 1 低字中的内容逐位右移。由 移位指令空出的位用符号位(位 15)的信号状态填充。最后移出的位被装入状态 字位 CC 1。要移位的位数可以通过地址<数值>或通过累加器 2 低字低字节中的 数值定义。
SSI <数值>:移位位数通过地址 <数值> 定义。允许数值范围为 0 – 15。如果 <
数值> 大于“0”,则 CC 0 和 OV 状态字位被置为“0”。如果 <数值> 等于
“0”,则移位指令相当于空操作(NOP)。
SSI:移位的位数通过累加器 2 低字低字节中的数值定义。允许数值范围为 0 – 255。如果移位位数大于 16,则总是产生相同结果(ACCU 1 = 16#0000,CC 1 = 0,或 ACCU 1 = 16#FFFF,CC 1 = 1)。如果移位位数大于“0”,则状态字位 CC 0 和 OV 被置为“0”。如果移位位数等于“0”,则移位指令相当于空操作
(NOP)。
状态字
BR CC 1 CC 0 OV OS OR STA RLO /FC
写: - x x x - - - - -
举例
内 容 累加器 1 高字 累加器 1 低字
位 31... .. .. ...16 15... .. .. ...0 SSI 6 执行之前 0101 1111 0110 0100 1001 1101 0011 1011 SSI 6 执行之后 0101 1111 0110 0100 1111 1110 0111 0100
举例 1
长沙工控帮教育科技有限公司整理
11-3 255。如果移位位数大于 32,则总是产生相同结果(ACCU 1 = 32#00000000,
CC 1 = 0 或 ACCU 1 = 32#FFFFFFFF,CC 1 = 1)。如果移位位数大于“0”,
举例
内 容 累加器 1 高字 累加器 1 低字
位 31... .. .. ...16 15... .. .. ...0 SSD 7 执行之前 1000 1111 0110 0100 0101 1101 0011 1011 SSD 7 执行之后 1111 1111 0001 1110 1100 1000 1011 1010
举例 1
STL 解 释 L MD4
SSD 7 T MD8
// 将数值装入累加器 1 中。
// 将累加器 1 中的位右移 7 位,包括符号位。
// 将结果传送到存储双字 MD8。
举例 2
STL 解 释 L +3
L MD20
SSD
JP NEXT
// 将数值“+3”装入累加器 1 中。
// 将累加器 1 中的内容装入累加器 2 中。将存储字 MD20 的值装入累 加器 1 中。
// 移位位数为累加器 2 低字低字节中的数值 => 将累加器 1 中的内容 右移 3 位,包括符号位;空出的位以符号位的信号状态填充。
// 如果最后移出的位(CC 1) = 1,则跳转到 NEXT 跳转标号。
长沙工控帮教育科技有限公司整理
11-5
举例 2
11-7
SLD:移位的位数通过累加器 2 低字低字节中的数值定义。允许数值范围为 0 –
11-9
11.2 循环移位指令
11.2.1 循环移位指令概述
说明
使用循环移位指令,可以将累加器 1 中的全部内容循环地逐位左移或右移(参见
“CPU 寄存器”)。循环移位指令触发类同于第 14.1 节描写的移位指令。所不 同的是,空位填以从累加器中移出的位。
循环移位指令后的数字或累加器 2 低字低字节中的数字,指出需移几位。根据指 令,通过状态字的 CC 1 位执行循环。状态字的 CC 0 位复位为“0”。
下述循环移位指令可供使用:
• RLD 双字循环左移(32 位)
• RRD 双字循环右移(32 位)
• RLDA 通过 CC 1 累加器 1 循环左移(32 位)
• RRDA 通过 CC 1 累加器 1 循环右移(32 位)
11.2.2 RLD 双字循环左移(32 位)
格式
RLD
RLD <数值>
地 址 数据类型 说 明
<数值> 整数,无符号 循环移位的位数在 0 和 32 之间。
长沙工控帮教育科技有限公司整理
11-11
RLD <数值>:循环移位位数通过地址<数值>定义。
允许数值范围为 0 – 32。如果 <数值> 大于“0”,则 CC 0 和 OV 状态字位
11.2.3 RRD 双字循环右移(32 位)
格式:
RRD
RRD <数值>
地 址 数据类型 说 明
<数值> 整数,无符号 循环移位的位数在 0 和 32 之间。
说明
使用 RRD(双字循环右移)指令,可以将累加器 1 中的内容逐位循环右移。通 过循环移位指令空出的位都填充以从累加器 1 移出位的信号状态。最后循环移出 的位被装入状态字位 CC 1。要循环移位的位数可以通过地址<数值>或通过累加 器 2 低字低字节中的数值定义。
RRD <数值>:循环移位位数通过地址<数值>定义。
允许数值范围为 0 – 32。如果 <数值> 大于“0”,则 CC 0 和 OV 状态字位 被置为“0”。如果 <数值> 等于“0”,则循环移位指令相当于空操作(NOP)。
RRD:循环移位的位数通过累加器 2 低字低字节中的数值定义。允许数值范围为 0 – 255。如果累加器 2 低字低字节中的数值大于“0”,则状态字位被置为“0”。
状态字
BR CC 1 CC 0 OV OS OR STA RLO /FC
写: - x x x - - - - -
举例
内 容 累加器 1 高字 累加器 1 低字
位 31... .. .. ...16 15... .. .. ...0 RRD 4 执行之前 0101 1111 0110 0100 0101 1101 0011 1011 RRD 4 执行之后 1011 0101 1111 0110 0100 0101 1101 0011
举例 1
STL 解 释
L MD2 // 将数值装入累加器 1 中。
长沙工控帮教育科技有限公司整理
11-13
11.2.5 RRDA 通过 CC 1 累加器 1 循环右移(32 位)
格式
RRDA
说明
使用该指令,可以将累加器 1 中的全部内容循环右移 1 位。状态字位 CC 0 和 OV 被置为“0”。
状态字
BR CC 1 CC 0 OV OS OR STA RLO /FC
写: - x 0 0 - - - - -
举例
内 容 CC 1 累加器 1 高字 累加器 1 低字
位 31... .. .. ...16 15... .. .. ...0 RRDA 执行之前 X 0101 1111 0110 0100 0101 1101 0011 1011 RRDA 执行之后 1 X010 1111 1011 0010 0010 1110 1001 1101
(X = 0 或 1,CC 1 的先前信号状态)
STL 解 释 L MD2
RRDA JP NEXT
// 将存储双字 MD2 的数值装入累加器 1。
// 将累加器 1 中的内容通过 CC 1 循环右移 1 位。
// 如果最后循环移出的位(CC 1) = 1,则跳转到 NEXT 跳转标号。