algorithm - 旋转/反转 16 位数中位的位置

标签 algorithm assembly microcontroller bit 8051

我正在使用 8051 微 Controller 并找到了一种更好的方法来将数据传输到移位寄存器。到目前为止,我使用的是位碰撞技术,从最高有效位开始一次一位地移出位。新方法是通过硬件串行端口完成的,但是我了解到数据是从最低有效位开始移出的(完全相反的方向)。

为了遵守,我必须重新安排我的数据。目前,所讨论的数据大小是 16 位,我可能还需要转换 24 位数据大小。

当我只转换 8 位大小时,我使用了一个只有 256 字节的查找表。这大约是我可用代码空间的 1/16,因为我将所有代码塞进了 AT89C4051 micro。

如果我尝试使用 16 位大小进行相同操作,我可能会超过限制,因为 256 乘以 256 等于 65K(查找表需要多大?)

所以我正在寻找一种高速算法来很好地完成这项工作。

到目前为止,这是我在 8051 代码中提出的,我认为它有点太慢且难以维护,但它似乎可以完成工作:

;DPTR = 16-bit number to convert

mov R7,#10h ;16 bits
nextbit:
mov A,DPH
rrc A
mov DPH,A
mov A,DPL
rrc A
mov DPL,A
mov A,R2
rlc A
mov R2,A
mov A,R3
rlc A
mov R3,A
djnz R7,nextbit
mov DPH,R3
mov DPL,R2

谁能指出我可以使用的更快的代码或更好的算法,而不是一位一位地移入移出位?

从视觉上看,这就是我尝试对二进制位进行排序的方式。假设“a”需要从16位数字的最低位到最高位,“b”需要从第二低位到第二高位,依此类推。这是示例:

 ponmlkji:hgfedcba -> abcdefgh:ijklmnop

最佳答案

至少您可以在每个循环迭代中传输两位,这会使循环计数减半:

mov R7,#8 
nextbit:

  mov A,DPH
  rrc A
  mov DPH,A
  mov A,R2 ;R2 will become the lowbyte of the result
  rlc A 
  mov R2,A

  mov A,DPL
  rrc A
  mov DPL,A
  mov A,R3
  rlc A
  mov R3,A

djnz R7,nextbit
mov DPH,R3
mov DPL,R2

或者使用包含 256 个条目(256 字节)的查找表:

mov R2, DPH
mov A,  DPL
mov dptr, LookupTable256
movc a,@a+dptr ;Translate lowbyte into hibyte of result
xch A, R2
movc a,@a+dptr
;lowbyte in a, hibyte in R2

这里是一个按半字节翻译的版本,并使用只有 16 个条目的查找表:

mov R2, DPH
mov R3, DPL
mov dptr, LookupTable16

mov a, R3
and a, #0Fh    ;=Nibble0
movc a,@a+dptr ;Translate
swap           ;swap nibbles
xch A, R3      ; store result nibble 3 
swap 
and a, #0Fh    ;=Nibble1
movc a,@a+dptr ;Translate
orl AR3, A     ;R3=Result nibbles 2+3

mov a, R2
and a, #0Fh    ;=Nibble2
movc a,@a+dptr ;Translate
swap 
xch A, R2      ; store result nibble 1 
swap 
and a, #0Fh    ;=Nibble3
movc a,@a+dptr ;Translate
orl A, R2       ;A=Result nibbles 0+1

关于algorithm - 旋转/反转 16 位数中位的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48605155/

相关文章:

algorithm - 这个算法流程符号的名称是什么?

java - 查找矩阵中是否存在路径

Linux 上的 C 内联汇编,将字符串从堆栈写入标准输出

c - 将函数指针和 int 引用传递给另一个函数

microcontroller - 启用数据存储器 PIC 18F4550

algorithm - 查找光线是否与体素相交而不行进

algorithm - 如何将此类 DFS 算法问题扩展/分布到分布式系统中

c - 二进制炸弹阶段 4 内存位置

c - 缓冲区溢出攻击分段故障(核心转储)

c++ - 根据 AD 值创建和使用查找表