一、预处理
1 预处理2 gcc -E Hello.c -o hello.i3 编译4 gcc -S hello.i -o hello.s5 汇编6 gcc -c hello.s -o hello.o7 链接8 gcc hello.o -o hello
1 # 1 "hello.c" 2 # 1 "" 3 # 1 " " 4 # 1 "/usr/include/stdc-predef.h" 1 3 4 5 # 1 " " 2 6 # 1 "hello.c" 7 8 9 10 11 12 13 14 # 1 "/usr/include/stdio.h" 1 3 4 15 # 27 "/usr/include/stdio.h" 3 4 16 # 1 "/usr/include/features.h" 1 3 4 17 # 374 "/usr/include/features.h" 3 4 18 # 1 "/usr/include/i386-linux-gnu/sys/cdefs.h" 1 3 4 19 # 385 "/usr/include/i386-linux-gnu/sys/cdefs.h" 3 4 20 # 1 "/usr/include/i386-linux-gnu/bits/wordsize.h" 1 3 4 21 # 386 "/usr/include/i386-linux-gnu/sys/cdefs.h" 2 3 4 22 # 375 "/usr/include/features.h" 2 3 4 23 # 398 "/usr/include/features.h" 3 4 24 # 1 "/usr/include/i386-linux-gnu/gnu/stubs.h" 1 3 4 25 26 27 28 29 30 31 # 1 "/usr/include/i386-linux-gnu/gnu/stubs-32.h" 1 3 4 32 # 8 "/usr/include/i386-linux-gnu/gnu/stubs.h" 2 3 4 33 # 399 "/usr/include/features.h" 2 3 4 34 # 28 "/usr/include/stdio.h" 2 3 4 35 36 37 38 39 40 # 1 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stddef.h" 1 3 4 41 # 212 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stddef.h" 3 4 42 typedef unsigned int size_t; 43 # 34 "/usr/include/stdio.h" 2 3 4 44 45 # 1 "/usr/include/i386-linux-gnu/bits/types.h" 1 3 4 46 # 27 "/usr/include/i386-linux-gnu/bits/types.h" 3 4 47 # 1 "/usr/include/i386-linux-gnu/bits/wordsize.h" 1 3 4 48 # 28 "/usr/include/i386-linux-gnu/bits/types.h" 2 3 4 49 50 51 typedef unsigned char __u_char; 52 typedef unsigned short int __u_short; 53 typedef unsigned int __u_int; 54 typedef unsigned long int __u_long; 55 56 57 typedef signed char __int8_t; 58 typedef unsigned char __uint8_t; 59 typedef signed short int __int16_t; 60 typedef unsigned short int __uint16_t; 61 typedef signed int __int32_t; 62 typedef unsigned int __uint32_t; 63 64 65 66 67 __extension__ typedef signed long long int __int64_t; 68 __extension__ typedef unsigned long long int __uint64_t; 69 70 71 72 73 74 75 76 __extension__ typedef long long int __quad_t; 77 __extension__ typedef unsigned long long int __u_quad_t; 78 # 121 "/usr/include/i386-linux-gnu/bits/types.h" 3 4 79 # 1 "/usr/include/i386-linux-gnu/bits/typesizes.h" 1 3 4 80 # 122 "/usr/include/i386-linux-gnu/bits/types.h" 2 3 4 81 82 83 __extension__ typedef __u_quad_t __dev_t; 84 __extension__ typedef unsigned int __uid_t; 85 __extension__ typedef unsigned int __gid_t; 86 __extension__ typedef unsigned long int __ino_t; 87 __extension__ typedef __u_quad_t __ino64_t; 88 __extension__ typedef unsigned int __mode_t; 89 __extension__ typedef unsigned int __nlink_t; 90 __extension__ typedef long int __off_t; 91 __extension__ typedef __quad_t __off64_t; 92 __extension__ typedef int __pid_t; 93 __extension__ typedef struct { int __val[2]; } __fsid_t; 94 __extension__ typedef long int __clock_t; 95 __extension__ typedef unsigned long int __rlim_t; 96 __extension__ typedef __u_quad_t __rlim64_t; 97 __extension__ typedef unsigned int __id_t; 98 __extension__ typedef long int __time_t; 99 __extension__ typedef unsigned int __useconds_t;100 __extension__ typedef long int __suseconds_t;101 102 __extension__ typedef int __daddr_t;103 __extension__ typedef int __key_t;104 105 106 __extension__ typedef int __clockid_t;107 108 109 __extension__ typedef void * __timer_t;110 111 112 __extension__ typedef long int __blksize_t;113 114 115 116 117 __extension__ typedef long int __blkcnt_t;118 __extension__ typedef __quad_t __blkcnt64_t;119 120 121 __extension__ typedef unsigned long int __fsblkcnt_t;122 __extension__ typedef __u_quad_t __fsblkcnt64_t;123 124 125 __extension__ typedef unsigned long int __fsfilcnt_t;126 __extension__ typedef __u_quad_t __fsfilcnt64_t;127 128 129 __extension__ typedef int __fsword_t;130 131 __extension__ typedef int __ssize_t;132 133 134 __extension__ typedef long int __syscall_slong_t;135 136 __extension__ typedef unsigned long int __syscall_ulong_t;137 138 139 140 typedef __off64_t __loff_t;141 typedef __quad_t *__qaddr_t;142 typedef char *__caddr_t;143 144 145 __extension__ typedef int __intptr_t;146 147 148 __extension__ typedef unsigned int __socklen_t;149 # 36 "/usr/include/stdio.h" 2 3 4150 # 44 "/usr/include/stdio.h" 3 4151 struct _IO_FILE;152 153 154 155 typedef struct _IO_FILE FILE;156 157 158 159 160 161 # 64 "/usr/include/stdio.h" 3 4162 typedef struct _IO_FILE __FILE;163 # 74 "/usr/include/stdio.h" 3 4164 # 1 "/usr/include/libio.h" 1 3 4165 # 31 "/usr/include/libio.h" 3 4166 # 1 "/usr/include/_G_config.h" 1 3 4167 # 15 "/usr/include/_G_config.h" 3 4168 # 1 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stddef.h" 1 3 4169 # 16 "/usr/include/_G_config.h" 2 3 4170 171 172 173 174 # 1 "/usr/include/wchar.h" 1 3 4175 # 82 "/usr/include/wchar.h" 3 4176 typedef struct177 {178 int __count;179 union180 {181 182 unsigned int __wch;183 184 185 186 char __wchb[4];187 } __value;188 } __mbstate_t;189 # 21 "/usr/include/_G_config.h" 2 3 4190 typedef struct191 {192 __off_t __pos;193 __mbstate_t __state;194 } _G_fpos_t;195 typedef struct196 {197 __off64_t __pos;198 __mbstate_t __state;199 } _G_fpos64_t;200 # 32 "/usr/include/libio.h" 2 3 4201 # 49 "/usr/include/libio.h" 3 4202 # 1 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stdarg.h" 1 3 4203 # 40 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stdarg.h" 3 4204 typedef __builtin_va_list __gnuc_va_list;205 # 50 "/usr/include/libio.h" 2 3 4206 # 144 "/usr/include/libio.h" 3 4207 struct _IO_jump_t; struct _IO_FILE;208 # 154 "/usr/include/libio.h" 3 4209 typedef void _IO_lock_t;210 211 212 213 214 215 struct _IO_marker {216 struct _IO_marker *_next;217 struct _IO_FILE *_sbuf;218 219 220 221 int _pos;222 # 177 "/usr/include/libio.h" 3 4223 };224 225 226 enum __codecvt_result227 {228 __codecvt_ok,229 __codecvt_partial,230 __codecvt_error,231 __codecvt_noconv232 };233 # 245 "/usr/include/libio.h" 3 4234 struct _IO_FILE {235 int _flags;236 237 238 239 240 char* _IO_read_ptr;241 char* _IO_read_end;242 char* _IO_read_base;243 char* _IO_write_base;244 char* _IO_write_ptr;245 char* _IO_write_end;246 char* _IO_buf_base;247 char* _IO_buf_end;248 249 char *_IO_save_base;250 char *_IO_backup_base;251 char *_IO_save_end;252 253 struct _IO_marker *_markers;254 255 struct _IO_FILE *_chain;256 257 int _fileno;258 259 260 261 int _flags2;262 263 __off_t _old_offset;264 265 266 267 unsigned short _cur_column;268 signed char _vtable_offset;269 char _shortbuf[1];270 271 272 273 _IO_lock_t *_lock;274 # 293 "/usr/include/libio.h" 3 4275 __off64_t _offset;276 # 302 "/usr/include/libio.h" 3 4277 void *__pad1;278 void *__pad2;279 void *__pad3;280 void *__pad4;281 size_t __pad5;282 283 int _mode;284 285 char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];286 287 };288 289 290 typedef struct _IO_FILE _IO_FILE;291 292 293 struct _IO_FILE_plus;294 295 extern struct _IO_FILE_plus _IO_2_1_stdin_;296 extern struct _IO_FILE_plus _IO_2_1_stdout_;297 extern struct _IO_FILE_plus _IO_2_1_stderr_;298 # 338 "/usr/include/libio.h" 3 4299 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);300 301 302 303 304 305 306 307 typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf,308 size_t __n);309 310 311 312 313 314 315 316 typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w);317 318 319 typedef int __io_close_fn (void *__cookie);320 # 390 "/usr/include/libio.h" 3 4321 extern int __underflow (_IO_FILE *);322 extern int __uflow (_IO_FILE *);323 extern int __overflow (_IO_FILE *, int);324 # 434 "/usr/include/libio.h" 3 4325 extern int _IO_getc (_IO_FILE *__fp);326 extern int _IO_putc (int __c, _IO_FILE *__fp);327 extern int _IO_feof (_IO_FILE *__fp) __attribute__ ((__nothrow__ , __leaf__));328 extern int _IO_ferror (_IO_FILE *__fp) __attribute__ ((__nothrow__ , __leaf__));329 330 extern int _IO_peekc_locked (_IO_FILE *__fp);331 332 333 334 335 336 extern void _IO_flockfile (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));337 extern void _IO_funlockfile (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));338 extern int _IO_ftrylockfile (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));339 # 464 "/usr/include/libio.h" 3 4340 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict,341 __gnuc_va_list, int *__restrict);342 extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict,343 __gnuc_va_list);344 extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t);345 extern size_t _IO_sgetn (_IO_FILE *, void *, size_t);346 347 extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int);348 extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int);349 350 extern void _IO_free_backup_area (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));351 # 75 "/usr/include/stdio.h" 2 3 4352 353 354 355 356 typedef __gnuc_va_list va_list;357 # 90 "/usr/include/stdio.h" 3 4358 typedef __off_t off_t;359 # 102 "/usr/include/stdio.h" 3 4360 typedef __ssize_t ssize_t;361 362 363 364 365 366 367 368 typedef _G_fpos_t fpos_t;369 370 371 372 373 # 164 "/usr/include/stdio.h" 3 4374 # 1 "/usr/include/i386-linux-gnu/bits/stdio_lim.h" 1 3 4375 # 165 "/usr/include/stdio.h" 2 3 4376 377 378 379 extern struct _IO_FILE *stdin;380 extern struct _IO_FILE *stdout;381 extern struct _IO_FILE *stderr;382 383 384 385 386 387 388 389 extern int remove (const char *__filename) __attribute__ ((__nothrow__ , __leaf__));390 391 extern int rename (const char *__old, const char *__new) __attribute__ ((__nothrow__ , __leaf__));392 393 394 395 396 extern int renameat (int __oldfd, const char *__old, int __newfd,397 const char *__new) __attribute__ ((__nothrow__ , __leaf__));398 399 400 401 402 403 404 405 406 extern FILE *tmpfile (void) ;407 # 209 "/usr/include/stdio.h" 3 4408 extern char *tmpnam (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ;409 410 411 412 413 414 extern char *tmpnam_r (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ;415 # 227 "/usr/include/stdio.h" 3 4416 extern char *tempnam (const char *__dir, const char *__pfx)417 __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) ;418 419 420 421 422 423 424 425 426 extern int fclose (FILE *__stream);427 428 429 430 431 extern int fflush (FILE *__stream);432 433 # 252 "/usr/include/stdio.h" 3 4434 extern int fflush_unlocked (FILE *__stream);435 # 266 "/usr/include/stdio.h" 3 4436 437 438 439 440 441 442 extern FILE *fopen (const char *__restrict __filename,443 const char *__restrict __modes) ;444 445 446 447 448 extern FILE *freopen (const char *__restrict __filename,449 const char *__restrict __modes,450 FILE *__restrict __stream) ;451 # 295 "/usr/include/stdio.h" 3 4452 453 # 306 "/usr/include/stdio.h" 3 4454 extern FILE *fdopen (int __fd, const char *__modes) __attribute__ ((__nothrow__ , __leaf__)) ;455 # 319 "/usr/include/stdio.h" 3 4456 extern FILE *fmemopen (void *__s, size_t __len, const char *__modes)457 __attribute__ ((__nothrow__ , __leaf__)) ;458 459 460 461 462 extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __attribute__ ((__nothrow__ , __leaf__)) ;463 464 465 466 467 468 469 extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __attribute__ ((__nothrow__ , __leaf__));470 471 472 473 extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,474 int __modes, size_t __n) __attribute__ ((__nothrow__ , __leaf__));475 476 477 478 479 480 extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,481 size_t __size) __attribute__ ((__nothrow__ , __leaf__));482 483 484 extern void setlinebuf (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));485 486 487 488 489 490 491 492 493 extern int fprintf (FILE *__restrict __stream,494 const char *__restrict __format, ...);495 496 497 498 499 extern int printf (const char *__restrict __format, ...);500 501 extern int sprintf (char *__restrict __s,502 const char *__restrict __format, ...) __attribute__ ((__nothrow__));503 504 505 506 507 508 extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,509 __gnuc_va_list __arg);510 511 512 513 514 extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg);515 516 extern int vsprintf (char *__restrict __s, const char *__restrict __format,517 __gnuc_va_list __arg) __attribute__ ((__nothrow__));518 519 520 521 522 523 extern int snprintf (char *__restrict __s, size_t __maxlen,524 const char *__restrict __format, ...)525 __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 4)));526 527 extern int vsnprintf (char *__restrict __s, size_t __maxlen,528 const char *__restrict __format, __gnuc_va_list __arg)529 __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 0)));530 531 # 412 "/usr/include/stdio.h" 3 4532 extern int vdprintf (int __fd, const char *__restrict __fmt,533 __gnuc_va_list __arg)534 __attribute__ ((__format__ (__printf__, 2, 0)));535 extern int dprintf (int __fd, const char *__restrict __fmt, ...)536 __attribute__ ((__format__ (__printf__, 2, 3)));537 538 539 540 541 542 543 544 545 extern int fscanf (FILE *__restrict __stream,546 const char *__restrict __format, ...) ;547 548 549 550 551 extern int scanf (const char *__restrict __format, ...) ;552 553 extern int sscanf (const char *__restrict __s,554 const char *__restrict __format, ...) __attribute__ ((__nothrow__ , __leaf__));555 # 443 "/usr/include/stdio.h" 3 4556 extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) __asm__ ("" "__isoc99_fscanf")557 558 ;559 extern int scanf (const char *__restrict __format, ...) __asm__ ("" "__isoc99_scanf")560 ;561 extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) __asm__ ("" "__isoc99_sscanf") __attribute__ ((__nothrow__ , __leaf__))562 563 ;564 # 463 "/usr/include/stdio.h" 3 4565 566 567 568 569 570 571 572 573 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format,574 __gnuc_va_list __arg)575 __attribute__ ((__format__ (__scanf__, 2, 0))) ;576 577 578 579 580 581 extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg)582 __attribute__ ((__format__ (__scanf__, 1, 0))) ;583 584 585 extern int vsscanf (const char *__restrict __s,586 const char *__restrict __format, __gnuc_va_list __arg)587 __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__format__ (__scanf__, 2, 0)));588 # 494 "/usr/include/stdio.h" 3 4589 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vfscanf")590 591 592 593 __attribute__ ((__format__ (__scanf__, 2, 0))) ;594 extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vscanf")595 596 __attribute__ ((__format__ (__scanf__, 1, 0))) ;597 extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vsscanf") __attribute__ ((__nothrow__ , __leaf__))598 599 600 601 __attribute__ ((__format__ (__scanf__, 2, 0)));602 # 522 "/usr/include/stdio.h" 3 4603 604 605 606 607 608 609 610 611 612 extern int fgetc (FILE *__stream);613 extern int getc (FILE *__stream);614 615 616 617 618 619 extern int getchar (void);620 621 # 550 "/usr/include/stdio.h" 3 4622 extern int getc_unlocked (FILE *__stream);623 extern int getchar_unlocked (void);624 # 561 "/usr/include/stdio.h" 3 4625 extern int fgetc_unlocked (FILE *__stream);626 627 628 629 630 631 632 633 634 635 636 637 extern int fputc (int __c, FILE *__stream);638 extern int putc (int __c, FILE *__stream);639 640 641 642 643 644 extern int putchar (int __c);645 646 # 594 "/usr/include/stdio.h" 3 4647 extern int fputc_unlocked (int __c, FILE *__stream);648 649 650 651 652 653 654 655 extern int putc_unlocked (int __c, FILE *__stream);656 extern int putchar_unlocked (int __c);657 658 659 660 661 662 663 extern int getw (FILE *__stream);664 665 666 extern int putw (int __w, FILE *__stream);667 668 669 670 671 672 673 674 675 extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)676 ;677 # 638 "/usr/include/stdio.h" 3 4678 extern char *gets (char *__s) __attribute__ ((__deprecated__));679 680 681 # 665 "/usr/include/stdio.h" 3 4682 extern __ssize_t __getdelim (char **__restrict __lineptr,683 size_t *__restrict __n, int __delimiter,684 FILE *__restrict __stream) ;685 extern __ssize_t getdelim (char **__restrict __lineptr,686 size_t *__restrict __n, int __delimiter,687 FILE *__restrict __stream) ;688 689 690 691 692 693 694 695 extern __ssize_t getline (char **__restrict __lineptr,696 size_t *__restrict __n,697 FILE *__restrict __stream) ;698 699 700 701 702 703 704 705 706 extern int fputs (const char *__restrict __s, FILE *__restrict __stream);707 708 709 710 711 712 extern int puts (const char *__s);713 714 715 716 717 718 719 extern int ungetc (int __c, FILE *__stream);720 721 722 723 724 725 726 extern size_t fread (void *__restrict __ptr, size_t __size,727 size_t __n, FILE *__restrict __stream) ;728 729 730 731 732 extern size_t fwrite (const void *__restrict __ptr, size_t __size,733 size_t __n, FILE *__restrict __s);734 735 # 737 "/usr/include/stdio.h" 3 4736 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,737 size_t __n, FILE *__restrict __stream) ;738 extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size,739 size_t __n, FILE *__restrict __stream);740 741 742 743 744 745 746 747 748 extern int fseek (FILE *__stream, long int __off, int __whence);749 750 751 752 753 extern long int ftell (FILE *__stream) ;754 755 756 757 758 extern void rewind (FILE *__stream);759 760 # 773 "/usr/include/stdio.h" 3 4761 extern int fseeko (FILE *__stream, __off_t __off, int __whence);762 763 764 765 766 extern __off_t ftello (FILE *__stream) ;767 # 792 "/usr/include/stdio.h" 3 4768 769 770 771 772 773 774 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);775 776 777 778 779 extern int fsetpos (FILE *__stream, const fpos_t *__pos);780 # 815 "/usr/include/stdio.h" 3 4781 782 # 824 "/usr/include/stdio.h" 3 4783 784 785 extern void clearerr (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));786 787 extern int feof (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;788 789 extern int ferror (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;790 791 792 793 794 extern void clearerr_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));795 extern int feof_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;796 extern int ferror_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;797 798 799 800 801 802 803 804 805 extern void perror (const char *__s);806 807 808 809 810 811 812 # 1 "/usr/include/i386-linux-gnu/bits/sys_errlist.h" 1 3 4813 # 26 "/usr/include/i386-linux-gnu/bits/sys_errlist.h" 3 4814 extern int sys_nerr;815 extern const char *const sys_errlist[];816 # 854 "/usr/include/stdio.h" 2 3 4817 818 819 820 821 extern int fileno (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;822 823 824 825 826 extern int fileno_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;827 # 873 "/usr/include/stdio.h" 3 4828 extern FILE *popen (const char *__command, const char *__modes) ;829 830 831 832 833 834 extern int pclose (FILE *__stream);835 836 837 838 839 840 extern char *ctermid (char *__s) __attribute__ ((__nothrow__ , __leaf__));841 # 913 "/usr/include/stdio.h" 3 4842 extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));843 844 845 846 extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;847 848 849 extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));850 # 943 "/usr/include/stdio.h" 3 4851 852 # 9 "hello.c" 2853 854 int main(int argc, char* argv[])855 {856 printf("Hello , world !\n");857 858 return 0;859 }
1 .file "hello.c" 2 .section .rodata 3 .LC0: 4 .string "Hello , world !" 5 .text 6 .globl main 7 .type main, @function 8 main: 9 .LFB0:10 .cfi_startproc11 pushl %ebp12 .cfi_def_cfa_offset 813 .cfi_offset 5, -814 movl %esp, %ebp15 .cfi_def_cfa_register 516 andl $-16, %esp17 subl $16, %esp18 movl $.LC0, (%esp)19 call puts20 movl $0, %eax21 leave22 .cfi_restore 523 .cfi_def_cfa 4, 424 ret25 .cfi_endproc26 .LFE0:27 .size main, .-main28 .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"29 .section .note.GNU-stack,"",@progbits
gcc编译过程:
1.去掉程序中的注释;
2.文件包含:当对C源程序进行预处理时,文件包含指的是将.c文件包含的头文件内容复制到当前.c文件中。
1》、第一种:#include <stdio.h> 直接去系统头文件目录下寻找所包含的头文件。
2》、第二种:#include "head.h" 先在当前目录下寻找所包含的头文件,如果找不到,则再去系统头文件目录下寻找所包含的头文件。
3.宏替换
当对C源程序进行预处理时,如果程序中有事先定义好的宏,则会将所有的宏后面的字符串替换,例如:
1》预定义宏:
1 __FILE__ //正在编译的文件名(字符串常量) 2 __LINE__ //文件当前的行号(整型常量)3 __FUNCTION__ //当前所在的函数名(字符串常量)4 __DATE__ //预编译文件的日期(字符串常量)5 __TIME__ //预编译文件的时间(字符串常量)6 __STDC__ //判断编译器是否遵循ANSI C,是则为1(整型常量)
2》不带参数的宏:#define 宏名 字符串
1 /******************************************************************* 2 * > File Name: noParamMacros.c 3 * > Author: fly 4 * > Mail: XXXXXXXX@icode.com 5 * > Create Time: Sun 17 Sep 2017 01:00:07 PM CST 6 ******************************************************************/ 7 8 #include9 10 #define PI 3.14*211 #define M 6012 #define S "HelloWorld"13 14 int main(int argc, char* argv[])15 {16 printf("%f\n", PI);17 printf("%d\n", M);18 printf("%s\n", S);19 20 return 0;21 }
3》带参数的宏:可以像函数一样被调用。
1 /******************************************************************* 2 * > File Name: paramMacros.c 3 * > Author: fly 4 * > Mail: XXXXXXXX@icode.com 5 * > Create Time: Sun 17 Sep 2017 01:40:15 PM CST 6 ******************************************************************/ 7 8 #include9 10 #define FUN(a, b) a+b*a11 12 #define FALSE 013 #define TRUE 114 15 int fun(int a, int b){16 return a+b*a;17 }18 19 int main(int argc, char* argv[])20 {21 int a = 5, b =3;22 int c;23 24 c = fun(a, b); //函数调用25 printf("c = %d\n", c);26 27 c = FUN(a, b); //宏调用28 29 float f;30 31 #if (DataType == FALSE)32 f = fun(3.1, 4.5); //Data type is error33 printf("f = %f\n", f);34 #else35 f = FUN(3.1, 4.5); //Data type is correct36 printf("f = %f\n", f);37 #endif38 39 return 0;40 }
在上述例子中,由于传参时,可能会传一个表达式,这是调用带参宏就会导致结果不正确,所以一般在定义带参宏时,都会如下去定义: #define FUN(a, b) (a)+(b)*(a)
4.条件编译:在编译程序之前,按照某个条件来选择需要编译哪一段代码。
1》第一种方式:
1 /******************************************************************* 2 * > File Name: ifdef.c 3 * > Author: fly 4 * > Mail: XXXXXXXX@icode.com 5 * > Create Time: Sun 17 Sep 2017 02:51:43 PM CST 6 ******************************************************************/ 7 8 #include9 10 #define DEBUG11 12 //有如下两个函数,如果要测试这两个函数是否正确,则必须写主函数测试13 void fun1(void){14 printf("hello world\n");15 }16 17 void fun2(void){18 printf("This is a good idea !\n");19 }20 21 //下面为测试代码22 #ifdef DEBUG23 int main(int argc, char* argv[])24 {25 fun1();26 fun2();27 28 return 0;29 }30 #endif
2》第二种方式:
1 #ifdef __HEAD_H_ 2 #define __HEAD_H_ 3 4 #include5 6 int x = 100; 7 8 #endif 9 10 //该条件编译的作用是,防止头文件被多次(重复)包含。
3》第三种方式:
1 //用于注释一段代码 2 #if (0) 3 #include "head.h" 4 #include "head.h" 5 #include "head.h" 6 #include "head.h" 7 #include "head.h" 8 #include "head.h" 9 #include "head.h"10 #include "head.h"11 #endif
二、字节序
1.计算机在存储多字节数据时,数据内部各个字节的存储顺序称为字节序;
4字节:unsigned int word = 0x12345678;
2.端序
1》小端序(little-endian):最高有效位所在的字节放在最高字节位置,其他字节依次放在低字节位置,则该字节序称为高位优先。
2》大端序(big-endian):最低有效位所在的字节放在最高字节位置,其他字节依次放在低字节位置,则该字节序称为低位优先。
1 /******************************************************************* 2 * > File Name: endian.c 3 * > Author: fly 4 * > Mail: XXXXXXXX@icode.com 5 * > Create Time: Sun 17 Sep 2017 04:34:11 PM CST 6 ******************************************************************/ 7 8 #include9 #include 10 11 #define FALSE 012 #define TRUE 113 14 bool is_little_endian(void){15 bool ret;16 unsigned int word = 0x12345678;17 18 unsigned char byte0 = *((unsigned char *)&word + 0);19 unsigned char byte1 = *((unsigned char *)&word + 1);20 unsigned char byte2 = *((unsigned char *)&word + 2);21 unsigned char byte3 = *((unsigned char *)&word + 3);22 23 printf("%p---->0x%hhx\n", &byte0, byte0);24 printf("%p---->0x%hhx\n", &byte1, byte1);25 printf("%p---->0x%hhx\n", &byte2, byte2);26 printf("%p---->0x%hhx\n", &byte3, byte3);27 28 if(byte0 == 0x78){29 printf("the machine is little endian !\n");30 ret = TRUE;31 }else if(byte0 == 0x12){32 printf("the machine is big endian !\n");33 ret = FALSE;34 }35 36 return ret;37 }38 39 int main(int argc, char* argv[])40 {41 if(is_little_endian() == TRUE){42 printf("Little endian is true !\n");43 }44 45 return 0;46 }
执行结果:
1 /******************************************************************* 2 * > File Name: endian1.c 3 * > Author: fly 4 * > Mail: XXXXXXXX@icode.com 5 * > Create Time: Sun 17 Sep 2017 05:02:58 PM CST 6 ******************************************************************/ 7 8 #include9 10 union A{11 unsigned int word;12 unsigned char byte;13 };14 15 int main(int argc, char* argv[])16 {17 union A un;18 19 un.word = 0x12345678;20 if(un.byte == 0x78){21 printf("the machine is little endian !\n");22 }else if(un.byte == 0x12){23 printf("the machine is big endian !\n");24 }25 26 return 0;27 }
三、地址对齐
为了提高CPU从内存中存取数据的效率,在给数据分配内存空间时,会有意的将数据放在某些地址位置,这种分配空间的方式称为地址对齐。
1》自然对齐:在给数据分配空间是时,如果数据的起始地址能够被数据的长度整除,则该分配空间的方式为自然对齐。
2》数据的M值:
对于每一个数据都有M值,M值如下:
1)对于基本数据类型:
如果该数据的长度小于机器字字长,则它的M值为自身的长度;
如果该数据的长度大于或者等于机器字长,则它的M值为机器字长;
2)对于数组:
M值为元素的M值;
3)对于结构体,共用体:
M值为成员中最大的M值;
3》适当对齐:在给数据分配空间时,如果数据的起始地址能够被数据的M值整除,则该分配空间的方式为适当对齐。
4》结构体的存储:
1 /******************************************************************* 2 * > File Name: align.c 3 * > Author: fly 4 * > Mail: XXXXXXXX@icode.com 5 * > Create Time: Sun 17 Sep 2017 05:15:23 PM CST 6 ******************************************************************/ 7 8 #include9 10 struct param{11 char a;12 short b;13 int c;14 };15 16 struct param1{17 char a;18 int b;19 short c;20 };21 22 int main(int argc, char* argv[])23 {24 struct param p1;25 printf("sizeof(struct param) = %d\tsizeof p1 = %d\n", sizeof(struct param), sizeof p1);26 27 struct param1 p2;28 printf("sizeof(struct param1) = %d\tsizeof p2 = %d\n", sizeof(struct param1), sizeof p2);29 30 return 0;31 }
执行结果: