免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10004 | 回复: 18
打印 上一主题 下一主题

Mips的代码密度没有ARM大 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-05 16:53 |只看该作者 |倒序浏览
本帖最后由 rocky1972 于 2010-02-05 16:55 编辑

[root@localhost example]# ls
main.c    Makefile
[root@localhost example]# cat main.c
#include <stdio.h>
#include <stdlib.h>

int foo(int a, int b)
{

return (a + b);
}
int dumm(int a, int b ,int c , int d,int e)
{

return (a + b + c +d);

}


int main(int argc ,char ** argv)
{


int c;

c = foo(1,2);
c = dumm(1,2,3,4,5);
return c;

}

[root@localhost example]# cat Makefile
all: build_arm build_mips show



TARGET_NAME = helloworld
SOUCRE_FILE = main.c
build_arm:
arm-linux-gcc $(SOUCRE_FILE) -o $(TARGET_NAME).arm.elf
arm-linux-objdump -D $(TARGET_NAME).arm.elf > $(TARGET_NAME).arm.objdump
arm-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S $(TARGET_NAME).arm.elf $(TARGET_NAME).arm.bin



build_mips:
mips-linux-gcc $(SOUCRE_FILE) -o $(TARGET_NAME).mips.elf
mips-linux-objdump -D $(TARGET_NAME).mips.elf > $(TARGET_NAME).mips.objdump
mips-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S $(TARGET_NAME).mips.elf $(TARGET_NAME).mips.bin

show:
ls -al *bin
ls -al *objdump
ls -al *elf

clean:
rm -rf *.elf *.bin *.objdump

[root@localhost example]# make
arm-linux-gcc main.c -o helloworld.arm.elf
arm-linux-objdump -D helloworld.arm.elf > helloworld.arm.objdump
arm-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S helloworld.arm.elf helloworld.arm.bin
mips-linux-gcc main.c -o helloworld.mips.elf
mips-linux-objdump -D helloworld.mips.elf > helloworld.mips.objdump
mips-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S helloworld.mips.elf helloworld.mips.bin
ls -al *bin
-rwxr-xr-x 1 root root 34160 02-05 16:43 helloworld.arm.bin
-rwxr-xr-x 1 root root 67696 02-05 16:43 helloworld.mips.bin

ls -al *objdump
-rw-r--r-- 1 root root 25486 02-05 16:43 helloworld.arm.objdump
-rw-r--r-- 1 root root 19243 02-05 16:43 helloworld.mips.objdump
ls -al *elf
-rwxr-xr-x 1 root root 7516 02-05 16:43 helloworld.arm.elf
-rwxr-xr-x 1 root root 5878 02-05 16:43 helloworld.mips.elf
[root@localhost example]#

比较两个binary的大小发现ARM的代码密度要比MIPS高一倍。




对单个函数 foo函数进行反汇编:

=================================       ARM    ==================================

