打印

讨论:用汇编怎样把一个二进制数左右颠倒

[复制链接]
2961|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bg6nw|  楼主 | 2007-5-7 16:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做的一个小课题,用8870解双音频,后送入MCS-51单片机,因印板布局问题,8870解码输出低位接到MCU的高位,如8870送出 #0001B ,MCU收到的是 #1000B,需要把数据左右颠倒后送入后级处理。

想了半天,想了个查表的法子,幸好从0--f才16个字,实现起来代码也不多,但是我想还会有更简洁的办法,再说,这是一个四位二进制数,要是八位的,那表格该有多么的壮观呀。

这里我又想了一个小方法:正好我这个设计里面有多余的I2C存储器空间,可以把数先低位在前写进去,读的时候高位在前读回来。

探讨一下有多少种方法来实现这个功能。

相关帖子

沙发
ayb_ice| | 2007-5-7 16:49 | 只看该作者

写一个程序就可以了...

使用特权

评论回复
板凳
conwh| | 2007-5-7 17:59 | 只看该作者

左传再右转

使用特权

评论回复
地板
every_day| | 2007-5-7 18:04 | 只看该作者

也不是很难啊

主要是移位就行了

使用特权

评论回复
5
maychang| | 2007-5-7 19:18 | 只看该作者

51单片机有位操作

A、B两个寄存器都可以位寻址。所以还能够用这两个寄存器以C为中介一位一位地移动来实现。

使用特权

评论回复
6
bg6nw|  楼主 | 2007-5-7 21:02 | 只看该作者

是不是这样?

设待操作数在 A 中

RLC A        ;带进位位左移A
MOV C ,B.0   ;A的高位送到B的低位 
RLC A        ;以此类推。。。。。
MOV C ,B.1
RLC A
MOV C ,B.2
RLC A
MOV C ,B.3
RLC A
MOV C ,B.4
RLC A
MOV C ,B.5
RLC A
MOV C ,B.6
RLC A
MOV C ,B.7
MOV A ,B     ;送回来


这样行不行,我发现比查表简单多了,呵呵



使用特权

评论回复
7
conwh| | 2007-5-7 21:09 | 只看该作者

正好是反了

MOV    A,     FORWARD
RLC    A
MOV    B。0,  C
AND SO ON

使用特权

评论回复
8
bg6nw|  楼主 | 2007-5-7 21:22 | 只看该作者

不好意思,忘记用脑子了

反了第一个,后面的是复制粘贴,再后来缪之千里了

使用特权

评论回复
9
fushaobing| | 2007-5-8 21:41 | 只看该作者

左移再右移,左移再右移,...

;=========================================================================
;        REVERSAL SUBROUTINE
;Inpiut: R2=data
;Oputput: R3=reversal data
;Affect: R2,R3,R4,A

REVERSAL:
        MOV    R4,#8
REVERSAL_0:
        MOV    A,R2
        RLC    A        ;Left rotate with C
        MOV    R2,A

        MOV    A,R3
        RRC    A        ;Right rotate with C
        MOV    R3,A

        DJNZ    R4,REVERSAL_0
        RET
;=========================================================================

使用特权

评论回复
10
dengm| | 2007-5-9 00:52 | 只看该作者

; 13 个周期

;----------------------
;      13 个周期
        MOV C, ACC.1
        RLC A         
        MOV ACC.2, C  ;    A:65432701
        
        MOV C, ACC.3
        RLC A
        MOV ACC.4, C  ;    A:54367012
 
        MOV C, ACC.5
        RLC A
        MOV ACC.6, C  ;   A:45670123

        SWAP A        ;   A:01234567

;------------------------------------
;      15 个周期
         MOV B, A
         MOV C, B.1
         RLC A
         MOV C, B.2
         RLC A
         MOV C, B.3
         RLC A
         MOV C, B.4
         RLC A
         MOV C, B.5
         RLC A
         MOV C, B.6
         RLC A
         MOV C, B.7
         RLC A

使用特权

评论回复
11
bg6nw|  楼主 | 2007-5-9 08:16 | 只看该作者

佩服ING

邓大侠的13个周期的代码真是构思巧妙,代码精简,而且只用了很少的系统资源,真正让小弟佩服的五体投地,四爪朝天。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

511

帖子

0

粉丝