对比 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
--------------------------------------------------------------------------------------
网友评论
一朝成名 2009年07月27日
unix下的编码方式都是小写,简单不用老是切换:lol
win下的匈牙利命名法太麻烦:lol
unix下的编码方式都是小写,简单不用老是切换:lol
win下的匈牙利命名法太麻烦:lol
linux_Ultra 2009年07月28日
本帖最后由 linux_Ultra 于 2009-7-28 19:54 编辑
在看 《using gas》 时,顺便做做实验对比一下。
bz,我想看看,了解 汇编 方面的原理,你有什么资料推荐的吗。我找到的只有 using gas ,一本说 汇编器 的书,里边没什么讲汇编的原理。
本帖最后由 linux_Ultra 于 2009-7-28 19:54 编辑
在看 《using gas》 时,顺便做做实验对比一下。
bz,我想看看,了解 汇编 方面的原理,你有什么资料推荐的吗。我找到的只有 using gas ,一本说 汇编器 的书,里边没什么讲汇编的原理。
一朝成名 2009年07月28日
编译的原理其实了解就够了,如果不搞编译器么必要挖的那么深~
编译的原理其实了解就够了,如果不搞编译器么必要挖的那么深~
一朝成名 2009年07月28日
编译也是很有技术含量的东东~算是不同个一个分支的了吧
如果只做些了解书还是很多的,貌似有本《编译原理》。很多c语言的书里面也有相应的描述
偶个人建议,能把编译工具和汇编工具使用好就可以了,需要的时候可以帮助debug就够了~
编译也是很有技术含量的东东~算是不同个一个分支的了吧
如果只做些了解书还是很多的,貌似有本《编译原理》。很多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 ,把指令 集合起来的意思?
本帖最后由 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 ,把指令 集合起来的意思?
为什么armcc编出来的 喜欢用大写呢?gnu用小写,可读性不是高点?