|
发表于 2021-8-18 14:15:28
|
显示全部楼层
写几个关于MSP430 MCU的细节问题哈
MSP430的CPUALU单元仅仅接收MCLK时钟,CPU寄存器的R0到R3均为特殊功能寄存器,依次为PC,SP,SR/CG1,R3/GC2
其中PC的为程序指针,但由于任意程序均存储起始地址都在偶数字节,故每次PC至少要+2。(与cortexM不同,cortexM每次加4)
SP是堆栈指针,遵循满减小策略,同样由于16位的关系,每次出栈入栈都是加/减2的。(cortexM为每次加减4byte/8byte)
SR本身有三部分功能,系统状态管理,计算逻辑结果表示(进位,负数等),还与R3共同充当常数发生器的角色,
常数发生器是整个程序运行使用的,当调用特定常数时,编译器会直接自动调用SR或者R3。具体采用的常数值,由每条指令内部As(2位二进制)控制。此时As不具有一般意义上的对于操作数的地址模式控制功能,转而实现常数选择功能,共计6个常数。由于在汇编指令中As的值是不可见的,所以看起来就会十分的别扭,
比如MOV R3,R4. 由于As的隐藏,不知道对应具体的R3值。由于每次调用R3或SR的时候不会使用CG1或CG2这两个名字,假如不清楚MSP430的R3特殊使用机制,而仅仅当成普通寄存器,则很难理解为什么可以不对R3进行任何预先赋值的情况下直接调用不会出错(换句话说,在使用R3)。
有些时候,常数发生器的使用会和其他方式结合会更加晦涩。比如模拟指令 CLR ,R4 该指令没有单独的指令码,每次会被转化位等效的MOV R3,R4. 具体分析时候要结合As的位来分析,所以会复杂的很。
这个指令集的操作很有意思,实际的内核以外的访问基本都是由间接寻址完成的,地址的模式由2个As位1个Ad位共同组成,其中源寄存器支持7种寻址,目标地址寄存器支持4种寻址。(这个部分也涉及到了转译,客观上所有操作都被变换为针对某个CPU寄存器的操作,显示的汇编代码和实际ROM存储的指令并非一致。)
比如 MOV EDE,TONI 这种指令里面的源操作数与目标操作的地址都是用标签来代替的,实际在ROM指令为MOV X(PC), Y(PC) 其中EDE=PC+X ,TONI=PC+Y。
这个指令也是有细节的,首先这个汇编指令为符号模式,而ROM中的模式为索引模式,这两种模式采用相同的AS值标记。
并且这个指令在运行时候是要读取PC的值的,每次读取PC,PC的值就会加2,该指令会共计读取PC 3次,故执行后PC值会直接加6。虽然指令本身仅仅占据了两个字节(16bit),但是后续需要两个16位空间存储X,Y.故此该操作实际需要6个字节的存储空间。
以上的关于每条指令实际长度受到地址模式影响的这个东西会在不同版本手册里面会被解释为附加的源/目标地址,仅用于特定的地址模式。
这也解释为什么在MSP430 1类II类指令格式里面仅仅留给每个操作数4位,因为这个指令集设计的初衷就是基于CPU寄存器进行工作的。
后面的时候还要仔细研究这问题,这个对于分析每条指令实际占用的长度非常重要。
这个初始设计也是够费心思了,除了直接写在手册上面的上面指令转义,还有这种操作数转移隐含在里面。
后面还要研究一下,有些玩意还有疑问。 |
|