主题
块操作与栈操作
ANB — 回路块串联
将两个回路块串联连接(块与)。无操作数。
LD X0
OR X1 ; 回路块 A
LD X2
OR X3 ; 回路块 B
ANB ; A 串联 B
OUT Y0ORB — 回路块并联
将两个回路块并联连接(块或)。无操作数。
LD X0
AND X1 ; 回路块 A
LD X2
AND X3 ; 回路块 B
ORB ; A 并联 B
OUT Y0MPS — 进栈
MRD — 读栈
MPP — 出栈
| 指令 | 名称 | 功能 |
|---|---|---|
| MPS | 进栈 | 将当前运算结果压入栈(栈指针+1) |
| MRD | 读栈 | 读取栈顶内容(栈指针不变) |
| MPP | 出栈 | 弹出栈顶内容(栈指针-1) |
用于多分支输出时保存中间逻辑结果。
LD X0
MPS ; 保存 X0 状态
AND X1
OUT Y0 ; 第一路输出:X0 AND X1
MRD ; 读取 X0 状态
AND X2
OUT Y1 ; 第二路输出:X0 AND X2
MPP ; 恢复 X0 状态
AND X3
OUT Y2 ; 第三路输出:X0 AND X3变址寄存器栈:ZPUSH / ZPOP
上面那三个栈存的是运算结果(通断状态)。ZPUSH/ZPOP 存的是变址寄存器 Z0~Z7、V0~V7 里的数, 用在子程序和中断程序里:进去之前压一次,出来之前弹一次,主程序用着的 Z/V 就不会被子程序改掉。
ZPUSH — 把 Z0~Z7、V0~V7 压进栈
| 项目 | 说明 |
|---|---|
| 格式 | ZPUSH S(S = 栈头所在的数据寄存器) |
| 操作数 | 1 个,字软元件(D/R),不能用常数 |
| 示例 | ZPUSH D100 |
| 步数 | 3 |
| FNC | FNC 102 |
S 那一格存的是已经压了几层(第一次用之前要先 MOV K0 D100 清成 0),数据从 S+1 开始往下排: 第 1 层占 S+1 ~ S+16,第 2 层占 S+17 ~ S+32,依此类推。每层 16 个字的顺序固定是 Z0 V0 Z1 V1 Z2 V2 … Z7 V7。压完栈层数自动 +1。
ZPUSH D100 ; 现场进栈,D100 记着现在几层数据区要按最深层数留够,越界不报错
压 N 层就要用掉 1 + N×16 个连续的 D。固件不检查这一片有没有超出 D 的范围, 超出后会写到 D 区之外的元件上 —— 表现是别处的数据莫名其妙变了,很难查。 按您实际最深会用几层来算:压 4 层就是 D100~D164 共 65 个字。
ZPOP — 弹出并恢复 Z/V
| 项目 | 说明 |
|---|---|
| 格式 | ZPOP S(与 ZPUSH 同一个栈头) |
| 操作数 | 1 个,字软元件 |
| 示例 | ZPOP D100 |
| 步数 | 3 |
| FNC | FNC 103 |
按"后压的先弹"恢复:把 S 记的层数减 1,取那一层的 16 个字写回 Z0~Z7、V0~V7。
栈空了还弹会报错
层数已经是 0 时再执行 ZPOP,置 M8067(运算错误)、D8067 = 6781,本次不做任何恢复。 配对写:ZPUSH 和 ZPOP 用同一个栈头软元件,且都在同一条执行路径上 —— 跳转跳过 ZPUSH 却没跳过 ZPOP,层数就会一路减到 0 然后报 6781。
这两条没有 32 位形态(不存在 DZPUSH),只搬 Z/V 这一组;D 寄存器要自己 BMOV 保存。