fx-991CN X bug笔记——CPU篇

计算器使用nX-U16芯片,有些实现我特别地提一下。更具体的内容请查阅nX-U16文档。

通用寄存器

有16个字节。按单个字节可以拆为R0、R1、……、R15。按两个字节可以拆为ER0、ER2、……、ER14。按四个字节可以拆为XR0、……、XR12。按八个字节可以拆为QR0与QR8。

这里,多个字节的拼装时,编号小的在低位,即小端存储

程序计数器

PC长2B,与CSR(4b)一起构成CSR:PC,存20b,指向CPU执行的指令。一般PC自增不会影响CSR的值。

MOV和ADD指令

指令MOV a, b:将b赋值给a

指令ADD a, b:将a+b赋值给a

条件判断

指令CMP a, b:比较a与b,内部实际进行a-b的计算

PSW是个控制寄存器,叫做程序状态字,长8b,有5个标志位各1b,1个控制位1b,1个字段2b。

PSW从高到低分别是Carry、Zero、Sign、后面我们不常用。

  • Carry:表示计算是否进位或借位
  • Zero:表示计算结果是否为0
  • Sign:表示计算结果是否为负

MOV指令只更新Z与S,而ADD、CMP对C、Z、S都有更新。

指令B xxx:跳转到xxx,即将CSR:PC设为xxx

指令BC cond xxx:如果满足条件,跳转到xxx。这里,cond可以为:AL(无条件)、EQ、NE、LT、GE、LE、GT等。

2字节对齐栈顶在低字节,栈内以小端序存储内容。寄存器SP长2B,保存栈顶位置。

在调用PUSH/POP LR/PC时,LCSR/CSR也会被压入/弹出栈。因此如果栈顶存储LCSR:LR/CSR:PC,那么栈顶四字节从低地址到高地址依次为:LR/PC,半字节+LCSR/CSR,一字节。

函数调用

传参规定

卡西欧使用的编译器的调用约定规定,传参可用R0~R3与栈,返回值可用R0~R3,剩余寄存器保持不变。因此,在汇编中常常可以看见函数开头PUSH一些寄存器,结尾再POP出来。

单层调用实现

LCSR:LR与CSR:PC大小相同,前者的用处就是备份后者。

指令BL xxx:将LCSR:LR设置为下一条指令的位置,接着跳转到xxx。

指令RT:将CSR:PC设置为LCSR:LR。

如果函数内部不使用BL指令,那么在函数结尾RT,就可以实现了。

多层调用实现

在函数开头PUSH LR,结尾POP PC,就可以实现了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值