000083a0 <foo>:
    83a0:    e1a0c00d     mov    ip, sp
    83a4:    e92dd800     stmdb    sp!, {fp, ip, lr, pc}
    83a8:    e24cb004     sub    fp, ip, #4    ; 0x4
    83ac:    e24dd008     sub    sp, sp, #8    ; 0x8
    83b0:    e50b0010     str    r0, [fp, #-16]
    83b4:    e50b1014     str    r1, [fp, #-20]
    83b8:    e51b2010     ldr    r2, [fp, #-16]
    83bc:    e51b3014     ldr    r3, [fp, #-20]
    83c0:    e0823003     add    r3, r2, r3
    83c4:    e1a00003     mov    r0, r3
    83c8:    e24bd00c     sub    sp, fp, #12    ; 0xc
    83cc:    e89da800     ldmia    sp, {fp, sp, pc}

ARM 用 12 条指令完成

================================= MIPS ==================================

00400750 <foo>:
  400750:    27bdfff8     addiu    sp,sp,-8
  400754:    afbe0004     sw    s8,4(sp)
  400758:    03a0f021     move    s8,sp
  40075c:    afc40008     sw    a0,8(s
  400760:    afc5000c     sw    a1,12(s
  400764:    8fc30008     lw    v1,8(s
  400768:    8fc2000c     lw    v0,12(s
  40076c:    00000000     nop
  400770:    00621021     addu    v0,v1,v0
  400774:    03c0e821     move    sp,s8
  400778:    8fbe0004     lw    s8,4(sp)
  40077c:    27bd0008     addiu    sp,sp,8
  400780:    03e00008     jr    ra
  400784:    00000000     nop

MIPS 用14条指令, 多出来的两条指令为nop来充当delay slot

但是MIPS 的FAE 培训的时候讲到 , MIPS寄存器数量比ARM 要多, 所以代码密度和执行效率较ARM 要高一些。。。。。。。

论坛徽章:
0
2 [报告]
发表于 2010-02-05 23:03 |只看该作者
虽然lz的例子没有用到,但是ARM的指令密度主要是靠thumb指令集出来的,还有另外一个非主流CPU更BT,提出了双分支并行的概念,虽然不怎么实用。
MIPS的nop是必须的,设计决定的,好像不加nop就会错误,反正gcc的mips port也不咋地,具体做起来又麻烦。可是我觉得更糟糕的在与jmp的长度,还有非对齐访问。而ARM在非对齐访问方面提供了一些指令,据说有某种机制的优化,jmp,我记不清了,其实我就刚毕业接触过ARM。
我是x64的用户,而且对x64的认识还一直停留在ISA的层面,mik是学习的目标和榜样,各位熟悉ARM和MIPS的大牛看我说错了还请轻拍哈,我幼小的心灵承受能力不强。

论坛徽章:
0
3 [报告]
发表于 2010-02-06 09:22 |只看该作者
ARM好像有16位的指令,不知道是不是这个原因

论坛徽章:
0
4 [报告]
发表于 2010-02-06 10:47 |只看该作者
ARM好像有16位的指令,不知道是不是这个原因
beyond2004 发表于 2010-02-06 09:22



    MIPS和ARM都是编译成32位指令的

论坛徽章:
0
5 [报告]
发表于 2010-02-06 11:10 |只看该作者
可能这个例子比较简单无法说明情况。但是根据我的实验。thumb<mips<arm<ppc

华为的以太网交换机三种cpu都用到了。有一次我比较了用ppc、arm、mips三款设备的obj文件,编译完后使用size命令来统计代码段大小。得出的结论是mips<arm<ppc。之后重新用thumb指令集编译全套代码(1G左右),得出thumb<mips<arm<ppc的结论。现在回想起来可能不同设备使用特性不一样有一定的影响。可以回头再验证一下。但实际这个大小跟编译器的质量有关。即使是vxworks 5.5里面gcc 2.95+风河的一堆修补,对三种平台的支持程度也是不一样的。

另外,mips编译填充的nop我认为还是没有打开编译器优化选项。delay slot的话可以不用填充nop,lz编译的时候用的默认优化,那就直接填充nop了事了。

另外看二进制大小可以不用这么麻烦。objdump ,readelf,size都可以看。

lz试一试编译http://www.sqlite.org/sqlite-amalgamation-3_6_22.zip比较一下。我周一回头也再比较一下。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2010-02-06 13:40 |只看该作者
ARM好像有16位的指令,不知道是不是这个原因
beyond2004 发表于 2010-02-06 09:22

这是thumb指令集

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2010-02-06 18:21 |只看该作者
虽然lz的例子没有用到,但是ARM的指令密度主要是靠thumb指令集出来的,还有另外一个非主流CPU更BT,提出了双 ...
prolj 发表于 2010-02-05 23:03

MIPS= Microprocessor without Interlocked Pipeline Stages
RISC的代表
delay slot是不可省略的
MIPS的设计思路使得大家一向觉得这才应该是纯粹的RISC

论坛徽章:
0
8 [报告]
发表于 2010-02-06 21:00 |只看该作者
MIPS= Microprocessor without Interlocked Pipeline Stages
RISC的代表
delay slot是不可省略的
MIPS ...
cjaizss 发表于 2010-02-06 18:21



    牛人终于出来了

论坛徽章:
0
9 [报告]
发表于 2010-02-06 21:01 |只看该作者
可能这个例子比较简单无法说明情况。但是根据我的实验。thumb
lllaaa 发表于 2010-02-06 11:10



    底层驱动,特别是固件的代码,应该是看binary的大小吧

论坛徽章:
0
10 [报告]
发表于 2010-02-06 22:44 |只看该作者
底层驱动,特别是固件的代码,应该是看binary的大小吧
rocky1972 发表于 2010-02-06 21:01



你的那个例子是看的最终链接后的binary,我认为不能反映纯粹的代码编译结果,因为已经和crt链接到一起了。其实你的目的只想比较函数而已。从反汇编的结果来看,arm在函数头用1条指令就可以把一堆寄存器压栈,而mips要调整栈后慢慢赋值。由于你的函数非常简单仅仅是加法运算,这部分入栈代码的差异相对来说就占了更大的比例。因此后面我建议你用sqlite的代码编译后用binutils里面的size命令来看看text段大小的差异。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP