打印

单片机指令大比拼

[复制链接]
15004|140
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
machunshui|  楼主 | 2008-7-26 14:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各种单片机的爱好者都说自己支持的单片机指令系统好,那就量化比较分别都是几个指令周期,占几个字节ROM的空间?

1.
unsigned char A,B
A = B;

2.
unsigned char A,B,C
C = A+B;

3.
unsigned char A,B,C
A[B] = C

4.
unsigned char A[10];
unsigned char i;

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

5.
unsigned char A,B;

if(A > 10)
B = 0;
else
B = 1;

6.
unsigned char A,B

switch(A)
{
case 0:
B = 10;
break;

case 1:
B = 20
break;

default:
B = 30;
break;
}


相关帖子

沙发
machunshui|  楼主 | 2008-7-26 14:57 | 只看该作者

针对pic

1.A=B;

movf _B,w
movwf _A

总共: 2指令字,2指令周期


2. C = A+B;

movf    _A,w
addwf    _B,w
movwf    _C

总共: 3指令字,3指令周期


3. A[B] = C;

movf    _B,w
addlw    _A
movwf    4
bcf    3,7
movf    _C,w
movwf    0
总共: 6指令字,6指令周期


4.
for(i = 0; i < 10;i++)
{
A = 1;
}

    clrf    _i
    goto    $2

$1    movf    _i,w
    addlw    _A
    movwf    4
    bcf    3,7
    clrf    0
    incf    0
    incf    _i

$2    movlw    10
    subwf    _i,w
    btfsc    3,0
        return
    goto    $1

运行时间123个指令周期,17个指令字



5.

if(A > 10)
B = 0;
else
B = 1;


         movlw     11
         subwf     _A,w
    clrf    _B
    btfss    3,0
    incf    _B

总共: 5指令字,5指令周期


6.
unsigned char A,B

switch(A)
{
case 0:
B = 10;
break;

case 1:
B = 20
break;

default:
B = 30;
break;
}


    goto    l3
l4
    movlw    10
    movwf    _B
    return
    
l5
    movlw    20
    movwf    _B
    return
    
16
    movlw    30
    movwf    _B
    return

l3
    bcf    3,5
    bcf    3,6    ;carry unused
    movf    _A,w
    xorlw    0
    btfsc    3,2
    goto    l4
    xorlw    1
    btfsc    3,2
    goto    l5
    goto    l6

27指令字,运行9个指令周期



使用特权

评论回复
板凳
hotpower| | 2008-7-26 15:09 | 只看该作者

.

使用特权

评论回复
地板
gtw| | 2008-7-26 20:30 | 只看该作者

是 字

使用特权

评论回复
5
utopia779| | 2008-7-26 21:03 | 只看该作者

学习了!

if(A > 10)
B = 0;
else
B = 1;


         movlw     11
         subwf     _A,w
    clrf    _B
    btfss    3,0
    incf    _B

总共: 5字节,5指令周期

使用特权

评论回复
6
machunshui|  楼主 | 2008-7-27 10:19 | 只看该作者

熟悉51,avr,430的指令的爱好者都说说啊

熟悉51,avr,430的指令的爱好者都说说啊.

比较是一种好的学习方法.

使用特权

评论回复
7
machunshui|  楼主 | 2008-7-27 10:22 | 只看该作者

4楼说得对

4楼说得对,

是指令字,针对pic16是14 bit,pic18 是16 bit,pic24是24bit

使用特权

评论回复
8
lyjian| | 2008-7-29 17:30 | 只看该作者

用51实现可以更好

用51可以做得更好


1.A1=B1;

    mov    A1,B1
总共: 3字节(=PIC 2指令字),2指令周期
A1、B1可以为RAM地址0~255,如果用PIC,RAM〉32时,2指令字根本做不到。

2. C1 = A1+B1;

    mov    A,A1
    add     A,B1
    mov     C1,A
总共: 3字节(A1,B1,C1使用寄存器),3指令周期。


3. A[B] = C;

movf    _B,w
addlw    _A
movwf    4
bcf    3,7
movf    _C,w
movwf    0
总共: 6指令字,6指令周期
(这个是什么意思,没看懂)

4.
for(i = 0; i < 10;i++)
{
A = 1;
}
    mov    R0,#9
    mov    A,#1
LOOP:
    mov    @R0,A
    djnz    R0,LOOP
    mov    @R0,A
    ret
运行时间30个指令周期(<PIC的123个指令周期),8个指令节(<PIC的17指令字)



5.

if(A1 > 10)
B1 = 0;
else
B1 = 1;
    mov    B1,#1    
    cjne    A1,#10,CHECK
    ret
CHECK:
    jc    RETURN
    dec    B1
RETURN:
    ret
