对比 armcc 和 arm-elf-gcc 的编译结果

2009年07月27日 14:40    发布者:linux_Ultra
本帖最后由 linux_Ultra 于 2009-7-27 14:46 编辑

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


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

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

--------------------------------------------------------------------------------------

先在debian5.0上用gcc4.3.2编:
gcc -Wall -S  -O0 1.c -o app_gcc.S
--------------------------------------------------------------------------------------
        .file    "1.c"
.globl a
    .data
    .align 4
    .type    a, @object
    .size    a, 4
a:
    .long    123
.globl b
    .align 4
    .type    b, @object
    .size    b, 16
b:
    .long    1
    .long    2
    .long    3
    .long    4
.globl ch
    .type    ch, @object
    .size    ch, 7
ch:
    .string    "AAAAAA"
    .text
.globl main
    .type    main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl    -4(%ecx)
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %ecx
    subl    $32, %esp
    movl    $456, -8(%ebp)
    movl    $5, -24(%ebp)
    movl    $6, -20(%ebp)
    movl    $7, -16(%ebp)
    movl    $8, -12(%ebp)
    movl    $1633771873, -31(%ebp)
    movw    $24929, -27(%ebp)
    movb    $0, -25(%ebp)
    movl    $0, %eax
    addl    $32, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
    .size    main, .-main
    .ident    "GCC: (Debian 4.3.2-1.1) 4.3.2"
    .section    .note.GNU-stack,"",@progbits


--------------------------------------------------------------------------------------

在win xp上用arm-elf-gcc编。
arm-elf-gcc -Wall  -S -O0 1.c -o app_armgcc.s
--------------------------------------------------------------------------------------
        .file    "1.c"
    .global    a
    .data
    .align    2
    .type    a, %object
    .size    a, 4
a:
    .word    123
    .global    b
    .align    2
    .type    b, %object
    .size    b, 16
b:
    .word    1
    .word    2
    .word    3
    .word    4
    .global    ch
    .align    2
    .type    ch, %object
    .size    ch, 7
ch:
    .ascii    "AAAAAA\000"
    .section    .rodata
    .align    2
    .type    C.0.1181, %object
    .size    C.0.1181, 16
C.0.1181:
    .word    5
    .word    6
    .word    7
    .word    8
    .align    2
.LC0:
    .ascii    "aaaaaa\000"
    .text
    .align    2
    .global    main
    .type    main, %function
main:
    @ args = 0, pretend = 0, frame = 28
    @ frame_needed = 1, uses_anonymous_args = 0
    mov    ip, sp
    stmfd    sp!, {fp, ip, lr, pc}
    sub    fp, ip, #4
    sub    sp, sp, #28
    mov    r3, #456
    str    r3,
    ldr    r3, .L3
    sub    ip, fp, #32
    ldmia    r3, {r0, r1, r2, r3}
    stmia    ip, {r0, r1, r2, r3}
    ldr    r3, .L3+4
    sub    r2, fp, #39
    mov    ip, #7
    mov    r0, r2
    mov    r1, r3
    mov    r2, ip
    bl    memcpy
    mov    r3, #0
    mov    r0, r3
    sub    sp, fp, #12
    ldmfd    sp, {fp, sp, pc}
.L4:
    .align    2
.L3:
    .word    C.0.1181
    .word    .LC0
    .size    main, .-main
    .ident    "GCC: (GNU) 4.3.2"

--------------------------------------------------------------------------------------

在win xp上用armcc编。
armcc -S -O0 1.c -o app_armcc.s
--------------------------------------------------------------------------------------
; generated by ARM C Compiler, ADS1.2

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

        AREA ||.text||, CODE, READONLY

main PROC
|L1.0|
        STR      lr,!
        SUB      sp,sp,#0x18
        MOV      lr,#0x1c8
        LDR      r1,|L1.60|
        ADD      r0,sp,#8
        LDMIA    r1,{r1-r3,r12}
        STMIA    r0,{r1-r3,r12}
        LDR      r0,|L1.64|
        LDR      r1,  ; ,
        LDR      r0,
        STR      r0,
        STR      r1,
        MOV      r0,#0
        ADD      sp,sp,#0x18
        LDR      pc,,#4
|L1.60|
        DCD      ||.constdata$1||
|L1.64|
        DCD      ||.constdata$1|| + 16
        ENDP



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

||.data$0||
a
        DCD      0x0000007b
b
        DCD      0x00000001
        DCD      0x00000002
        DCD      0x00000003
        DCD      0x00000004
||ch||
        DCB      0x41,0x41,0x41,0x41
        DCB      0x41,0x41,0x00
        DCB      0x00


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

||.constdata$1||
        DCD      0x00000005
        DCD      0x00000006
        DCD      0x00000007
        DCD      0x00000008
        DCB      0x61,0x61,0x61,0x61
        DCB      0x61,0x61,0x00
        DCB      0x00


        EXPORT main
        EXPORT ||ch||
        EXPORT b
        EXPORT a

        IMPORT _main
        IMPORT __main
        IMPORT ||Lib$Request$armlib||, WEAK

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

        ASSERT {ENDIAN} = "little"
        ASSERT {SWST} = {FALSE}
        ASSERT {NOSWST} = {TRUE}
        ASSERT {INTER} = {FALSE}
        ASSERT {ROPI} = {FALSE}
        ASSERT {RWPI} = {FALSE}
        ASSERT {NOT_SHL} = {TRUE}
        ASSERT {FULL_IEEE} = {FALSE}
        ASSERT {SHL1} = {FALSE}
        ASSERT {SHL2} = {FALSE}
        END

--------------------------------------------------------------------------------------

网友评论

linux_Ultra 2009年07月27日
为什么armcc编出来的 喜欢用大写呢?gnu用小写,可读性不是高点?
一朝成名 2009年07月27日
unix下的编码方式都是小写,简单不用老是切换:lol
win下的匈牙利命名法太麻烦:lol
linux_Ultra 2009年07月28日
本帖最后由 linux_Ultra 于 2009-7-28 19:54 编辑

在看 《using gas》 时,顺便做做实验对比一下。
bz,我想看看,了解 汇编 方面的原理,你有什么资料推荐的吗。我找到的只有 using gas ,一本说 汇编器 的书,里边没什么讲汇编的原理。
一朝成名 2009年07月28日
编译的原理其实了解就够了,如果不搞编译器么必要挖的那么深~
一朝成名 2009年07月28日
编译也是很有技术含量的东东~算是不同个一个分支的了吧
如果只做些了解书还是很多的,貌似有本《编译原理》。很多c语言的书里面也有相应的描述

偶个人建议,能把编译工具和汇编工具使用好就可以了,需要的时候可以帮助debug就够了~
linux_Ultra 2009年07月28日
本帖最后由 linux_Ultra 于 2009-7-28 12:25 编辑

编译也是很有技术含量的东东~算是不同个一个分支的了吧
如果只做些了解书还是很多的,貌似有本《编译原理》。很多c语言的书里面也有相应的描述

偶个人建议,能把编译工具和汇编工具使用好就可以了,需要的时候可 ...
一朝成名 发表于 2009-7-28 11:12 http://bbs.eechina.com/images/common/back.gif
《编译原理》?看看。

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