DocBook SGML QuickStart
gcc -S -o - a.c
Read on for a little dissection and/or go play with it and read the man page for gcc.
Here is the C file I'm using, a.c. It just loops through the command line arguments and prints them.
#include <stdio.h>
int main( int argc, char **argv ){
int i;
printf("argc: %d\n",argc);
for( i=0; i < argc; i++ ){
printf("argv[%d]: %s\n", i, argv[i]);
}
}
So, again. Here is the command to get the assembly on the terminal.
gcc -S -o - a.c
Let's break that down into pieces.
Linux x86 on a PII
.file "a.c"
.version "01.01"
gcc2_compiled.:
.section .rodata
.LC0:
.string "argc: %d\n"
.LC1:
.string "argv[%d]: %s\n"
.text
.align 4
.globl main
.type main,@function
main:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
addl $-8,%esp
movl 8(%ebp),%eax
pushl %eax
pushl $.LC0
call printf
addl $16,%esp
movl $0,-4(%ebp)
.p2align 4,,7
.L3:
movl -4(%ebp),%eax
cmpl 8(%ebp),%eax
jl .L6
jmp .L4
.p2align 4,,7
.L6:
addl $-4,%esp
movl -4(%ebp),%eax
leal 0(,%eax,4),%edx
movl 12(%ebp),%eax
movl (%eax,%edx),%edx
pushl %edx
movl -4(%ebp),%eax
pushl %eax
pushl $.LC1
call printf
addl $16,%esp
.L5:
incl -4(%ebp)
jmp .L3
.p2align 4,,7
.L4:
.L2:
leave
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 2.95.4 20011002 (Debian prerelease)"
Mac OS X PPC on a G4
.data
.cstring
.align 2
LC0:
.ascii "argc: %d\12\0"
.align 2
LC1:
.ascii "argv[%d]: %s\0"
.text
.align 2
.globl _main
_main:
mflr r0
stmw r30,-8(r1)
stw r0,8(r1)
stwu r1,-96(r1)
mr r30,r1
bcl 20,31,L1$pb
L1$pb:
mflr r31
stw r3,120(r30)
stw r4,124(r30)
addis r3,r31,ha16(LC0-L1$pb)
la r3,lo16(LC0-L1$pb)(r3)
lwz r4,120(r30)
bl L_printf$stub
li r0,0
stw r0,64(r30)
L6:
lwz r0,64(r30)
lwz r9,120(r30)
cmpw cr0,r0,r9
blt cr0,L9
b L7
L9:
lwz r0,64(r30)
slwi r9,r0,2
lwz r0,124(r30)
add r9,r9,r0
addis r3,r31,ha16(LC1-L1$pb)
la r3,lo16(LC1-L1$pb)(r3)
lwz r4,64(r30)
lwz r5,0(r9)
bl L_printf$stub
lwz r9,64(r30)
addi r0,r9,1
stw r0,64(r30)
b L6
L7:
mr r3,r0
lwz r1,0(r1)
lwz r0,8(r1)
mtlr r0
lmw r30,-8(r1)
blr
.data
.picsymbol_stub
L_printf$stub:
.indirect_symbol _printf
mflr r0
bcl 20,31,L0$_printf
L0$_printf:
mflr r11
addis r11,r11,ha16(L_printf$lazy_ptr-L0$_printf)
mtlr r0
lwz r12,lo16(L_printf$lazy_ptr-L0$_printf)(r11)
mtctr r12
addi r11,r11,lo16(L_printf$lazy_ptr-L0$_printf)
bctr
.data
.lazy_symbol_pointer
L_printf$lazy_ptr:
.indirect_symbol _printf
.long dyld_stub_binding_helper
This is a great tool as a starting place for learning some of the differences is the assemblies between different architectures. You could take the same "Hello world" program and compile it using gcc on a number of readily accessible architectures (x86, ppc).
gcc -S -o - a.c
Read on for a little dissection and/or go play with it and read the man page for gcc.
Here is a.c
This is a great tool as a starting place for learning some of the differences is the assemblies between different architectures. You could take the same "Hello world" program and compile it using gcc on a number of readily accessible architectures (x86, ppc).
#include
int main( int argc, char **argv ){
int i;
printf("argc: %d\n",argc);
for( i=0; i
Let's look at that command again
gcc -S -o - a.c