查看: 5015|回复: 6

对比 armcc 和 arm-elf-gcc 的编译结果 [复制链接]

linux_Ultra (离线)
积分
39472
帖子
313
发表于 2009-7-27 14:40:14 |显示全部楼层
关键词: armcc , 编译 , 结果
本帖最后由 linux_Ultra 于 2009-7-27 14:46 编辑

armcc 和 arm-elf-gcc 那个好些?


都是在win xp 平台下,
    arm出的编译器(从 ads1.2 目录里,弄出来的)---armcc。
    gnu的编译器--- arm-elf-gcc 。
对比了一下,gnu的编译器产生的汇编代码,语法虽然是不同平台,但比较统一,arm上和x86上都差不多,伪指令基本都一样,风格也一样。

  1. 编译一个 简单的 c 代码:
  2. --------------------------------------------------------------------------------------
  3. int a= 123;
  4. int b[] = {1, 2, 3, 4};
  5. char ch[] = "AAAAAA";
  6. int main(void)
  7. {
  8.     int a = 456;
  9.     int b[] = {5, 6, 7, 8};
  10.     char ch[] = "aaaaaa";
  11.    
  12. return 0;
  13. }

  14. --------------------------------------------------------------------------------------

  15. 先在debian5.0上用gcc4.3.2编:
  16. gcc -Wall -S  -O0 1.c -o app_gcc.S
  17. --------------------------------------------------------------------------------------
  18.         .file    "1.c"
  19. .globl a
  20.     .data
  21.     .align 4
  22.     .type    a, @object
  23.     .size    a, 4
  24. a:
  25.     .long    123
  26. .globl b
  27.     .align 4
  28.     .type    b, @object
  29.     .size    b, 16
  30. b:
  31.     .long    1
  32.     .long    2
  33.     .long    3
  34.     .long    4
  35. .globl ch
  36.     .type    ch, @object
  37.     .size    ch, 7
  38. ch:
  39.     .string    "AAAAAA"
  40.     .text
  41. .globl main
  42.     .type    main, @function
  43. main:
  44.     leal    4(%esp), %ecx
  45.     andl    $-16, %esp
  46.     pushl    -4(%ecx)
  47.     pushl    %ebp
  48.     movl    %esp, %ebp
  49.     pushl    %ecx
  50.     subl    $32, %esp
  51.     movl    $456, -8(%ebp)
  52.     movl    $5, -24(%ebp)
  53.     movl    $6, -20(%ebp)
  54.     movl    $7, -16(%ebp)
  55.     movl    $8, -12(%ebp)
  56.     movl    $1633771873, -31(%ebp)
  57.     movw    $24929, -27(%ebp)
  58.     movb    $0, -25(%ebp)
  59.     movl    $0, %eax
  60.     addl    $32, %esp
  61.     popl    %ecx
  62.     popl    %ebp
  63.     leal    -4(%ecx), %esp
  64.     ret
  65.     .size    main, .-main
  66.     .ident    "GCC: (Debian 4.3.2-1.1) 4.3.2"
  67.     .section    .note.GNU-stack,"",@progbits


  68. --------------------------------------------------------------------------------------

  69. 在win xp上用arm-elf-gcc编。
  70. arm-elf-gcc -Wall  -S -O0 1.c -o app_armgcc.s
  71. --------------------------------------------------------------------------------------
  72.         .file    "1.c"
  73.     .global    a
  74.     .data
  75.     .align    2
  76.     .type    a, %object
  77.     .size    a, 4
  78. a:
  79.     .word    123
  80.     .global    b
  81.     .align    2
  82.     .type    b, %object
  83.     .size    b, 16
  84. b:
  85.     .word    1
  86.     .word    2
  87.     .word    3
  88.     .word    4
  89.     .global    ch
  90.     .align    2
  91.     .type    ch, %object
  92.     .size    ch, 7
  93. ch:
  94.     .ascii    "AAAAAA\000"
  95.     .section    .rodata
  96.     .align    2
  97.     .type    C.0.1181, %object
  98.     .size    C.0.1181, 16
  99. C.0.1181:
  100.     .word    5
  101.     .word    6
  102.     .word    7
  103.     .word    8
  104.     .align    2
  105. .LC0:
  106.     .ascii    "aaaaaa\000"
  107.     .text
  108.     .align    2
  109.     .global    main
  110.     .type    main, %function
  111. main:
  112.     @ args = 0, pretend = 0, frame = 28
  113.     @ frame_needed = 1, uses_anonymous_args = 0
  114.     mov    ip, sp
  115.     stmfd    sp!, {fp, ip, lr, pc}
  116.     sub    fp, ip, #4
  117.     sub    sp, sp, #28
  118.     mov    r3, #456
  119.     str    r3, [fp, #-16]
  120.     ldr    r3, .L3
  121.     sub    ip, fp, #32
  122.     ldmia    r3, {r0, r1, r2, r3}
  123.     stmia    ip, {r0, r1, r2, r3}
  124.     ldr    r3, .L3+4
  125.     sub    r2, fp, #39
  126.     mov    ip, #7
  127.     mov    r0, r2
  128.     mov    r1, r3
  129.     mov    r2, ip
  130.     bl    memcpy
  131.     mov    r3, #0
  132.     mov    r0, r3
  133.     sub    sp, fp, #12
  134.     ldmfd    sp, {fp, sp, pc}
  135. .L4:
  136.     .align    2
  137. .L3:
  138.     .word    C.0.1181
  139.     .word    .LC0
  140.     .size    main, .-main
  141.     .ident    "GCC: (GNU) 4.3.2"

  142. --------------------------------------------------------------------------------------

  143. 在win xp上用armcc编。
  144. armcc -S -O0 1.c -o app_armcc.s
  145. --------------------------------------------------------------------------------------
  146. ; generated by ARM C Compiler, ADS1.2 [Build 805]

  147. ; commandline [-O0 -S "-IC:\Program Files\ARM\ADSv1_2\INCLUDE"]
  148.         CODE32

  149.         AREA ||.text||, CODE, READONLY

  150. main PROC
  151. |L1.0|
  152.         STR      lr,[sp,#-4]!
  153.         SUB      sp,sp,#0x18
  154.         MOV      lr,#0x1c8
  155.         LDR      r1,|L1.60|
  156.         ADD      r0,sp,#8
  157.         LDMIA    r1,{r1-r3,r12}
  158.         STMIA    r0,{r1-r3,r12}
  159.         LDR      r0,|L1.64|
  160.         LDR      r1,[r0,#0]  ; <Anon2_line_8>, <Anon2_line_8>
  161.         LDR      r0,[r0,#4]
  162.         STR      r0,[sp,#4]
  163.         STR      r1,[sp,#0]
  164.         MOV      r0,#0
  165.         ADD      sp,sp,#0x18
  166.         LDR      pc,[sp],#4
  167. |L1.60|
  168.         DCD      ||.constdata$1||
  169. |L1.64|
  170.         DCD      ||.constdata$1|| + 16
  171.         ENDP



  172.         AREA ||.data||, DATA, ALIGN=2

  173. ||.data$0||
  174. a
  175.         DCD      0x0000007b
  176. b
  177.         DCD      0x00000001
  178.         DCD      0x00000002
  179.         DCD      0x00000003
  180.         DCD      0x00000004
  181. ||ch||
  182.         DCB      0x41,0x41,0x41,0x41
  183.         DCB      0x41,0x41,0x00
  184.         DCB      0x00


  185.         AREA ||.constdata||, DATA, READONLY, ALIGN=2

  186. ||.constdata$1||
  187.         DCD      0x00000005
  188.         DCD      0x00000006
  189.         DCD      0x00000007
  190.         DCD      0x00000008
  191.         DCB      0x61,0x61,0x61,0x61
  192.         DCB      0x61,0x61,0x00
  193.         DCB      0x00


  194.         EXPORT main
  195.         EXPORT ||ch||
  196.         EXPORT b
  197.         EXPORT a

  198.         IMPORT _main
  199.         IMPORT __main
  200.         IMPORT ||Lib$Request$armlib||, WEAK

  201.         KEEP ||BuildAttributes$ARM_ISAv4$M$PE$A:L22$X:L11$S22$~IW$USESV6$~STKCKD$USESV7$~SHL$OSPACE$PRES8||
  202. ||BuildAttributes$ARM_ISAv4$M$PE$A:L22$X:L11$S22$~IW$USESV6$~STKCKD$USESV7$~SHL$OSPACE$PRES8|| EQU 0

  203.         ASSERT {ENDIAN} = "little"
  204.         ASSERT {SWST} = {FALSE}
  205.         ASSERT {NOSWST} = {TRUE}
  206.         ASSERT {INTER} = {FALSE}
  207.         ASSERT {ROPI} = {FALSE}
  208.         ASSERT {RWPI} = {FALSE}
  209.         ASSERT {NOT_SHL} = {TRUE}
  210.         ASSERT {FULL_IEEE} = {FALSE}
  211.         ASSERT {SHL1} = {FALSE}
  212.         ASSERT {SHL2} = {FALSE}
  213.         END

  214. --------------------------------------------------------------------------------------
复制代码
linux_Ultra (离线)
积分
39472
帖子
313
发表于 2009-7-27 14:53:01 |显示全部楼层
为什么armcc编出来的 喜欢用大写呢?gnu用小写,可读性不是高点?
一朝成名 (离线)
积分
36914
帖子
1865
发表于 2009-7-27 16:25:54 |显示全部楼层
unix下的编码方式都是小写,简单不用老是切换
win下的匈牙利命名法太麻烦
网名招摇了点,人不招摇,大家都知道:)
linux_Ultra (离线)
积分
39472
帖子
313
发表于 2009-7-28 10:06:12 |显示全部楼层
本帖最后由 linux_Ultra 于 2009-7-28 19:54 编辑

在看 《using gas》 时,顺便做做实验对比一下。
bz,我想看看,了解 汇编 方面的原理,你有什么资料推荐的吗。我找到的只有 using gas ,一本说 汇编器 的书,里边没什么讲汇编的原理。
一朝成名 (离线)
积分
36914
帖子
1865
发表于 2009-7-28 11:05:39 |显示全部楼层
编译的原理其实了解就够了,如果不搞编译器么必要挖的那么深~
网名招摇了点,人不招摇,大家都知道:)
一朝成名 (离线)
积分
36914
帖子
1865
发表于 2009-7-28 11:12:15 |显示全部楼层
编译也是很有技术含量的东东~算是不同个一个分支的了吧
如果只做些了解书还是很多的,貌似有本《编译原理》。很多c语言的书里面也有相应的描述

偶个人建议,能把编译工具和汇编工具使用好就可以了,需要的时候可以帮助debug就够了~
网名招摇了点,人不招摇,大家都知道:)
linux_Ultra (离线)
积分
39472
帖子
313
发表于 2009-7-28 12:23:28 |显示全部楼层
本帖最后由 linux_Ultra 于 2009-7-28 12:25 编辑
编译也是很有技术含量的东东~算是不同个一个分支的了吧
如果只做些了解书还是很多的,貌似有本《编译原理》。很多c语言的书里面也有相应的描述

偶个人建议,能把编译工具和汇编工具使用好就可以了,需要的时候可 ...
一朝成名 发表于 2009-7-28 11:12

《编译原理》?看看。

问题是现在无法了解。
分的清点,把c转汇编指令叫编译,汇编代码 转 机器码叫 汇编 吧。我看gas是搞不清 里边 分了 各种的section,和 table 还 listing 什么的 到底何解。
还有 汇编 语言之所以叫“汇编”,即 assembly -- 到底是什么含义?assemble ,把指令 集合起来的意思?
您需要登录后才可以发表评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备11013910号 | 京公网安备11010502021702
回顶部