本人所写的博客都为开发之中遇到问题记录的随笔,主要是给自己积累些问题。免日后无印象,如有不当之处敬请指正(欢迎进扣群 24849632 探讨问题);
写在专栏前面https://blog.csdn.net/Junping1982/article/details/129955766
INFINONE XC164单片机逆向记录(1)资料准备https://blog.csdn.net/Junping1982/article/details/129945022
INFINONE XC164单片机逆向记录(2)反汇编https://blog.csdn.net/Junping1982/article/details/129949983
特别声明:未经授权,请勿转载
---- 文接上章 -------------------------------
一、阅读问题:
在阅读汇编代码中发现有些指令符号不及熟悉, 比如
movb byte_C0B9, ONES
movb byte_C0BA, ZEROS
movb byte_C0BB, ONES
movb byte_C0BC, ZEROS
或
jmpr cc_NZ, loc_C0170C
jmpr cc_ULE, loc_C01778
二、经过资料查找明确
2.1 系统常数,该常数定义于ALU内
序号 | 符号 | 值 |
1 | ONES | -1 |
2 | ZEROS | 0 |
4.10 Constant Registers All bits of these bit-addressable registers are fixed to 0 or 1 by hardware. These registers can be read only. Register ZEROS/ONES can be used as a register-addressable constant of all zeros or all ones, for example for bit manipulation or mask generation. The constant registers can be accessed via any instruction capable of addressing an SFR.
2.2 执行条件
序号 | 符号 | 条件 | 说明 |
1 | cc_UC | 无条件跳转 | Unconditional |
2 | cc_Z | 为0跳转 | zero |
3 | cc_NZ | 不为0跳转 | not zero |
4 | cc_V | 有溢出时跳转 | Overflow |
5 | cc_NV | 无溢出时跳转 | No Overflow |
6 | cc_N | 为负时跳转 | Negative |
7 | cc_NN | 不为负时跳转 | Not Negative |
8 | cc_C | 有借/进位时跳转 | carry |
9 | cc_NC | 无借/进位时跳转 | No Carry |
10 | cc_EQ | 相等时跳转 | Equal |
11 | cc_NE | 不等时跳转 | Not Equal |
12 | cc_ULT | 小于时跳转 | Unsigned Less Than |
13 | cc_ULE | 小于等于时跳转 | unsigned less then or equal to |
14 | cc_UGE | 大于等于时跳转 | Unsigned Greater Than or Equal |
15 | cc_UGT | 大于时跳转 | Unsigned Greater Than |
16 | cc_SLE | 小于等于时(有符号)跳转 | Signed Less Than or Equal |
17 | cc_SGE | 大于等于时(有符号)跳转 | Signed Greater Than or Equal |
18 | cc_SGT | 大于时(有符号)跳转 | Signed Greater Than |
19 | cc_NET | 不等且非表格结束跳转 | Not Equal and Not End-of-Table |
20 | cc_nusr0 | 用户位0被清除时跳转 | USR-bit 0 is cleared(a) |
21 | cc_nusr1 | 用户位1被清除时跳转 | USR-bit 1 is cleared(a) |
22 | cc_usr0 | 用户位0被设置时跳转 | USR-bit 0 is set(a) |
23 | cc_usr1 | 用户位1被设置时跳转 | USR-bit 1 is set(a) |
(a). 仅可用于JMPA及CALLA指令
三、指令系统
3.1 算数指令
指令1 | 指令2 | 功能描述 |
ADD | ADDB | 两字或字节加法 |
ADDC | ADDCB | 带进位的两字或字节加法 |
SUB | SUBB | 两字或字节减法 |
SUBC | SUBCB | 带进位的两字或字节减法 |
MUL | MULU | 16位乘16位带符号或无符号乘法 |
DIV | DIVU | 16位除16位带符号或无符号除法 |
DIVL | DIVLU | 32位除16位带符号或无符号除法 |
CPL | CPLB | 一个字或字节的1的补数 |
NEG | NEGB | 一个字或字节的2的补数 |
3.2 逻辑指令
AND | ANDB | 两字或字节位与 |
OR | ORB | 两字或字节位或 |
XOR | XORB | 两字或字节位与或 |
3.3 比较指令
CMP | CMPB | 两字或字节比较 |
CMPI1 | CMPI2 | 带增长1或2的两字比较 |
CMPD1 | CMPD2 | 带增长1或2的两字比较 |
3.4 布尔位操作指令
BFLDH/BFLDL | 字的高位字节或低位字节的可屏蔽位的操作 |
BSET | 对某位置1 |
BCLR | 对某位清零 |
BMOV | 移动某一位 |
BMOVN | 反相移动某位 |
BAND | 两位相与 |
BOR | 两位相或 |
BXOR | 两位相与或 |
BCMP | 两位比较 |
3.5 移位和循环移位指令
SHR | 字右移 |
SHL | 字左移 |
ROR | 字循环右移 |
ROL | 字循环左移 |
ASHR | 带符号位右移 |
3.6 优先级指令
3.7 数据移动指令
MOV | 标准字数据移动 |
MOVB | 标准字节数据移动 |
MOVBS | 字节到字有符号扩展移动 |
MOVBZ | 字节到字零扩展移动 |
3.8 栈指令
3.9 跳转指令
JMPA/JMPI/JMPR | 当前程序段有条件跳转到绝对、间接或相对目标地址 |
JMPS | 在任何程序段无条件跳转到绝对目标地址 |
JB/JNB | 根据选择位的状态,在当前程短有条件跳转到相对目标地址 |
JBC/JNBS | 根据选择位的状态,用取反测试位,在当前程序段有条件跳转到相对目标地址 |
3.10 调用指令
CALLA/CALLI | 在当前程序段中有条件调用绝对或间接地址的子程序 |
CALLR | 在当前程序段中无条件调用相对地址的子程序 |
CALLS | 在当前程序中无条件调用绝对地址的子程序 |
PCALL | 在当前程序段中将选择寄存器压入堆栈无条件调用绝对地址的子程序 |
TRAP | 在程序段中无条件跳转到中断或陷阱矢量跳转表 |
3.11 返回指令
RET | 在当前程序段从子程序返回 |
RETS | 在任何程序段从子程序返回 |
RETP | 在当前程序段从子程序返回,外加从系统堆栈中弹出一个选择寄存器 |
RETI | 从中断服务程序中返回 |
3.12 系统控制指令
SRST | 通过软件复位 |
IDLE | 进入休闲状态 |
PWRDN | 进入掉电状态 |
SRVWDT | 服务看门狗定时器 |
DISWDT | 关闭看门狗定时器 |
ENWDT | 打开看门狗定时器 |
EINIT | 完成初始化(置位RSTOUT) |
3.13 杂项指令
NOP | 空操作指令 |
ATOMIC | 定义不可分割的指令序列 |
EXTR | 开启外部SFR空间的'reg', 'bitoff', 'bitaddr'地址模式 |
EXTP / EXTPR | 使用特定数据页而不是DPP覆盖DPP寻址方案,并可选择切换到ESFR空间 |
EXTS / EXTSR | 使用特定段而不是DPP覆盖DPP寻址方案,并可选择切换到ESFR空间 |
3.14 MAC单元指令
参考链接