如何在pic程序集中操作单个寄存器以创建字节序交换效果



我必须使用pic汇编代码生成以下结果:

;msb::lsb
7,6,5,4,3,2,1,0 ;These bits in single register
;Result should be following:
0,1,2,3,4,5,6,7

其中每个数字表示位。这相当于改变了寄存器的端序。这种寄存器操作如何在8位pic汇编中实现?我正试图通过使用内联汇编来优化我的c代码,并将输入值放入寄存器中。我读过关于swapf指令的内容,但它会导致错误的位,如下所示:3,2,1,0,7,6,5,4我使用的图片是PIC16F887

实现这一点的最佳方法取决于您特定的8位PIC架构(PIC16、传统/增强型PIC18等)以及您愿意在其上花费的ROM/RAM数量。

下面是我使用ROM表实现dwelch为PIC16建议的nybble交换方法的未经测试的尝试。它应该在13个指令周期内完成:

        ;Reverse nybbles of W separately and merge the results
        MOVWF   tmp1
        CALL    nybble
        MOVWF   tmp2
        SWAPF   tmp1,W
        CALL    nybble
        SWAPF   WREG
        ORF     tmp2,W
        ;Helper function reversing an LSD nybble of W via a table.
        ;The table must _not_ cross a 256-word page!
nybble: ANDLW   0x0F
        ADDWF   PCL
        RETLW   b'0000 : RETLW  b'1000
        RETLW   b'0100 : RETLW  b'1100
        RETLW   b'0010 : RETLW  b'1010
        RETLW   b'0110 : RETLW  b'1110
        RETLW   b'0001 : RETLW  b'1001
        RETLW   b'0101 : RETLW  b'1101
        RETLW   b'0011 : RETLW  b'1011
        RETLW   b'0111 : RETLW  b'1111

如果你在优化尺寸而不是速度,你可以尝试直接的方法,在两个方向上切换一对累加器:

        SETC                ;Wind-in the loop condition sentinel
        RLF     input
loop:   RRF     output      ;Go for it!
        RLF     input
        BNZ     loop

循环通过缓慢地用零填充input来工作。一旦哨点被旋转到进位,并且input为零,循环终止。

最新更新