本帖最后由 yuxuanchiadm 于 2014-9-30 16:50 编辑

主贴:http://www.mcbbs.net/thread-197233-1-1.html
上一教程:基础教程1

1.基本程序结构
APC中总共有4套指令集:
  1. CPU指令集 - 包含基础的运算指令
  2. AdvCPU指令集 - 包含高级CPU指令
  3. FPU指令集 - 包含浮点数运算指令
  4. 伪指令集 - 编译器提供的辅助指令
复制代码
其中最常用的还是CPU指令集,其中包含了基本的运算指令、位操作指令和比较指令,分别如下:
  1. 运算指令:
  2. 1    |   0x0001  | SET A,B  | 设置 A 为 B
  3. 2    |   0x0002  | ADD A,B | 设置 A 为 A 加 B
  4. 3    |   0x0003  | SUB A,B  | 设置 A 为 A 减 B
  5. 4    |   0x0004  | MUL A,B | 设置 A 为 A 乘 B
  6. 5    |   0x0005  | DIV A,B  | 设置 A 为 A 除以 B,B为0则A不变,寄存器O为0xA
  7. 6    |   0x0006  | MOD A,B| 设置 A 为 A 除以 B 的余数,B为0则A不变,寄存器O为0xA
  8. 位操作指令:
  9. 7    |   0x0007  | AND A,B | 设置 A 为 A 按位与 B (位都为1结果位才为1)
  10. 8    |   0x0008  | BOR A,B | 设置 A 为 A 按位或 B (任意一位为1结果位就为1)
  11. 9    |   0x0009  | XOR A,B | 设置 A 为 A 按位异或 B (不同位为1,同位为0)
  12. 10   |  0x000a  | SHR A,B  | 设置 A 为 A 添零按位右移 B 位
  13. 11   |  0x000b  | ASR A,B  | 设置 A 为 A 按位右移 B 位
  14. 12   |  0x000c  | SHL A,B  | 设置 A 为 A 按位左移 B 位
  15. 比较指令:
  16. 13   |  0x000d  | IFE A,B   | 当 A 等于 B 时执行下一条指令,否则跳过
  17. 14   |  0x000e  | IFN A,B   | 当 A 不等于 B 时执行下一条指令,否则跳过
  18. 15   |   0x000f  | IFA A,B   | 当 A 大于 B 时执行下一条指令,否则跳过
  19. 16   |  0x0010  | IFU A,B   | 当 A 小于 B 时执行下一条指令,否则跳过
复制代码
比如设置当前寄存器X为100,Y为54。并将其相乘并赋值给Z,然后判断是否大于1000。如果大于则设置A为1,则可以这么写:
  1. SET X,100
  2. SET Y,54

  3. SET Z,X
  4. MUL Z,Y
  5. IFA Z,1000
  6.     SET A,0
复制代码
注意所有运算和位操作指令都会更改A参数的值。
当有大量数据需要保存的时候,寄存器就不够用了,这时候我们需要将其保存在内存中,还是上面的例子,只不过现在我们把Z替换成内存位置8192:
  1. SET X,100
  2. SET Y,54

  3. SET Z,X
  4. MUL [8192],Y
  5. IFA [8192],1000
  6.     SET A,0
复制代码
因为上面的X和Y寄存器的值是不变的,所以我们也可以使用字面量替代:
  1. SET Z,100
  2. MUL [8192],54
  3. IFA [8192],1000
  4.     SET A,0
复制代码
有时候,我们需要根据某些条件的不同执行不同的代码块,如下伪代码所示:
  1. if(A > 200)
  2. {
  3.     B = -1
  4. }
  5. else
  6. {
  7.     B = A * 10
  8. }
复制代码
在APC中跳转由JSR指令来实现,如果将其转换为APC汇编语言则是:
  1. IFA A 200
  2.     JSR l1
  3. :l0
  4.     SET B,A
  5.     MUL B,10
  6. JSR l2
  7. :l1
  8.     SET B,-1
  9. JSR l2
  10. :l2
复制代码
2.字面量
APC中总共有14种字面量:
  1. Dec - 十进制有符号整数
  2. Hex - 十六进制无符号整数
  3. Oct - 八进制无符号整数
  4. Bin - 二进制无符号整数
  5. Reg - 寄存器
  6. MemReg - 寄存器索引内存
  7. MemDec - 十进制有符号整数索引内存
  8. MemHex - 十六进制无符号整数索引内存
  9. MemOct - 八进制无符号整数索引内存
  10. MemBin - 二进制无符号整数索引内存
  11. String - 字符串
  12. Char - 字符
  13. Lable - 标签
  14. Real - 浮点
复制代码


(当你看到这里时某触还在继续码字)