总共: 8指令字令节(<PIC的5指令字),3指令周期(if A<10),6指令周期(if A1>10),
(使用寄存器寻址)


6.
unsigned char A1,B1

switch(A1)
{
case 0:
B1 = 10;
break;

case 1:
B1 = 20
break;

default:
B1 = 30;
break;
}
    mov    A,A1
    jnz    OTHER_CASE
    mov    B1,#10
    ret
OTHER_CASE:
    djnz    A1,DEFAULT
    mov    B1,#20
    ret
DEFAULT:
    mov    B1,#30
    ret
14指令字节(<PIC的27指令字),运行8个指令周期(<PIC的9个指令周期)
(使用寄存器寻址)

使用特权

评论回复
9
zjh006| | 2008-7-29 17:39 | 只看该作者

这样很难比较出来

比较几条指令说明不了问题,最好做个简单的实例(例如模拟IIC),这样比较有说服力。

使用特权

评论回复
10
古道热肠| | 2008-7-29 17:43 | 只看该作者

单片机的MIPS是一个比较客观的指标

的确不能用实现某一特定功能的小代码来作比较.

使用特权

评论回复
11
machunshui|  楼主 | 2008-7-29 18:01 | 只看该作者

这些都是常用的几种程序结构

这些都是常用的几种程序结构和基本输入输出方法.

看单片机程序效率无非看:

1.输入输出指令效率

2.运算效率

3.判断效率

4.循环效率

5.指针操作效率

使用特权

评论回复
12
此在| | 2008-7-29 18:14 | 只看该作者

GOOD

GOOD

使用特权

评论回复
13
machunshui|  楼主 | 2008-7-29 18:14 | 只看该作者

不大可信

4.
for(i = 0; i < 10;i++)
{
A = 1;
}
    mov    R0,#9
    mov    A,#1
LOOP:
    mov    @R0,A
    djnz    R0,LOOP
    mov    @R0,A
    ret
运行时间30个指令周期(<PIC的123个指令周期),8个指令节(<PIC的17指令字)


不大可信

使用特权

评论回复
14
lyjian| | 2008-7-29 18:17 | 只看该作者

不信你就贴到Keil里运行一下

使用特权

评论回复
15
machunshui|  楼主 | 2008-7-29 18:26 | 只看该作者

要是如,pic的间接寻址方式效率是很低

要是如,pic的间接寻址方式效率是很低

使用特权

评论回复
16
machunshui|  楼主 | 2008-7-29 19:08 | 只看该作者

30个指令周期不可能

4.
for(i = 0; i < 10;i++)
{
A = 1;
}
    mov    R0,#9
    mov    A,#1
LOOP:
    mov    @R0,A
    djnz    R0,LOOP
    mov    @R0,A
    ret
运行时间30个指令周期(<PIC的123个指令周期),8个指令节(<PIC的17指令字)



30个指令周期不可能,djnz不可能是单周期.

使用特权

评论回复
17
machunshui|  楼主 | 2008-7-29 19:12 | 只看该作者

lyjian比较的不公平

pic是针对器件支持的所有RAM空间,

你给出的51指令周期如果是外部ram,

指令周期和长度都要加倍.

使用特权

评论回复
18
fineamy| | 2008-7-29 19:36 | 只看该作者

支持

使用特权

评论回复
19
lyjian| | 2008-7-29 19:45 | 只看该作者

普通PIC可以使用外部RAM吗

凭什么我就得拿访问外部RAM的指令来和PIC访问内部RAM的指令来比
你所说的“pic是针对器件支持的所有RAM空间”也就32个字节吧
普通的PIC就支持32字节(好点的PIC支持大一点)的RAM,大了还得分页
不用说外部RAM,就是内部RAM,PIC访问起来还得忙着换页
51至少内部256字节的RAM都不用分页
PIC行吗

楼主根本就不了解51
51有一个特性就是:间接访问内部或外部RAM,都是两个指令周期都和一个字节的指令长度
(并没有楼主所说的都要加倍,请楼主不要用PIC的思路来想51)

使用特权

评论回复
20
lyjian| | 2008-7-29 19:51 | 只看该作者

没有什么不可能的

17楼: 30个指令周期不可能 

4.
for(i = 0; i < 10;i++)
{
A = 1;
}
    mov    R0,#9
    mov    A,#1
LOOP:
    mov    @R0,A
    djnz    R0,LOOP
    mov    @R0,A
    ret
运行时间30个指令周期(<PIC的123个指令周期),8个指令节(<PIC的17指令字)



30个指令周期不可能,djnz不可能是单周期.
********************************************* 
djnz确实不是单周期,可惜它是双周期的,要不然只需21个指令周期就可以了。

使用特权

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

本版积分规则

153

主题

3224

帖子

4

粉丝