重新映射8051汇编中的位

时间:2016-10-20 23:40:00

标签: assembly bit bits 8051

我制作了一个新的存储器模块电路,最终用于通用读取和写入板载存储器。我想要使​​用的是一个芯片,我用不同的编程器编程,但该编程器将不同的位视为芯片上的第一位。我想以最有效的方式做的是在8051中编写解码另一个芯片的代码。

存储器模块接受两个字节,两个移位寄存器中一次两个字节,最高有效位优先。

每次设置和复位时钟,两位都会自动移位到芯片上。

这是我的代码,其中的注释说明了用于映射内存的公式:

; user requests address of HighByte * 256 + LowByte

mov A,HighByte ; Access user high byte
mov C,ACC.6 ; take 6th bit (which is really bit 14)
mov HighBitAddress,C ;and set it up for shifting in high-byte register
mov A,LowByte ; Access user low byte
mov C,ACC.4 ; take 6th bit (which is really bit 4)
mov LowBitAddress,C ;and set it up for shifting in low-byte register
setb Clock
clr Clock ;at this point, High-byte register contains value of user bit 14 
          ;and Low-byte register contains value of user bit 4

这个过程几乎重复了。唯一经常变化的是累加器和进位的值。

mov A,??? ;=HighByte if next bit to load is > 8 or value is LowByte
mov C,ACC.??? ; If A=HighByte, subtract 8 from wanted bit. Value can be 0 through 7.
mov HighBitAddress,C ;and set it up for shifting in high-byte register
mov A,??? ;=HighByte if next bit to load is > 8 or value is LowByte
mov C,ACC.??? ; If A=HighByte, subtract 8 from wanted bit. Value can be 0 through 7.
mov LowBitAddress,C ;and set it up for shifting in low-byte register
setb Clock
clr Clock 

代码再重复6次。

这段代码的疯狂之处在于我需要使用8行代码来处理两个字节。我更喜欢在代码存储器中创建定义的地图并访问它,但我不知道如何从中访问位。只有整个字节。

没有推荐疯狂长码的任何想法?

更新

这就是我想要解决的问题。我希望有一个预定义位数组,以便处理简单。

对于整个字节,我可以使用如下代码逐个加载字节:

 mov dptr,#mydata
 byteloop:
     clr A
     movc A,@A+DPTR
     inc dptr
     ;byte is stored in accumulator for processing
 jnz byteloop
 mydata:
 db 'F','C','B','A','E','D',0h

这就是我想要实现的目标:

 mov A,#5Ch ;our binary value in accumulator is 01011100
 mov dptr,#mydata
 byteloop:
     movcb R1,@DPTR ;get value at DPTR
     mov C,@R1 ;get bit value
     inc dptr
     ;bit is stored
 jnz byteloop
 mydata:
 db ACC.7,ACC.3,ACC.2,ACC.5,ACC.1,ACC.0,0h

在上面的例子中,在"位存储的位置"到达时,C(进位标志)的返回值为0,1,1,0,0和0,因为它们是位于位7,位3,位2,位5,位1的值,分别为累加器的第0位。如果我想更改接收的位的顺序或我想要接收的位,我可以修改DB行。

如何使用正确的命令正确地实现上述代码,而不会让我的代码看起来很混乱?

0 个答案:

没有答案