我目前正在研究PIC,我们使用了MOVLW(Move literal to Write regiser),MOVWF(将写入寄存器移动到指定文件位置)等命令,但我很好奇为什么没有命令允许你MOVLF,或直接将文字移动到文件寄存器?这将跳过使用写寄存器的步骤,只需1个指令周期而不是2个。
感谢您的帮助
答案 0 :(得分:1)
有两个8位PIC系列和指令集,PIC16和PIC18(甚至PIC12)!
请记住这是RISC(缩减指令代码集)。
单个PIC16指令为14位宽,PIC18为16位宽!因此,您可以看到您无法将8位地址和8位字面值放入一个指令中。但PIC16有clrf
指令,它将0置于文件寄存器,PIC18也有setf
指令,将255置于文件寄存器。您还有movlb
指令,它将5或4位字面值放到BSR
文件寄存器中,以减少选择256字节存储区时的代码。
还有另外两条可以帮助您的单条指令bsf
和bcf
(在PIC18也btg
),但它们只能设置/清除文件寄存器中的单个位(或者在PIC18处切换单个位。)
答案 1 :(得分:0)
罕见的操作只存在于寄存器源/目的地,而不是立即存在,这并不罕见。
例如,x86移动到段寄存器只有一个寄存器/存储器源,但它经常与mov ax, @data
(mov r16, imm16
)/ mov ds, ax
一起使用(一次在小程序或引导扇区的开始。)
对不同的表单使用单独的操作码会占用有限的编码空间,从而减少了可以使用的不同指令的数量。或者它会使解码器更复杂。
当你的用例需要很多ISA设计师认为不足以完成单一指令的东西时,这很烦人。 :/
答案 2 :(得分:0)
在PIC内核中,一个操作数始终是w-Register。但你可以用宏来帮助自己:
MOVLF macro LITERAL, Register
MOVLW LITERAL
MOVWF Register
endm
但是当然知道你需要两个周期来执行这个命令'。
答案 3 :(得分:0)
8位PICmcu上没有移动指令的技术原因是由于指令宽度。指令字中有14位。这些位必须分配给操作码和有效负载。 PIC16的操作码宽度不是固定的位数。诸如CALL和GOTO之类的某些指令具有3位操作码,允许在没有帮助的情况下达到2KB。其他指令(如所有文字指令)需要8位有效载荷(用于文字),因此它们仅剩6位...但是,文件指令需要7位(在PIC16上)以寻址文件寄存器,因此我们必须窃取一部分文字操作码来创建文件地址段。我们还必须窃取一点文字操作码来创建所有其他操作码.....在任何情况下,指令图都会快速填充,因此您必须在指令之间做出决定。在您提出的指令... movlf的情况下,这将需要7位文件地址和8位立即数地址,但是还需要许多操作码位才能在ISA中找到位置。仅有效负载是15位。 PIC18通过执行一些2周期指令来解决此问题。这些看起来像一条指令,但是将在程序存储器中占用2个字,并且需要2个CPU周期才能执行。一个示例是MOVFF。 PIC16设计人员认为,由于花费了2个字和2个周期,因此使2条指令明确化没有任何损失。这实际上是一个优势,因为PIC18上的2个周期指令为中断等待时间增加了1个不确定度周期。