我必须使用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
为零,循环终止。