我是asm和嵌入式系统的初学者。我正在寻找使用“间接”寄存器(或类似的东西 - 不确定)清除内存位置的代码。代码如下:
movlw 0x20 movwf FSR loop clrf INDF incf FSR, F btfsc FSR, 7 goto loop
我没有得到incf FSR, F
部分。指令incf
需要两个操作数;它在第一个位置递增值,并将结果存储在第二个位置。在这种情况下,F
将具有递增的值,那么我们为什么要对FSR
进行测试?
答案 0 :(得分:1)
F表示文件寄存器,它是代码d(目标)选择位; d = 0:将结果存储在W中,d = 1:将结果存储在文件寄存器f中。默认值为d = 1。
编译器应该理解:
;Increment FSR byte and result store back to FSR
incf FSR, F
or
incf FSR, 1
;Increment FSR byte and result store to W reg
incf FSR, w
or
incf FSR, 0
答案 1 :(得分:0)
incf是增量文件寄存器。第二个参数是目标,它是寄存器本身(F)或工作寄存器(W),实际上是一个标志。 PIC指令只能有一个文件寄存器地址,因此您将递增FSR,这是指令中唯一的寄存器。寄存器F没有。
仔细阅读有关PIC风格的指令集参考。
答案 2 :(得分:0)
好的F只是一个内存位置。将“FSR”视为可变指向内存位置的指针。
movlw 0x20 // put's the number 0x20 into the W register
movwf FSR // put's condense of W register in memory Loc "FSR"
loop clrf INDF // clear location pointed at by the value in W register.
incf FSR, F // increment the content of the FSR
btfsc FSR, 7 // test bit7 in the FSR and skip if set (exiting the loop)
goto loop // go back to loop. and do next memory location.
现在我看到的问题是它将退出第一次运行,因为FSR = 0x20因此第7位清零所以它退出循环。所以我想知道btfsc应该是btfss。然后它会从0x20循环到0xF0,这将更有意义。