首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

请问!关于寄存器移位的有关问题

2013-01-25 
请教!关于寄存器移位的问题在移位寄存器中,某一个比特位: (1)一次向右移动10位(10) (2)每次只向右移1位(

请教!关于寄存器移位的问题
在移位寄存器中,某一个比特位: 
(1)一次向右移动10位(>>10) 
(2)每次只向右移1位(>>1),移动了十次 
现在想问(1)(2)中它们的操作过程是等效的吗?或者说两者的操作时间是否一样?
[解决办法]

引用:
引用:结果等效,时间上应该是前者快一点。
过程不一定等效吧,如果你需要每次移出一位的数据或者是非10位右移的数据,按前者的作法一定是不行的。
其实就想搞清楚,移N位是不是一位一位的移N次完成的?!


编译器应该没有这么“笨”


main()
{
    volatile unsigned int a = 0x8000;
    volatile unsigned int b = 0;
    int i;

    for (i = 0; i < 10; i++)
    {
        a >>= 1;
    }

    b = a;

    a = 0x8000;

    b = a >> 10;

    return 0;
}


C:0x0000    020041   LJMP     STARTUP1(C:0041)
     2: { 
     3:     volatile unsigned int a = 0x8000; 
C:0x0003    750880   MOV      0x08,#P0(0x80)
C:0x0006    750900   MOV      0x09,#0x00
     4:     volatile unsigned int b = 0; 
     5:     int i; 
     6:  
C:0x0009    E4       CLR      A
C:0x000A    F50A     MOV      0x0A,A
C:0x000C    F50B     MOV      0x0B,A
     7:     for (i = 0; i < 10; i++) 
C:0x000E    FD       MOV      R5,A
C:0x000F    FC       MOV      R4,A
     8:     { 
     9:         a >>= 1; 
C:0x0010    E508     MOV      A,0x08
C:0x0012    C3       CLR      C
C:0x0013    13       RRC      A
C:0x0014    F508     MOV      0x08,A
C:0x0016    E509     MOV      A,0x09
C:0x0018    13       RRC      A
C:0x0019    F509     MOV      0x09,A
    10:     } 
    11:  
C:0x001B    0D       INC      R5


C:0x001C    BD0001   CJNE     R5,#0x00,C:0020
C:0x001F    0C       INC      R4
C:0x0020    ED       MOV      A,R5
C:0x0021    640A     XRL      A,#0x0A
C:0x0023    4C       ORL      A,R4
C:0x0024    70EA     JNZ      C:0010
    12:     b = a; 
    13:  
C:0x0026    85080A   MOV      0x0A,0x08
C:0x0029    85090B   MOV      0x0B,0x09
    14:     a = 0x8000; 
    15:  
C:0x002C    750880   MOV      0x08,#P0(0x80)
C:0x002F    750900   MOV      0x09,#0x00
    16:     b = a >> 10; 
    17:  
C:0x0032    E508     MOV      A,0x08
C:0x0034    13       RRC      A
C:0x0035    13       RRC      A
C:0x0036    543F     ANL      A,#0x3F
C:0x0038    F50B     MOV      0x0B,A
C:0x003A    750A00   MOV      0x0A,#0x00
    18:     return 0; 
C:0x003D    E4       CLR      A
C:0x003E    FE       MOV      R6,A
C:0x003F    FF       MOV      R7,A
    19: } 
C:0x0040    22       RET      


[解决办法]
与芯片的具体实现有关。

一般芯片的 ACC 都有移位功能。16 位以上的单片机,多数可以在一个时钟周期内完成一次移位操作,位数以 ACC 的位长为限。当然,10 次移动 1 位,就需要 10 个时钟周期了。

很多芯片有移位寄存器,位长更长一些,它一般比 ACC 效率高。

无论是在 ACC 还是移位寄存器,硬件移位都不是一次一位地进行的,多数设计是所有的位同时移动。

热点排行