home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine 1996 / ARCHIVE_96.iso / discs / mag_discs / volume_7 / issue_06 / crossley / PROGXMPL
Text File  |  1994-02-07  |  3KB  |  73 lines

  1. /*  C program for an example of compilation, not an example for  */
  2. /*  a discussion of C programming   */
  3.  
  4. /*    > c.test       */
  5.  
  6. #include <stdio.h>
  7. #include "time.h"
  8.  
  9. int main()
  10. {
  11.    int   a,i;
  12.    double  ra=12.5,rb ;
  13.    printf("%d   ",clock());
  14.    for(i=1;i<=10000000;i++) {
  15.      ra=i  ;
  16.      rb=ra*ra ;
  17.      printf("%e  ",rb); 
  18.    }
  19.    printf("%d\n",clock());        
  20. }
  21.  
  22. /*
  23. Part of the final program in machine code with its assembler code,
  24. some of the lines have been commented to show their relation to the 
  25. C code, note that this is only a fragment of the executable code.
  26.     A discussion of mixed high and low level programs could form 
  27. a third article (Editor willing) but I do not want to go more deeply
  28. into the subject at this time. 
  29.  
  30. machine code   assembly language                 ; comment
  31.  
  32. : E1A0C00D : MOV     R12,R13
  33. : E92DD870 : STMDB   R13!,{R4-R6,R11,R12,R14,PC} ; save some registers
  34. : E24CB004 : SUB     R11,R12,#4
  35. : E15D000A : CMP     R13,R10
  36. : BB0000C0 : BLLT    &000083A8          ; check stack space
  37. : EB0000D8 : BL      &0000840C          ; get time
  38. : E1A01000 : MOV     R1,R0
  39. : E28F0F14 : ADR     R0,&00008104
  40. : EB0000D2 : BL      &00008400          ; print it
  41. : E3A05001 : MOV     R5,#1              ; initial value in counter
  42. : E3A06D5A : MOV     R6,#&1680          ; =5760
  43. : E2866502 : ADD     R6,R6,#&00800000   ; put 10000000 in counter
  44. : E2866962 : ADD     R6,R6,#&00188000   ; maximum
  45. : E3A04000 : MOV     R4,#0
  46. : EE005190 : FLTD    R5,F0           *  ; put counter into fp register
  47. : EE100180 : MUFD    F0,F0,F0           ; multiply
  48. : ED2D8102 : STFD    F0,[R13,#-8]!      ; store result, 2 words 
  49. : E28F0F0C : ADR     R0,&0000810C       ; get address of format stmnt        
  50. : E8BD0006 : LDMIA   R13!,{R1,R2}       ; get 2 words of result
  51. : EB000108 : BL      &00008504          ; print it
  52. : E2855001 : ADD     R5,R5,#1           ; inc the counter
  53. : E1550006 : CMP     R5,R6              ; reached max ?
  54. : DAFFFFF6 : BLE     &000080C8          ; no, go to start of loop at *
  55. : EB0000C6 : BL      &0000840C          ; yes, get time
  56. : E1A01000 : MOV     R1,R0
  57. : E28F0F06 : ADR     R0,&00008114
  58. : EB0000C0 : BL      &00008400          ; print the result
  59. : E1A00004 : MOV     R0,R4
  60. : E95BA870 : LDMDB   R11,{R4-R6,R11,R13,PC}^  ; retreive the registers
  61. : 20206425 :                                  ; '%d  ' format  
  62. : 00000020 : ANDEQ   R0,R0,R0,LSR #32
  63. : 20206525 :                                  ; '%e  ' format 
  64. : 00000000 : ANDEQ   R0,R0,R0
  65. : 000A6425 :                                  ; '%d<crtrtn> format
  66.  
  67.    The reader will notice that there are many extra lines which 
  68. have nocounterpart in the C program, in addition the source code 
  69. uses 2 floating point variables 'ra' and 'rb' and an integer 
  70. 'a' but only one floating point variable appears in the final 
  71. program, in F0 and 'a' also has gone. This is an example of the 
  72. compiler being efficient. 
  73. */