C By Example Part 3: Compiler, Assembler and Linker
Exercises
Practice your editor skills and create following files in a directory of your choice:
-
File foo.c with
1 2 3 4 5 6 7
void bar(void); int main() { bar(); }
-
File bar.c with
1 2 3 4 5 6 7
int printf(const char *, ...); void bar() { printf("foo bar\n"); }
Translate the source files into an executable
First use the following one-line command and check that the executable does what you expect:
theon$ gcc foo.c bar.c theon$ a.out foo bar theon$
Of course you also do things more manual. And you will see there are reasons why this is of advantage. For example with
theon$ gcc -S foo.c theon$ gcc -c foo.s theon$ gcc -S bar.c theon$ gcc -c bar.s theon$ gcc foo.o bar.o theon$ a.out foo bar theon$
we invoke the tools one by one. Actually except for the preprocessor which will be invoked together with the compiler when you use the option -S.
Quiz 5
Assume that for some reason it is actually of advantage (food for thought) to translate the source files step by step with one of the following commands:
1 2 3 4 5 | gcc -S foo.c
gcc -c foo.s
gcc -S bar.c
gcc -c bar.s
gcc foo.o bar.o
|
Also assume that you already did this. But then you had to modify file bar.c because you came up with a great idea to improve its implementation:
What commands do you need to re-run to generate an executable. Of course the number of commands should be minimal. Write this commands in the order you have to execute them into a file quiz05.txt.
Submit your solution with submit hpc quiz05 quiz05.txt. If you do not get an error message the submission was successful.
Using the ULM C Compiler on theon
In the video you will see that the ULM C Compiler ucc can be used to observe the generated assembly code, object file and executable. In order to use ucc on theon you have to add the directory of the installation to your path:
1 | export PATH=$PATH:/home/numerik/pub/bin
|
To make this permanent append the above line to your .bashrc. For example with
1 | echo 'export PATH=$PATH:/home/numerik/pub/bin' >> $HOME/.bashrc
|
or alternatively (but do not do both) with
1 | echo 'export PATH=$PATH:/home/numerik/pub/bin' >> ~/.bashrc
|
Limitations of the ULM Compiler
Note that currently the ULM C compiler only supports a (serious) subset of the C programming language. Here a list of unsupported features:
-
Floating point types, e.g. float, double, complex float and complex double.
-
Labels and goto statements.
-
Large parts of the C standard library.
Testing the ULM Compiler
Like with gcc you can compile the two C source files into an executable with this one-line command:
theon$ ucc foo.c bar.c theon$ a.out foo bar theon$
Or you can generate intermediate results (except the result of the preprocessor) as follows:
theon$ ucc -S foo.c theon$ ucc -c foo.s theon$ ucc -S bar.c theon$ ucc -c bar.s theon$ ucc foo.o bar.o theon$ a.out foo bar theon$
Also have a look into the generated files. For educational purposes the output format of the object files and executable is a readable text file. So for the sake of education we waste some space on the hard disk:
-
Assembly files foo.s and bar.s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
.equ ZERO, 0 .equ FP, 1 .equ SP, 2 .equ RET, 3 .text /* * function main **/ .globl main main: // function prologue movq %RET, (%SP) movq %FP, 8(%SP) addq 0, %SP, %FP subq 0, %SP, %SP // begin of the function body #0 {... # bar(); subq 16, %SP, %SP ldzwq @w3(bar), %4 shldwq @w2(bar), %4 shldwq @w1(bar), %4 shldwq @w0(bar), %4 jmp %4, %RET addq 16, %SP, %SP #0 ...} // end of the function body // function epilogue // 'main' returns 0 if there is no return statement movw %0, 16(%FP) leave.L0: addq 0, %FP, %SP movq 8(%SP), %FP movq (%SP), %RET jmp %RET, %0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
.equ ZERO, 0 .equ FP, 1 .equ SP, 2 .equ RET, 3 .data str.L0: .string "foo bar\n" .text /* * function bar **/ .globl bar bar: // function prologue movq %RET, (%SP) movq %FP, 8(%SP) addq 0, %SP, %FP subq 0, %SP, %SP // begin of the function body #0 {... # printf("foo bar\n"); subq 32, %SP, %SP ldzwq @w3(str.L0), %4 shldwq @w2(str.L0), %4 shldwq @w1(str.L0), %4 shldwq @w0(str.L0), %4 movq %4, 24(%SP) ldzwq @w3(printf), %4 shldwq @w2(printf), %4 shldwq @w1(printf), %4 shldwq @w0(printf), %4 jmp %4, %RET movswq 16(%SP), %4 addq 32, %SP, %SP #0 ...} // end of the function body // function epilogue leave.L1: addq 0, %FP, %SP movq 8(%SP), %FP movq (%SP), %RET jmp %RET, %0
-
Object files foo.o and bar.o
#TEXT 4 0x0000000000000000: 28 03 00 02 # movq %RET, 0(%SP) 0x0000000000000004: 28 01 08 02 # movq %FP, 8(%SP) 0x0000000000000008: 38 00 02 01 # addq 0, %SP, %FP 0x000000000000000c: 39 00 02 02 # subq 0, %SP, %SP 0x0000000000000010: 39 10 02 02 # subq 16, %SP, %SP 0x0000000000000014: 56 00 00 04 # ldzwq @w3(bar), %4 0x0000000000000018: 5d 00 00 04 # shldwq @w2(bar), %4 0x000000000000001c: 5d 00 00 04 # shldwq @w1(bar), %4 0x0000000000000020: 5d 00 00 04 # shldwq @w0(bar), %4 0x0000000000000024: 40 04 03 00 # jmp %4, %RET 0x0000000000000028: 38 10 02 02 # addq 16, %SP, %SP 0x000000000000002c: 2a 00 10 01 # movw %0, 16(%FP) 0x0000000000000030: 38 00 01 02 # addq 0, %FP, %SP 0x0000000000000034: 18 08 02 01 # movq 8(%SP), %FP 0x0000000000000038: 18 00 02 03 # movq 0(%SP), %RET 0x000000000000003c: 40 03 00 00 # jmp %RET, %0 #SYMTAB t leave.L0 0x0000000000000030 U bar 0x0000000000000000 T main 0x0000000000000000 a RET 0x0000000000000003 a SP 0x0000000000000002 a FP 0x0000000000000001 a ZERO 0x0000000000000000 #FIXUPS text 0x0000000000000020 1 2 w0 bar text 0x000000000000001c 1 2 w1 bar text 0x0000000000000018 1 2 w2 bar text 0x0000000000000014 1 2 w3 bar
#TEXT 4 0x0000000000000000: 28 03 00 02 # movq %RET, 0(%SP) 0x0000000000000004: 28 01 08 02 # movq %FP, 8(%SP) 0x0000000000000008: 38 00 02 01 # addq 0, %SP, %FP 0x000000000000000c: 39 00 02 02 # subq 0, %SP, %SP 0x0000000000000010: 39 20 02 02 # subq 32, %SP, %SP 0x0000000000000014: 56 00 00 04 # ldzwq @w3(str.L0), %4 0x0000000000000018: 5d 00 00 04 # shldwq @w2(str.L0), %4 0x000000000000001c: 5d 00 00 04 # shldwq @w1(str.L0), %4 0x0000000000000020: 5d 00 54 04 # shldwq @w0(str.L0), %4 0x0000000000000024: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000028: 56 00 00 04 # ldzwq @w3(printf), %4 0x000000000000002c: 5d 00 00 04 # shldwq @w2(printf), %4 0x0000000000000030: 5d 00 00 04 # shldwq @w1(printf), %4 0x0000000000000034: 5d 00 00 04 # shldwq @w0(printf), %4 0x0000000000000038: 40 04 03 00 # jmp %4, %RET 0x000000000000003c: 1e 10 02 04 # movswq 16(%SP), %4 0x0000000000000040: 38 20 02 02 # addq 32, %SP, %SP 0x0000000000000044: 38 00 01 02 # addq 0, %FP, %SP 0x0000000000000048: 18 08 02 01 # movq 8(%SP), %FP 0x000000000000004c: 18 00 02 03 # movq 0(%SP), %RET 0x0000000000000050: 40 03 00 00 # jmp %RET, %0 #DATA 1 0x0000000000000054: 66 6f 6f 20 62 61 72 0a 00 # .string "foo bar\n" #SYMTAB t leave.L1 0x0000000000000044 U printf 0x0000000000000000 T bar 0x0000000000000000 d str.L0 0x0000000000000000 a RET 0x0000000000000003 a SP 0x0000000000000002 a FP 0x0000000000000001 a ZERO 0x0000000000000000 #FIXUPS text 0x0000000000000034 1 2 w0 printf text 0x0000000000000030 1 2 w1 printf text 0x000000000000002c 1 2 w2 printf text 0x0000000000000028 1 2 w3 printf text 0x0000000000000020 1 2 w0 [data] text 0x000000000000001c 1 2 w1 [data] text 0x0000000000000018 1 2 w2 [data] text 0x0000000000000014 1 2 w3 [data]
-
The executable a.out
#!/usr/bin/env ulm #TEXT 4 # from: generated by ulmld 0x0000000000000000: 56 00 00 01 # ldzwq @w3(_start), %1 0x0000000000000004: 5D 00 00 01 # shldwq @w2(_start), %1 0x0000000000000008: 5D 00 00 01 # shldwq @w1(_start), %1 0x000000000000000C: 5D 00 A8 01 # shldwq @w0(_start), %1 0x0000000000000010: 40 01 02 00 # jmp %1, %2 # from: foo.o #main: 0x0000000000000014: 28 03 00 02 # movq %RET, 0(%SP) 0x0000000000000018: 28 01 08 02 # movq %FP, 8(%SP) 0x000000000000001C: 38 00 02 01 # addq 0, %SP, %FP 0x0000000000000020: 39 00 02 02 # subq 0, %SP, %SP 0x0000000000000024: 39 10 02 02 # subq 16, %SP, %SP 0x0000000000000028: 56 00 00 04 # ldzwq @w3(bar), %4 0x000000000000002C: 5D 00 00 04 # shldwq @w2(bar), %4 0x0000000000000030: 5D 00 00 04 # shldwq @w1(bar), %4 0x0000000000000034: 5D 00 54 04 # shldwq @w0(bar), %4 0x0000000000000038: 40 04 03 00 # jmp %4, %RET 0x000000000000003C: 38 10 02 02 # addq 16, %SP, %SP 0x0000000000000040: 2A 00 10 01 # movw %0, 16(%FP) #leave.L0: 0x0000000000000044: 38 00 01 02 # addq 0, %FP, %SP 0x0000000000000048: 18 08 02 01 # movq 8(%SP), %FP 0x000000000000004C: 18 00 02 03 # movq 0(%SP), %RET 0x0000000000000050: 40 03 00 00 # jmp %RET, %0 # from: bar.o #bar: 0x0000000000000054: 28 03 00 02 # movq %RET, 0(%SP) 0x0000000000000058: 28 01 08 02 # movq %FP, 8(%SP) 0x000000000000005C: 38 00 02 01 # addq 0, %SP, %FP 0x0000000000000060: 39 00 02 02 # subq 0, %SP, %SP 0x0000000000000064: 39 20 02 02 # subq 32, %SP, %SP 0x0000000000000068: 56 00 00 04 # ldzwq @w3(str.L0), %4 0x000000000000006C: 5D 00 00 04 # shldwq @w2(str.L0), %4 0x0000000000000070: 5D 00 00 04 # shldwq @w1(str.L0), %4 0x0000000000000074: 5D 0E 78 04 # shldwq @w0(str.L0), %4 0x0000000000000078: 28 04 18 02 # movq %4, 24(%SP) 0x000000000000007C: 56 00 00 04 # ldzwq @w3(printf), %4 0x0000000000000080: 5D 00 00 04 # shldwq @w2(printf), %4 0x0000000000000084: 5D 00 00 04 # shldwq @w1(printf), %4 0x0000000000000088: 5D 0D DC 04 # shldwq @w0(printf), %4 0x000000000000008C: 40 04 03 00 # jmp %4, %RET 0x0000000000000090: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000094: 38 20 02 02 # addq 32, %SP, %SP #leave.L1: 0x0000000000000098: 38 00 01 02 # addq 0, %FP, %SP 0x000000000000009C: 18 08 02 01 # movq 8(%SP), %FP 0x00000000000000A0: 18 00 02 03 # movq 0(%SP), %RET 0x00000000000000A4: 40 03 00 00 # jmp %RET, %0 # from: /home/numerik/pub/ulmcc/lib/libulm.a(crt0.o) #_start: 0x00000000000000A8: 56 00 00 02 # ldzwq 0, %SP 0x00000000000000AC: 39 18 02 02 # subq 24, %SP, %SP 0x00000000000000B0: 56 00 14 04 # ldzwq main, %4 0x00000000000000B4: 40 04 03 00 # jmp %4, %RET 0x00000000000000B8: 1E 10 02 04 # movswq rval(%SP), %4 0x00000000000000BC: 38 18 02 02 # addq 24, %SP, %SP 0x00000000000000C0: 01 04 00 00 # halt %4 # from: /home/numerik/pub/ulmcc/lib/libulm.a(stdio.o) #print_uint64: 0x00000000000000C4: 28 03 00 02 # movq %RET, 0(%SP) 0x00000000000000C8: 28 01 08 02 # movq %FP, 8(%SP) 0x00000000000000CC: 38 00 02 01 # addq 0, %SP, %FP 0x00000000000000D0: 39 10 02 02 # subq 16, %SP, %SP 0x00000000000000D4: 18 20 01 04 # movq 32(%FP), %4 0x00000000000000D8: 56 00 0A 05 # ldzwq 10, %5 0x00000000000000DC: 56 00 00 07 # ldzwq 0, %7 0x00000000000000E0: 38 00 04 06 # addq 0, %4, %6 0x00000000000000E4: 33 05 06 08 # divq %5, %6, %8 0x00000000000000E8: 2A 0A FE 01 # movw %10, -2(%FP) 0x00000000000000EC: 18 20 01 04 # movq 32(%FP), %4 0x00000000000000F0: 56 00 0A 05 # ldzwq 10, %5 0x00000000000000F4: 56 00 00 07 # ldzwq 0, %7 0x00000000000000F8: 38 00 04 06 # addq 0, %4, %6 0x00000000000000FC: 33 05 06 08 # divq %5, %6, %8 0x0000000000000100: 28 08 20 01 # movq %8, 32(%FP) 0x0000000000000104: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000108: 31 00 04 00 # subq %0, %4, %0 0x000000000000010C: 42 00 00 19 # jz else.L4 0x0000000000000110: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000114: 31 00 04 00 # subq %0, %4, %0 0x0000000000000118: 42 00 00 04 # jz .L5 0x000000000000011C: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000120: 39 01 04 05 # subq 1, %4, %5 0x0000000000000124: 41 00 00 02 # jmp .L6 #.L5: 0x0000000000000128: 56 00 00 05 # ldzwq 0, %5 #.L6: 0x000000000000012C: 28 05 18 01 # movq %5, 24(%FP) 0x0000000000000130: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000134: 1B 10 01 04 # movzbq 16(%FP), %4 0x0000000000000138: 2B 04 10 02 # movb %4, 16(%SP) 0x000000000000013C: 1B 11 01 04 # movzbq 17(%FP), %4 0x0000000000000140: 2B 04 11 02 # movb %4, 17(%SP) 0x0000000000000144: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000148: 28 04 18 02 # movq %4, 24(%SP) 0x000000000000014C: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000150: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000154: 56 00 00 04 # ldzwq @w3(print_uint64), %4 0x0000000000000158: 5D 00 00 04 # shldwq @w2(print_uint64), %4 0x000000000000015C: 5D 00 00 04 # shldwq @w1(print_uint64), %4 0x0000000000000160: 5D 00 C4 04 # shldwq @w0(print_uint64), %4 0x0000000000000164: 40 04 03 00 # jmp %4, %RET 0x0000000000000168: 38 28 02 02 # addq 40, %SP, %SP 0x000000000000016C: 41 00 00 27 # jmp endif.L3 #else.L4: 0x0000000000000170: 56 00 01 04 # ldzwq 1, %4 0x0000000000000174: 28 04 F0 01 # movq %4, -16(%FP) #check.for.cond.L7: 0x0000000000000178: 18 F0 01 04 # movq -16(%FP), %4 0x000000000000017C: 18 18 01 05 # movq 24(%FP), %5 0x0000000000000180: 31 05 04 00 # subq %5, %4, %0 0x0000000000000184: 49 00 00 14 # jae for.end.L9 0x0000000000000188: 39 18 02 02 # subq 24, %SP, %SP 0x000000000000018C: 1B 11 01 04 # movzbq 17(%FP), %4 0x0000000000000190: 31 00 04 00 # subq %0, %4, %0 0x0000000000000194: 42 00 00 03 # jz .L10 0x0000000000000198: 56 00 30 04 # ldzwq 48, %4 0x000000000000019C: 41 00 00 02 # jmp .L11 #.L10: 0x00000000000001A0: 56 00 20 04 # ldzwq 32, %4 #.L11: 0x00000000000001A4: 2B 04 12 02 # movb %4, 18(%SP) 0x00000000000001A8: 56 00 00 04 # ldzwq @w3(putchar), %4 0x00000000000001AC: 5D 00 00 04 # shldwq @w2(putchar), %4 0x00000000000001B0: 5D 00 00 04 # shldwq @w1(putchar), %4 0x00000000000001B4: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x00000000000001B8: 40 04 03 00 # jmp %4, %RET 0x00000000000001BC: 1E 10 02 04 # movswq 16(%SP), %4 0x00000000000001C0: 38 18 02 02 # addq 24, %SP, %SP #for.incr.L8: 0x00000000000001C4: 18 F0 01 04 # movq -16(%FP), %4 0x00000000000001C8: 38 01 04 05 # addq 1, %4, %5 0x00000000000001CC: 28 05 F0 01 # movq %5, -16(%FP) 0x00000000000001D0: 41 FF FF EA # jmp check.for.cond.L7 #for.end.L9: 0x00000000000001D4: 1B 10 01 04 # movzbq 16(%FP), %4 0x00000000000001D8: 31 00 04 00 # subq %0, %4, %0 0x00000000000001DC: 42 00 00 0B # jz endif.L12 0x00000000000001E0: 39 18 02 02 # subq 24, %SP, %SP 0x00000000000001E4: 56 00 2D 04 # ldzwq 45, %4 0x00000000000001E8: 2B 04 12 02 # movb %4, 18(%SP) 0x00000000000001EC: 56 00 00 04 # ldzwq @w3(putchar), %4 0x00000000000001F0: 5D 00 00 04 # shldwq @w2(putchar), %4 0x00000000000001F4: 5D 00 00 04 # shldwq @w1(putchar), %4 0x00000000000001F8: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x00000000000001FC: 40 04 03 00 # jmp %4, %RET 0x0000000000000200: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000204: 38 18 02 02 # addq 24, %SP, %SP #endif.L12: #endif.L3: 0x0000000000000208: 39 18 02 02 # subq 24, %SP, %SP 0x000000000000020C: 1E FE 01 04 # movswq -2(%FP), %4 0x0000000000000210: 38 30 04 05 # addq 48, %4, %5 0x0000000000000214: 2B 05 12 02 # movb %5, 18(%SP) 0x0000000000000218: 56 00 00 04 # ldzwq @w3(putchar), %4 0x000000000000021C: 5D 00 00 04 # shldwq @w2(putchar), %4 0x0000000000000220: 5D 00 00 04 # shldwq @w1(putchar), %4 0x0000000000000224: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x0000000000000228: 40 04 03 00 # jmp %4, %RET 0x000000000000022C: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000230: 38 18 02 02 # addq 24, %SP, %SP #leave.L2: 0x0000000000000234: 38 00 01 02 # addq 0, %FP, %SP 0x0000000000000238: 18 08 02 01 # movq 8(%SP), %FP 0x000000000000023C: 18 00 02 03 # movq 0(%SP), %RET 0x0000000000000240: 40 03 00 00 # jmp %RET, %0 #print_int64_hex: 0x0000000000000244: 28 03 00 02 # movq %RET, 0(%SP) 0x0000000000000248: 28 01 08 02 # movq %FP, 8(%SP) 0x000000000000024C: 38 00 02 01 # addq 0, %SP, %FP 0x0000000000000250: 39 10 02 02 # subq 16, %SP, %SP 0x0000000000000254: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000258: 56 00 10 05 # ldzwq 16, %5 0x000000000000025C: 56 00 00 07 # ldzwq 0, %7 0x0000000000000260: 38 00 04 06 # addq 0, %4, %6 0x0000000000000264: 33 05 06 08 # divq %5, %6, %8 0x0000000000000268: 2A 0A FE 01 # movw %10, -2(%FP) 0x000000000000026C: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000270: 56 00 10 05 # ldzwq 16, %5 0x0000000000000274: 56 00 00 07 # ldzwq 0, %7 0x0000000000000278: 38 00 04 06 # addq 0, %4, %6 0x000000000000027C: 33 05 06 08 # divq %5, %6, %8 0x0000000000000280: 28 08 20 01 # movq %8, 32(%FP) 0x0000000000000284: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000288: 31 00 04 00 # subq %0, %4, %0 0x000000000000028C: 42 00 00 17 # jz else.L15 0x0000000000000290: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000294: 31 00 04 00 # subq %0, %4, %0 0x0000000000000298: 42 00 00 04 # jz .L16 0x000000000000029C: 18 18 01 04 # movq 24(%FP), %4 0x00000000000002A0: 39 01 04 05 # subq 1, %4, %5 0x00000000000002A4: 41 00 00 02 # jmp .L17 #.L16: 0x00000000000002A8: 56 00 00 05 # ldzwq 0, %5 #.L17: 0x00000000000002AC: 28 05 18 01 # movq %5, 24(%FP) 0x00000000000002B0: 39 28 02 02 # subq 40, %SP, %SP 0x00000000000002B4: 1B 10 01 04 # movzbq 16(%FP), %4 0x00000000000002B8: 2B 04 10 02 # movb %4, 16(%SP) 0x00000000000002BC: 18 18 01 04 # movq 24(%FP), %4 0x00000000000002C0: 28 04 18 02 # movq %4, 24(%SP) 0x00000000000002C4: 18 20 01 04 # movq 32(%FP), %4 0x00000000000002C8: 28 04 20 02 # movq %4, 32(%SP) 0x00000000000002CC: 56 00 00 04 # ldzwq @w3(print_int64_hex), %4 0x00000000000002D0: 5D 00 00 04 # shldwq @w2(print_int64_hex), %4 0x00000000000002D4: 5D 00 00 04 # shldwq @w1(print_int64_hex), %4 0x00000000000002D8: 5D 02 44 04 # shldwq @w0(print_int64_hex), %4 0x00000000000002DC: 40 04 03 00 # jmp %4, %RET 0x00000000000002E0: 38 28 02 02 # addq 40, %SP, %SP 0x00000000000002E4: 41 00 00 1A # jmp endif.L14 #else.L15: 0x00000000000002E8: 56 00 01 04 # ldzwq 1, %4 0x00000000000002EC: 28 04 F0 01 # movq %4, -16(%FP) #check.for.cond.L18: 0x00000000000002F0: 18 F0 01 04 # movq -16(%FP), %4 0x00000000000002F4: 18 18 01 05 # movq 24(%FP), %5 0x00000000000002F8: 31 05 04 00 # subq %5, %4, %0 0x00000000000002FC: 49 00 00 14 # jae for.end.L20 0x0000000000000300: 39 18 02 02 # subq 24, %SP, %SP 0x0000000000000304: 1B 10 01 04 # movzbq 16(%FP), %4 0x0000000000000308: 31 00 04 00 # subq %0, %4, %0 0x000000000000030C: 42 00 00 03 # jz .L21 0x0000000000000310: 56 00 30 04 # ldzwq 48, %4 0x0000000000000314: 41 00 00 02 # jmp .L22 #.L21: 0x0000000000000318: 56 00 20 04 # ldzwq 32, %4 #.L22: 0x000000000000031C: 2B 04 12 02 # movb %4, 18(%SP) 0x0000000000000320: 56 00 00 04 # ldzwq @w3(putchar), %4 0x0000000000000324: 5D 00 00 04 # shldwq @w2(putchar), %4 0x0000000000000328: 5D 00 00 04 # shldwq @w1(putchar), %4 0x000000000000032C: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x0000000000000330: 40 04 03 00 # jmp %4, %RET 0x0000000000000334: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000338: 38 18 02 02 # addq 24, %SP, %SP #for.incr.L19: 0x000000000000033C: 18 F0 01 04 # movq -16(%FP), %4 0x0000000000000340: 38 01 04 05 # addq 1, %4, %5 0x0000000000000344: 28 05 F0 01 # movq %5, -16(%FP) 0x0000000000000348: 41 FF FF EA # jmp check.for.cond.L18 #for.end.L20: #endif.L14: 0x000000000000034C: 1E FE 01 04 # movswq -2(%FP), %4 0x0000000000000350: 39 0A 04 00 # subq 10, %4, %0 0x0000000000000354: 45 00 00 0D # jge else.L24 0x0000000000000358: 39 18 02 02 # subq 24, %SP, %SP 0x000000000000035C: 1E FE 01 04 # movswq -2(%FP), %4 0x0000000000000360: 38 30 04 05 # addq 48, %4, %5 0x0000000000000364: 2B 05 12 02 # movb %5, 18(%SP) 0x0000000000000368: 56 00 00 04 # ldzwq @w3(putchar), %4 0x000000000000036C: 5D 00 00 04 # shldwq @w2(putchar), %4 0x0000000000000370: 5D 00 00 04 # shldwq @w1(putchar), %4 0x0000000000000374: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x0000000000000378: 40 04 03 00 # jmp %4, %RET 0x000000000000037C: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000380: 38 18 02 02 # addq 24, %SP, %SP 0x0000000000000384: 41 00 00 0D # jmp endif.L23 #else.L24: 0x0000000000000388: 39 18 02 02 # subq 24, %SP, %SP 0x000000000000038C: 1E FE 01 04 # movswq -2(%FP), %4 0x0000000000000390: 39 0A 04 05 # subq 10, %4, %5 0x0000000000000394: 38 61 05 04 # addq 97, %5, %4 0x0000000000000398: 2B 04 12 02 # movb %4, 18(%SP) 0x000000000000039C: 56 00 00 04 # ldzwq @w3(putchar), %4 0x00000000000003A0: 5D 00 00 04 # shldwq @w2(putchar), %4 0x00000000000003A4: 5D 00 00 04 # shldwq @w1(putchar), %4 0x00000000000003A8: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x00000000000003AC: 40 04 03 00 # jmp %4, %RET 0x00000000000003B0: 1E 10 02 04 # movswq 16(%SP), %4 0x00000000000003B4: 38 18 02 02 # addq 24, %SP, %SP #leave.L13: #endif.L23: 0x00000000000003B8: 38 00 01 02 # addq 0, %FP, %SP 0x00000000000003BC: 18 08 02 01 # movq 8(%SP), %FP 0x00000000000003C0: 18 00 02 03 # movq 0(%SP), %RET 0x00000000000003C4: 40 03 00 00 # jmp %RET, %0 #print_uint64_oct: 0x00000000000003C8: 28 03 00 02 # movq %RET, 0(%SP) 0x00000000000003CC: 28 01 08 02 # movq %FP, 8(%SP) 0x00000000000003D0: 38 00 02 01 # addq 0, %SP, %FP 0x00000000000003D4: 39 10 02 02 # subq 16, %SP, %SP 0x00000000000003D8: 18 20 01 04 # movq 32(%FP), %4 0x00000000000003DC: 56 00 08 05 # ldzwq 8, %5 0x00000000000003E0: 56 00 00 07 # ldzwq 0, %7 0x00000000000003E4: 38 00 04 06 # addq 0, %4, %6 0x00000000000003E8: 33 05 06 08 # divq %5, %6, %8 0x00000000000003EC: 2A 0A FE 01 # movw %10, -2(%FP) 0x00000000000003F0: 18 20 01 04 # movq 32(%FP), %4 0x00000000000003F4: 56 00 08 05 # ldzwq 8, %5 0x00000000000003F8: 56 00 00 07 # ldzwq 0, %7 0x00000000000003FC: 38 00 04 06 # addq 0, %4, %6 0x0000000000000400: 33 05 06 08 # divq %5, %6, %8 0x0000000000000404: 28 08 20 01 # movq %8, 32(%FP) 0x0000000000000408: 18 20 01 04 # movq 32(%FP), %4 0x000000000000040C: 31 00 04 00 # subq %0, %4, %0 0x0000000000000410: 42 00 00 17 # jz else.L27 0x0000000000000414: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000418: 31 00 04 00 # subq %0, %4, %0 0x000000000000041C: 42 00 00 04 # jz .L28 0x0000000000000420: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000424: 39 01 04 05 # subq 1, %4, %5 0x0000000000000428: 41 00 00 02 # jmp .L29 #.L28: 0x000000000000042C: 56 00 00 05 # ldzwq 0, %5 #.L29: 0x0000000000000430: 28 05 18 01 # movq %5, 24(%FP) 0x0000000000000434: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000438: 1B 10 01 04 # movzbq 16(%FP), %4 0x000000000000043C: 2B 04 10 02 # movb %4, 16(%SP) 0x0000000000000440: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000444: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000448: 18 20 01 04 # movq 32(%FP), %4 0x000000000000044C: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000450: 56 00 00 04 # ldzwq @w3(print_uint64_oct), %4 0x0000000000000454: 5D 00 00 04 # shldwq @w2(print_uint64_oct), %4 0x0000000000000458: 5D 00 00 04 # shldwq @w1(print_uint64_oct), %4 0x000000000000045C: 5D 03 C8 04 # shldwq @w0(print_uint64_oct), %4 0x0000000000000460: 40 04 03 00 # jmp %4, %RET 0x0000000000000464: 38 28 02 02 # addq 40, %SP, %SP 0x0000000000000468: 41 00 00 1A # jmp endif.L26 #else.L27: 0x000000000000046C: 56 00 01 04 # ldzwq 1, %4 0x0000000000000470: 28 04 F0 01 # movq %4, -16(%FP) #check.for.cond.L30: 0x0000000000000474: 18 F0 01 04 # movq -16(%FP), %4 0x0000000000000478: 18 18 01 05 # movq 24(%FP), %5 0x000000000000047C: 31 05 04 00 # subq %5, %4, %0 0x0000000000000480: 49 00 00 14 # jae for.end.L32 0x0000000000000484: 39 18 02 02 # subq 24, %SP, %SP 0x0000000000000488: 1B 10 01 04 # movzbq 16(%FP), %4 0x000000000000048C: 31 00 04 00 # subq %0, %4, %0 0x0000000000000490: 42 00 00 03 # jz .L33 0x0000000000000494: 56 00 30 04 # ldzwq 48, %4 0x0000000000000498: 41 00 00 02 # jmp .L34 #.L33: 0x000000000000049C: 56 00 20 04 # ldzwq 32, %4 #.L34: 0x00000000000004A0: 2B 04 12 02 # movb %4, 18(%SP) 0x00000000000004A4: 56 00 00 04 # ldzwq @w3(putchar), %4 0x00000000000004A8: 5D 00 00 04 # shldwq @w2(putchar), %4 0x00000000000004AC: 5D 00 00 04 # shldwq @w1(putchar), %4 0x00000000000004B0: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x00000000000004B4: 40 04 03 00 # jmp %4, %RET 0x00000000000004B8: 1E 10 02 04 # movswq 16(%SP), %4 0x00000000000004BC: 38 18 02 02 # addq 24, %SP, %SP #for.incr.L31: 0x00000000000004C0: 18 F0 01 04 # movq -16(%FP), %4 0x00000000000004C4: 38 01 04 05 # addq 1, %4, %5 0x00000000000004C8: 28 05 F0 01 # movq %5, -16(%FP) 0x00000000000004CC: 41 FF FF EA # jmp check.for.cond.L30 #for.end.L32: #endif.L26: 0x00000000000004D0: 39 18 02 02 # subq 24, %SP, %SP 0x00000000000004D4: 1E FE 01 04 # movswq -2(%FP), %4 0x00000000000004D8: 38 30 04 05 # addq 48, %4, %5 0x00000000000004DC: 2B 05 12 02 # movb %5, 18(%SP) 0x00000000000004E0: 56 00 00 04 # ldzwq @w3(putchar), %4 0x00000000000004E4: 5D 00 00 04 # shldwq @w2(putchar), %4 0x00000000000004E8: 5D 00 00 04 # shldwq @w1(putchar), %4 0x00000000000004EC: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x00000000000004F0: 40 04 03 00 # jmp %4, %RET 0x00000000000004F4: 1E 10 02 04 # movswq 16(%SP), %4 0x00000000000004F8: 38 18 02 02 # addq 24, %SP, %SP #leave.L25: 0x00000000000004FC: 38 00 01 02 # addq 0, %FP, %SP 0x0000000000000500: 18 08 02 01 # movq 8(%SP), %FP 0x0000000000000504: 18 00 02 03 # movq 0(%SP), %RET 0x0000000000000508: 40 03 00 00 # jmp %RET, %0 #print_int64: 0x000000000000050C: 28 03 00 02 # movq %RET, 0(%SP) 0x0000000000000510: 28 01 08 02 # movq %FP, 8(%SP) 0x0000000000000514: 38 00 02 01 # addq 0, %SP, %FP 0x0000000000000518: 39 10 02 02 # subq 16, %SP, %SP 0x000000000000051C: 56 00 00 04 # ldzwq 0, %4 0x0000000000000520: 2B 04 FF 01 # movb %4, -1(%FP) 0x0000000000000524: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000528: 39 00 04 00 # subq 0, %4, %0 0x000000000000052C: 45 00 00 0C # jge endif.L36 0x0000000000000530: 56 00 01 04 # ldzwq 1, %4 0x0000000000000534: 2B 04 FF 01 # movb %4, -1(%FP) 0x0000000000000538: 18 20 01 04 # movq 32(%FP), %4 0x000000000000053C: 31 04 00 04 # subq %4, %0, %4 0x0000000000000540: 28 04 20 01 # movq %4, 32(%FP) 0x0000000000000544: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000548: 31 00 04 00 # subq %0, %4, %0 0x000000000000054C: 42 00 00 04 # jz endif.L37 0x0000000000000550: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000554: 39 01 04 05 # subq 1, %4, %5 0x0000000000000558: 28 05 18 01 # movq %5, 24(%FP) #endif.L37: #endif.L36: 0x000000000000055C: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000560: 1B FF 01 04 # movzbq -1(%FP), %4 0x0000000000000564: 2B 04 10 02 # movb %4, 16(%SP) 0x0000000000000568: 1B 10 01 04 # movzbq 16(%FP), %4 0x000000000000056C: 2B 04 11 02 # movb %4, 17(%SP) 0x0000000000000570: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000574: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000578: 18 20 01 04 # movq 32(%FP), %4 0x000000000000057C: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000580: 56 00 00 04 # ldzwq @w3(print_uint64), %4 0x0000000000000584: 5D 00 00 04 # shldwq @w2(print_uint64), %4 0x0000000000000588: 5D 00 00 04 # shldwq @w1(print_uint64), %4 0x000000000000058C: 5D 00 C4 04 # shldwq @w0(print_uint64), %4 0x0000000000000590: 40 04 03 00 # jmp %4, %RET 0x0000000000000594: 38 28 02 02 # addq 40, %SP, %SP #leave.L35: 0x0000000000000598: 38 00 01 02 # addq 0, %FP, %SP 0x000000000000059C: 18 08 02 01 # movq 8(%SP), %FP 0x00000000000005A0: 18 00 02 03 # movq 0(%SP), %RET 0x00000000000005A4: 40 03 00 00 # jmp %RET, %0 #puts_: 0x00000000000005A8: 28 03 00 02 # movq %RET, 0(%SP) 0x00000000000005AC: 28 01 08 02 # movq %FP, 8(%SP) 0x00000000000005B0: 38 00 02 01 # addq 0, %SP, %FP 0x00000000000005B4: 39 10 02 02 # subq 16, %SP, %SP 0x00000000000005B8: 18 18 01 04 # movq 24(%FP), %4 0x00000000000005BC: 31 00 04 00 # subq %0, %4, %0 0x00000000000005C0: 43 00 00 10 # jnz endif.L39 0x00000000000005C4: 39 20 02 02 # subq 32, %SP, %SP 0x00000000000005C8: 56 00 00 04 # ldzwq @w3(str.L0), %4 0x00000000000005CC: 5D 00 00 04 # shldwq @w2(str.L0), %4 0x00000000000005D0: 5D 00 00 04 # shldwq @w1(str.L0), %4 0x00000000000005D4: 5D 0E 81 04 # shldwq @w0(str.L0), %4 0x00000000000005D8: 28 04 18 02 # movq %4, 24(%SP) 0x00000000000005DC: 56 00 00 04 # ldzwq @w3(puts_), %4 0x00000000000005E0: 5D 00 00 04 # shldwq @w2(puts_), %4 0x00000000000005E4: 5D 00 00 04 # shldwq @w1(puts_), %4 0x00000000000005E8: 5D 05 A8 04 # shldwq @w0(puts_), %4 0x00000000000005EC: 40 04 03 00 # jmp %4, %RET 0x00000000000005F0: 1E 10 02 04 # movswq 16(%SP), %4 0x00000000000005F4: 38 20 02 02 # addq 32, %SP, %SP 0x00000000000005F8: 2A 04 10 01 # movw %4, 16(%FP) 0x00000000000005FC: 41 00 00 17 # jmp leave.L38 #check.while.cond.L40: #endif.L39: 0x0000000000000600: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000604: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000608: 31 00 04 00 # subq %0, %4, %0 0x000000000000060C: 42 00 00 10 # jz while.end.L41 0x0000000000000610: 39 18 02 02 # subq 24, %SP, %SP 0x0000000000000614: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000618: 1F 00 04 04 # movsbq 0(%4), %4 0x000000000000061C: 2B 04 12 02 # movb %4, 18(%SP) 0x0000000000000620: 56 00 00 04 # ldzwq @w3(putchar), %4 0x0000000000000624: 5D 00 00 04 # shldwq @w2(putchar), %4 0x0000000000000628: 5D 00 00 04 # shldwq @w1(putchar), %4 0x000000000000062C: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x0000000000000630: 40 04 03 00 # jmp %4, %RET 0x0000000000000634: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000638: 38 18 02 02 # addq 24, %SP, %SP 0x000000000000063C: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000640: 38 01 04 05 # addq 1, %4, %5 0x0000000000000644: 28 05 18 01 # movq %5, 24(%FP) 0x0000000000000648: 41 FF FF EE # jmp check.while.cond.L40 #while.end.L41: 0x000000000000064C: 56 00 01 04 # ldzwq 1, %4 0x0000000000000650: 2A 04 10 01 # movw %4, 16(%FP) 0x0000000000000654: 41 00 00 01 # jmp leave.L38 #leave.L38: 0x0000000000000658: 38 00 01 02 # addq 0, %FP, %SP 0x000000000000065C: 18 08 02 01 # movq 8(%SP), %FP 0x0000000000000660: 18 00 02 03 # movq 0(%SP), %RET 0x0000000000000664: 40 03 00 00 # jmp %RET, %0 #puts: 0x0000000000000668: 28 03 00 02 # movq %RET, 0(%SP) 0x000000000000066C: 28 01 08 02 # movq %FP, 8(%SP) 0x0000000000000670: 38 00 02 01 # addq 0, %SP, %FP 0x0000000000000674: 39 10 02 02 # subq 16, %SP, %SP 0x0000000000000678: 39 20 02 02 # subq 32, %SP, %SP 0x000000000000067C: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000680: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000684: 56 00 00 04 # ldzwq @w3(puts_), %4 0x0000000000000688: 5D 00 00 04 # shldwq @w2(puts_), %4 0x000000000000068C: 5D 00 00 04 # shldwq @w1(puts_), %4 0x0000000000000690: 5D 05 A8 04 # shldwq @w0(puts_), %4 0x0000000000000694: 40 04 03 00 # jmp %4, %RET 0x0000000000000698: 1E 10 02 04 # movswq 16(%SP), %4 0x000000000000069C: 38 20 02 02 # addq 32, %SP, %SP 0x00000000000006A0: 39 18 02 02 # subq 24, %SP, %SP 0x00000000000006A4: 56 00 0A 04 # ldzwq 10, %4 0x00000000000006A8: 2B 04 12 02 # movb %4, 18(%SP) 0x00000000000006AC: 56 00 00 04 # ldzwq @w3(putchar), %4 0x00000000000006B0: 5D 00 00 04 # shldwq @w2(putchar), %4 0x00000000000006B4: 5D 00 00 04 # shldwq @w1(putchar), %4 0x00000000000006B8: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x00000000000006BC: 40 04 03 00 # jmp %4, %RET 0x00000000000006C0: 1E 10 02 04 # movswq 16(%SP), %4 0x00000000000006C4: 38 18 02 02 # addq 24, %SP, %SP 0x00000000000006C8: 56 00 01 04 # ldzwq 1, %4 0x00000000000006CC: 2A 04 10 01 # movw %4, 16(%FP) 0x00000000000006D0: 41 00 00 01 # jmp leave.L42 #leave.L42: 0x00000000000006D4: 38 00 01 02 # addq 0, %FP, %SP 0x00000000000006D8: 18 08 02 01 # movq 8(%SP), %FP 0x00000000000006DC: 18 00 02 03 # movq 0(%SP), %RET 0x00000000000006E0: 40 03 00 00 # jmp %RET, %0 #vprintf: 0x00000000000006E4: 28 03 00 02 # movq %RET, 0(%SP) 0x00000000000006E8: 28 01 08 02 # movq %FP, 8(%SP) 0x00000000000006EC: 38 00 02 01 # addq 0, %SP, %FP 0x00000000000006F0: 39 38 02 02 # subq 56, %SP, %SP 0x00000000000006F4: 56 00 00 04 # ldzwq 0, %4 0x00000000000006F8: 28 04 F8 01 # movq %4, -8(%FP) #check.for.cond.L44: 0x00000000000006FC: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000700: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000704: 31 00 04 00 # subq %0, %4, %0 0x0000000000000708: 42 00 01 AE # jz for.end.L46 0x000000000000070C: 56 00 00 04 # ldzwq 0, %4 0x0000000000000710: 2B 04 F7 01 # movb %4, -9(%FP) 0x0000000000000714: 56 00 00 04 # ldzwq 0, %4 0x0000000000000718: 28 04 E8 01 # movq %4, -24(%FP) 0x000000000000071C: 56 00 00 04 # ldzwq 0, %4 0x0000000000000720: 2B 04 E7 01 # movb %4, -25(%FP) 0x0000000000000724: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000728: 1F 00 04 04 # movsbq 0(%4), %4 0x000000000000072C: 39 25 04 00 # subq 37, %4, %0 0x0000000000000730: 42 00 00 0D # jz else.L48 0x0000000000000734: 39 18 02 02 # subq 24, %SP, %SP 0x0000000000000738: 18 18 01 04 # movq 24(%FP), %4 0x000000000000073C: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000740: 2B 04 12 02 # movb %4, 18(%SP) 0x0000000000000744: 56 00 00 04 # ldzwq @w3(putchar), %4 0x0000000000000748: 5D 00 00 04 # shldwq @w2(putchar), %4 0x000000000000074C: 5D 00 00 04 # shldwq @w1(putchar), %4 0x0000000000000750: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x0000000000000754: 40 04 03 00 # jmp %4, %RET 0x0000000000000758: 1E 10 02 04 # movswq 16(%SP), %4 0x000000000000075C: 38 18 02 02 # addq 24, %SP, %SP 0x0000000000000760: 41 00 01 94 # jmp endif.L47 #else.L48: 0x0000000000000764: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000768: 38 01 04 05 # addq 1, %4, %5 0x000000000000076C: 28 05 18 01 # movq %5, 24(%FP) 0x0000000000000770: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000774: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000778: 39 25 04 00 # subq 37, %4, %0 0x000000000000077C: 43 00 00 0D # jnz else.L50 0x0000000000000780: 39 18 02 02 # subq 24, %SP, %SP 0x0000000000000784: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000788: 1F 00 04 04 # movsbq 0(%4), %4 0x000000000000078C: 2B 04 12 02 # movb %4, 18(%SP) 0x0000000000000790: 56 00 00 04 # ldzwq @w3(putchar), %4 0x0000000000000794: 5D 00 00 04 # shldwq @w2(putchar), %4 0x0000000000000798: 5D 00 00 04 # shldwq @w1(putchar), %4 0x000000000000079C: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x00000000000007A0: 40 04 03 00 # jmp %4, %RET 0x00000000000007A4: 1E 10 02 04 # movswq 16(%SP), %4 0x00000000000007A8: 38 18 02 02 # addq 24, %SP, %SP 0x00000000000007AC: 41 00 01 81 # jmp endif.L49 #else.L50: 0x00000000000007B0: 18 18 01 04 # movq 24(%FP), %4 0x00000000000007B4: 1F 00 04 04 # movsbq 0(%4), %4 0x00000000000007B8: 39 2B 04 00 # subq 43, %4, %0 0x00000000000007BC: 43 00 00 06 # jnz endif.L51 0x00000000000007C0: 18 18 01 04 # movq 24(%FP), %4 0x00000000000007C4: 38 01 04 05 # addq 1, %4, %5 0x00000000000007C8: 28 05 18 01 # movq %5, 24(%FP) 0x00000000000007CC: 56 00 01 04 # ldzwq 1, %4 0x00000000000007D0: 2B 04 E7 01 # movb %4, -25(%FP) #endif.L51: 0x00000000000007D4: 18 18 01 04 # movq 24(%FP), %4 0x00000000000007D8: 1F 00 04 04 # movsbq 0(%4), %4 0x00000000000007DC: 39 30 04 00 # subq 48, %4, %0 0x00000000000007E0: 43 00 00 06 # jnz endif.L52 0x00000000000007E4: 56 00 01 04 # ldzwq 1, %4 0x00000000000007E8: 2B 04 F7 01 # movb %4, -9(%FP) 0x00000000000007EC: 18 18 01 04 # movq 24(%FP), %4 0x00000000000007F0: 38 01 04 05 # addq 1, %4, %5 0x00000000000007F4: 28 05 18 01 # movq %5, 24(%FP) #check.while.cond.L53: #endif.L52: 0x00000000000007F8: 18 18 01 04 # movq 24(%FP), %4 0x00000000000007FC: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000800: 39 30 04 00 # subq 48, %4, %0 0x0000000000000804: 48 00 00 10 # jb while.end.L54 0x0000000000000808: 18 18 01 04 # movq 24(%FP), %4 0x000000000000080C: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000810: 39 39 04 00 # subq 57, %4, %0 0x0000000000000814: 4B 00 00 0C # ja while.end.L54 0x0000000000000818: 18 E8 01 04 # movq -24(%FP), %4 0x000000000000081C: 3C 0A 04 05 # imulq 10, %4, %5 0x0000000000000820: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000824: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000828: 30 04 05 06 # addq %4, %5, %6 0x000000000000082C: 39 30 06 04 # subq 48, %6, %4 0x0000000000000830: 28 04 E8 01 # movq %4, -24(%FP) 0x0000000000000834: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000838: 38 01 04 05 # addq 1, %4, %5 0x000000000000083C: 28 05 18 01 # movq %5, 24(%FP) 0x0000000000000840: 41 FF FF EE # jmp check.while.cond.L53 #while.end.L54: 0x0000000000000844: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000848: 1F 00 04 04 # movsbq 0(%4), %4 0x000000000000084C: 39 73 04 00 # subq 115, %4, %0 0x0000000000000850: 43 00 00 10 # jnz else.L56 0x0000000000000854: 39 20 02 02 # subq 32, %SP, %SP 0x0000000000000858: 18 20 01 04 # movq 32(%FP), %4 0x000000000000085C: 18 F8 01 05 # movq -8(%FP), %5 0x0000000000000860: 3C 08 05 05 # imulq 8, %5, %5 0x0000000000000864: 30 05 04 06 # addq %5, %4, %6 0x0000000000000868: 18 00 06 06 # movq 0(%6), %6 0x000000000000086C: 28 06 18 02 # movq %6, 24(%SP) 0x0000000000000870: 56 00 00 04 # ldzwq @w3(puts_), %4 0x0000000000000874: 5D 00 00 04 # shldwq @w2(puts_), %4 0x0000000000000878: 5D 00 00 04 # shldwq @w1(puts_), %4 0x000000000000087C: 5D 05 A8 04 # shldwq @w0(puts_), %4 0x0000000000000880: 40 04 03 00 # jmp %4, %RET 0x0000000000000884: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000888: 38 20 02 02 # addq 32, %SP, %SP 0x000000000000088C: 41 00 01 46 # jmp endif.L55 #else.L56: 0x0000000000000890: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000894: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000898: 39 63 04 00 # subq 99, %4, %0 0x000000000000089C: 43 00 00 10 # jnz else.L58 0x00000000000008A0: 39 18 02 02 # subq 24, %SP, %SP 0x00000000000008A4: 18 20 01 04 # movq 32(%FP), %4 0x00000000000008A8: 18 F8 01 05 # movq -8(%FP), %5 0x00000000000008AC: 3C 08 05 05 # imulq 8, %5, %5 0x00000000000008B0: 30 05 04 06 # addq %5, %4, %6 0x00000000000008B4: 18 00 06 06 # movq 0(%6), %6 0x00000000000008B8: 2B 06 12 02 # movb %6, 18(%SP) 0x00000000000008BC: 56 00 00 04 # ldzwq @w3(putchar), %4 0x00000000000008C0: 5D 00 00 04 # shldwq @w2(putchar), %4 0x00000000000008C4: 5D 00 00 04 # shldwq @w1(putchar), %4 0x00000000000008C8: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x00000000000008CC: 40 04 03 00 # jmp %4, %RET 0x00000000000008D0: 1E 10 02 04 # movswq 16(%SP), %4 0x00000000000008D4: 38 18 02 02 # addq 24, %SP, %SP 0x00000000000008D8: 41 00 01 33 # jmp endif.L57 #else.L58: 0x00000000000008DC: 56 00 02 04 # ldzwq 2, %4 0x00000000000008E0: 28 04 D8 01 # movq %4, -40(%FP) 0x00000000000008E4: 18 18 01 04 # movq 24(%FP), %4 0x00000000000008E8: 1F 00 04 04 # movsbq 0(%4), %4 0x00000000000008EC: 39 6C 04 00 # subq 108, %4, %0 0x00000000000008F0: 43 00 00 11 # jnz else.L60 0x00000000000008F4: 18 18 01 04 # movq 24(%FP), %4 0x00000000000008F8: 38 01 04 05 # addq 1, %4, %5 0x00000000000008FC: 28 05 18 01 # movq %5, 24(%FP) 0x0000000000000900: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000904: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000908: 39 6C 04 00 # subq 108, %4, %0 0x000000000000090C: 43 00 00 07 # jnz else.L62 0x0000000000000910: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000914: 38 01 04 05 # addq 1, %4, %5 0x0000000000000918: 28 05 18 01 # movq %5, 24(%FP) 0x000000000000091C: 56 00 04 04 # ldzwq 4, %4 0x0000000000000920: 28 04 D8 01 # movq %4, -40(%FP) 0x0000000000000924: 41 00 00 03 # jmp endif.L61 #else.L62: 0x0000000000000928: 56 00 08 04 # ldzwq 8, %4 0x000000000000092C: 28 04 D8 01 # movq %4, -40(%FP) #endif.L61: 0x0000000000000930: 41 00 00 22 # jmp endif.L59 #else.L60: 0x0000000000000934: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000938: 1F 00 04 04 # movsbq 0(%4), %4 0x000000000000093C: 39 7A 04 00 # subq 122, %4, %0 0x0000000000000940: 42 00 00 05 # jz .L65 0x0000000000000944: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000948: 1F 00 04 04 # movsbq 0(%4), %4 0x000000000000094C: 39 74 04 00 # subq 116, %4, %0 0x0000000000000950: 43 00 00 07 # jnz else.L64 #.L65: 0x0000000000000954: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000958: 38 01 04 05 # addq 1, %4, %5 0x000000000000095C: 28 05 18 01 # movq %5, 24(%FP) 0x0000000000000960: 56 00 08 04 # ldzwq 8, %4 0x0000000000000964: 28 04 D8 01 # movq %4, -40(%FP) 0x0000000000000968: 41 00 00 14 # jmp endif.L63 #else.L64: 0x000000000000096C: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000970: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000974: 39 68 04 00 # subq 104, %4, %0 0x0000000000000978: 43 00 00 10 # jnz endif.L66 0x000000000000097C: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000980: 38 01 04 05 # addq 1, %4, %5 0x0000000000000984: 28 05 18 01 # movq %5, 24(%FP) 0x0000000000000988: 18 18 01 04 # movq 24(%FP), %4 0x000000000000098C: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000990: 39 68 04 00 # subq 104, %4, %0 0x0000000000000994: 43 00 00 07 # jnz else.L68 0x0000000000000998: 18 18 01 04 # movq 24(%FP), %4 0x000000000000099C: 38 01 04 05 # addq 1, %4, %5 0x00000000000009A0: 28 05 18 01 # movq %5, 24(%FP) 0x00000000000009A4: 56 00 01 04 # ldzwq 1, %4 0x00000000000009A8: 28 04 D8 01 # movq %4, -40(%FP) 0x00000000000009AC: 41 00 00 03 # jmp endif.L67 #else.L68: 0x00000000000009B0: 56 00 02 04 # ldzwq 2, %4 0x00000000000009B4: 28 04 D8 01 # movq %4, -40(%FP) #endif.L67: #endif.L66: #endif.L63: #endif.L59: 0x00000000000009B8: 18 18 01 04 # movq 24(%FP), %4 0x00000000000009BC: 1F 00 04 04 # movsbq 0(%4), %4 0x00000000000009C0: 39 64 04 00 # subq 100, %4, %0 0x00000000000009C4: 42 00 00 05 # jz .L71 0x00000000000009C8: 18 18 01 04 # movq 24(%FP), %4 0x00000000000009CC: 1F 00 04 04 # movsbq 0(%4), %4 0x00000000000009D0: 39 69 04 00 # subq 105, %4, %0 0x00000000000009D4: 43 00 00 3C # jnz else.L70 #.L71: 0x00000000000009D8: 18 20 01 04 # movq 32(%FP), %4 0x00000000000009DC: 18 F8 01 05 # movq -8(%FP), %5 0x00000000000009E0: 3C 08 05 05 # imulq 8, %5, %5 0x00000000000009E4: 30 05 04 06 # addq %5, %4, %6 0x00000000000009E8: 38 08 06 04 # addq 8, %6, %4 0x00000000000009EC: 18 D8 01 05 # movq -40(%FP), %5 0x00000000000009F0: 31 05 04 06 # subq %5, %4, %6 0x00000000000009F4: 28 06 D0 01 # movq %6, -48(%FP) 0x00000000000009F8: 18 D8 01 04 # movq -40(%FP), %4 0x00000000000009FC: 39 01 04 00 # subq 1, %4, %0 0x0000000000000A00: 43 00 00 04 # jnz .L72 0x0000000000000A04: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000A08: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000A0C: 41 00 00 0F # jmp .L73 #.L72: 0x0000000000000A10: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000A14: 39 02 05 00 # subq 2, %5, %0 0x0000000000000A18: 43 00 00 04 # jnz .L74 0x0000000000000A1C: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000A20: 1E 00 04 04 # movswq 0(%4), %4 0x0000000000000A24: 41 00 00 09 # jmp .L75 #.L74: 0x0000000000000A28: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000A2C: 39 04 05 00 # subq 4, %5, %0 0x0000000000000A30: 43 00 00 04 # jnz .L76 0x0000000000000A34: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000A38: 1D 00 04 04 # movslq 0(%4), %4 0x0000000000000A3C: 41 00 00 03 # jmp .L77 #.L76: 0x0000000000000A40: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000A44: 18 00 04 04 # movq 0(%4), %4 #.L77: #.L75: #.L73: 0x0000000000000A48: 28 04 C8 01 # movq %4, -56(%FP) 0x0000000000000A4C: 1B E7 01 04 # movzbq -25(%FP), %4 0x0000000000000A50: 31 00 04 00 # subq %0, %4, %0 0x0000000000000A54: 42 00 00 0E # jz endif.L78 0x0000000000000A58: 18 C8 01 04 # movq -56(%FP), %4 0x0000000000000A5C: 39 00 04 00 # subq 0, %4, %0 0x0000000000000A60: 44 00 00 0B # jl endif.L78 0x0000000000000A64: 39 18 02 02 # subq 24, %SP, %SP 0x0000000000000A68: 56 00 2B 04 # ldzwq 43, %4 0x0000000000000A6C: 2B 04 12 02 # movb %4, 18(%SP) 0x0000000000000A70: 56 00 00 04 # ldzwq @w3(putchar), %4 0x0000000000000A74: 5D 00 00 04 # shldwq @w2(putchar), %4 0x0000000000000A78: 5D 00 00 04 # shldwq @w1(putchar), %4 0x0000000000000A7C: 5D 0E 48 04 # shldwq @w0(putchar), %4 0x0000000000000A80: 40 04 03 00 # jmp %4, %RET 0x0000000000000A84: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000A88: 38 18 02 02 # addq 24, %SP, %SP #endif.L78: 0x0000000000000A8C: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000A90: 1B F7 01 04 # movzbq -9(%FP), %4 0x0000000000000A94: 2B 04 10 02 # movb %4, 16(%SP) 0x0000000000000A98: 18 E8 01 04 # movq -24(%FP), %4 0x0000000000000A9C: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000AA0: 18 C8 01 04 # movq -56(%FP), %4 0x0000000000000AA4: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000AA8: 56 00 00 04 # ldzwq @w3(print_int64), %4 0x0000000000000AAC: 5D 00 00 04 # shldwq @w2(print_int64), %4 0x0000000000000AB0: 5D 00 00 04 # shldwq @w1(print_int64), %4 0x0000000000000AB4: 5D 05 0C 04 # shldwq @w0(print_int64), %4 0x0000000000000AB8: 40 04 03 00 # jmp %4, %RET 0x0000000000000ABC: 38 28 02 02 # addq 40, %SP, %SP 0x0000000000000AC0: 41 00 00 B9 # jmp endif.L69 #else.L70: 0x0000000000000AC4: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000AC8: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000ACC: 39 75 04 00 # subq 117, %4, %0 0x0000000000000AD0: 43 00 00 2E # jnz else.L80 0x0000000000000AD4: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000AD8: 18 F8 01 05 # movq -8(%FP), %5 0x0000000000000ADC: 3C 08 05 05 # imulq 8, %5, %5 0x0000000000000AE0: 30 05 04 06 # addq %5, %4, %6 0x0000000000000AE4: 38 08 06 04 # addq 8, %6, %4 0x0000000000000AE8: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000AEC: 31 05 04 06 # subq %5, %4, %6 0x0000000000000AF0: 28 06 D0 01 # movq %6, -48(%FP) 0x0000000000000AF4: 18 D8 01 04 # movq -40(%FP), %4 0x0000000000000AF8: 39 01 04 00 # subq 1, %4, %0 0x0000000000000AFC: 43 00 00 04 # jnz .L81 0x0000000000000B00: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000B04: 1B 00 04 04 # movzbq 0(%4), %4 0x0000000000000B08: 41 00 00 0F # jmp .L82 #.L81: 0x0000000000000B0C: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000B10: 39 02 05 00 # subq 2, %5, %0 0x0000000000000B14: 43 00 00 04 # jnz .L83 0x0000000000000B18: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000B1C: 1A 00 04 04 # movzwq 0(%4), %4 0x0000000000000B20: 41 00 00 09 # jmp .L84 #.L83: 0x0000000000000B24: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000B28: 39 04 05 00 # subq 4, %5, %0 0x0000000000000B2C: 43 00 00 04 # jnz .L85 0x0000000000000B30: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000B34: 19 00 04 04 # movzlq 0(%4), %4 0x0000000000000B38: 41 00 00 03 # jmp .L86 #.L85: 0x0000000000000B3C: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000B40: 18 00 04 04 # movq 0(%4), %4 #.L86: #.L84: #.L82: 0x0000000000000B44: 28 04 C8 01 # movq %4, -56(%FP) 0x0000000000000B48: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000B4C: 56 00 00 04 # ldzwq 0, %4 0x0000000000000B50: 2B 04 10 02 # movb %4, 16(%SP) 0x0000000000000B54: 1B F7 01 04 # movzbq -9(%FP), %4 0x0000000000000B58: 2B 04 11 02 # movb %4, 17(%SP) 0x0000000000000B5C: 18 E8 01 04 # movq -24(%FP), %4 0x0000000000000B60: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000B64: 18 C8 01 04 # movq -56(%FP), %4 0x0000000000000B68: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000B6C: 56 00 00 04 # ldzwq @w3(print_uint64), %4 0x0000000000000B70: 5D 00 00 04 # shldwq @w2(print_uint64), %4 0x0000000000000B74: 5D 00 00 04 # shldwq @w1(print_uint64), %4 0x0000000000000B78: 5D 00 C4 04 # shldwq @w0(print_uint64), %4 0x0000000000000B7C: 40 04 03 00 # jmp %4, %RET 0x0000000000000B80: 38 28 02 02 # addq 40, %SP, %SP 0x0000000000000B84: 41 00 00 88 # jmp endif.L79 #else.L80: 0x0000000000000B88: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000B8C: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000B90: 39 6F 04 00 # subq 111, %4, %0 0x0000000000000B94: 43 00 00 2C # jnz else.L88 0x0000000000000B98: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000B9C: 18 F8 01 05 # movq -8(%FP), %5 0x0000000000000BA0: 3C 08 05 05 # imulq 8, %5, %5 0x0000000000000BA4: 30 05 04 06 # addq %5, %4, %6 0x0000000000000BA8: 38 08 06 04 # addq 8, %6, %4 0x0000000000000BAC: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000BB0: 31 05 04 06 # subq %5, %4, %6 0x0000000000000BB4: 28 06 D0 01 # movq %6, -48(%FP) 0x0000000000000BB8: 18 D8 01 04 # movq -40(%FP), %4 0x0000000000000BBC: 39 01 04 00 # subq 1, %4, %0 0x0000000000000BC0: 43 00 00 04 # jnz .L89 0x0000000000000BC4: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000BC8: 1B 00 04 04 # movzbq 0(%4), %4 0x0000000000000BCC: 41 00 00 0F # jmp .L90 #.L89: 0x0000000000000BD0: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000BD4: 39 02 05 00 # subq 2, %5, %0 0x0000000000000BD8: 43 00 00 04 # jnz .L91 0x0000000000000BDC: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000BE0: 1A 00 04 04 # movzwq 0(%4), %4 0x0000000000000BE4: 41 00 00 09 # jmp .L92 #.L91: 0x0000000000000BE8: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000BEC: 39 04 05 00 # subq 4, %5, %0 0x0000000000000BF0: 43 00 00 04 # jnz .L93 0x0000000000000BF4: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000BF8: 19 00 04 04 # movzlq 0(%4), %4 0x0000000000000BFC: 41 00 00 03 # jmp .L94 #.L93: 0x0000000000000C00: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000C04: 18 00 04 04 # movq 0(%4), %4 #.L94: #.L92: #.L90: 0x0000000000000C08: 28 04 C8 01 # movq %4, -56(%FP) 0x0000000000000C0C: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000C10: 1B F7 01 04 # movzbq -9(%FP), %4 0x0000000000000C14: 2B 04 10 02 # movb %4, 16(%SP) 0x0000000000000C18: 18 E8 01 04 # movq -24(%FP), %4 0x0000000000000C1C: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000C20: 18 C8 01 04 # movq -56(%FP), %4 0x0000000000000C24: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000C28: 56 00 00 04 # ldzwq @w3(print_uint64_oct), %4 0x0000000000000C2C: 5D 00 00 04 # shldwq @w2(print_uint64_oct), %4 0x0000000000000C30: 5D 00 00 04 # shldwq @w1(print_uint64_oct), %4 0x0000000000000C34: 5D 03 C8 04 # shldwq @w0(print_uint64_oct), %4 0x0000000000000C38: 40 04 03 00 # jmp %4, %RET 0x0000000000000C3C: 38 28 02 02 # addq 40, %SP, %SP 0x0000000000000C40: 41 00 00 59 # jmp endif.L87 #else.L88: 0x0000000000000C44: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000C48: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000C4C: 39 78 04 00 # subq 120, %4, %0 0x0000000000000C50: 43 00 00 2C # jnz else.L96 0x0000000000000C54: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000C58: 18 F8 01 05 # movq -8(%FP), %5 0x0000000000000C5C: 3C 08 05 05 # imulq 8, %5, %5 0x0000000000000C60: 30 05 04 06 # addq %5, %4, %6 0x0000000000000C64: 38 08 06 04 # addq 8, %6, %4 0x0000000000000C68: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000C6C: 31 05 04 06 # subq %5, %4, %6 0x0000000000000C70: 28 06 D0 01 # movq %6, -48(%FP) 0x0000000000000C74: 18 D8 01 04 # movq -40(%FP), %4 0x0000000000000C78: 39 01 04 00 # subq 1, %4, %0 0x0000000000000C7C: 43 00 00 04 # jnz .L97 0x0000000000000C80: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000C84: 1B 00 04 04 # movzbq 0(%4), %4 0x0000000000000C88: 41 00 00 0F # jmp .L98 #.L97: 0x0000000000000C8C: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000C90: 39 02 05 00 # subq 2, %5, %0 0x0000000000000C94: 43 00 00 04 # jnz .L99 0x0000000000000C98: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000C9C: 1A 00 04 04 # movzwq 0(%4), %4 0x0000000000000CA0: 41 00 00 09 # jmp .L100 #.L99: 0x0000000000000CA4: 18 D8 01 05 # movq -40(%FP), %5 0x0000000000000CA8: 39 04 05 00 # subq 4, %5, %0 0x0000000000000CAC: 43 00 00 04 # jnz .L101 0x0000000000000CB0: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000CB4: 19 00 04 04 # movzlq 0(%4), %4 0x0000000000000CB8: 41 00 00 03 # jmp .L102 #.L101: 0x0000000000000CBC: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000CC0: 18 00 04 04 # movq 0(%4), %4 #.L102: #.L100: #.L98: 0x0000000000000CC4: 28 04 C8 01 # movq %4, -56(%FP) 0x0000000000000CC8: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000CCC: 1B F7 01 04 # movzbq -9(%FP), %4 0x0000000000000CD0: 2B 04 10 02 # movb %4, 16(%SP) 0x0000000000000CD4: 18 E8 01 04 # movq -24(%FP), %4 0x0000000000000CD8: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000CDC: 18 C8 01 04 # movq -56(%FP), %4 0x0000000000000CE0: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000CE4: 56 00 00 04 # ldzwq @w3(print_int64_hex), %4 0x0000000000000CE8: 5D 00 00 04 # shldwq @w2(print_int64_hex), %4 0x0000000000000CEC: 5D 00 00 04 # shldwq @w1(print_int64_hex), %4 0x0000000000000CF0: 5D 02 44 04 # shldwq @w0(print_int64_hex), %4 0x0000000000000CF4: 40 04 03 00 # jmp %4, %RET 0x0000000000000CF8: 38 28 02 02 # addq 40, %SP, %SP 0x0000000000000CFC: 41 00 00 2A # jmp endif.L95 #else.L96: 0x0000000000000D00: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000D04: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000D08: 39 70 04 00 # subq 112, %4, %0 0x0000000000000D0C: 43 00 00 15 # jnz else.L104 0x0000000000000D10: 18 20 01 04 # movq 32(%FP), %4 0x0000000000000D14: 18 F8 01 05 # movq -8(%FP), %5 0x0000000000000D18: 3C 08 05 05 # imulq 8, %5, %5 0x0000000000000D1C: 30 05 04 06 # addq %5, %4, %6 0x0000000000000D20: 18 00 06 06 # movq 0(%6), %6 0x0000000000000D24: 28 06 D0 01 # movq %6, -48(%FP) 0x0000000000000D28: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000D2C: 1B F7 01 04 # movzbq -9(%FP), %4 0x0000000000000D30: 2B 04 10 02 # movb %4, 16(%SP) 0x0000000000000D34: 18 E8 01 04 # movq -24(%FP), %4 0x0000000000000D38: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000D3C: 18 D0 01 04 # movq -48(%FP), %4 0x0000000000000D40: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000D44: 56 00 00 04 # ldzwq @w3(print_int64_hex), %4 0x0000000000000D48: 5D 00 00 04 # shldwq @w2(print_int64_hex), %4 0x0000000000000D4C: 5D 00 00 04 # shldwq @w1(print_int64_hex), %4 0x0000000000000D50: 5D 02 44 04 # shldwq @w0(print_int64_hex), %4 0x0000000000000D54: 40 04 03 00 # jmp %4, %RET 0x0000000000000D58: 38 28 02 02 # addq 40, %SP, %SP 0x0000000000000D5C: 41 00 00 12 # jmp endif.L103 #else.L104: 0x0000000000000D60: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000D64: 56 00 00 04 # ldzwq @w3(str.L1), %4 0x0000000000000D68: 5D 00 00 04 # shldwq @w2(str.L1), %4 0x0000000000000D6C: 5D 00 00 04 # shldwq @w1(str.L1), %4 0x0000000000000D70: 5D 0E 88 04 # shldwq @w0(str.L1), %4 0x0000000000000D74: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000D78: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000D7C: 1F 00 04 04 # movsbq 0(%4), %4 0x0000000000000D80: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000D84: 56 00 00 04 # ldzwq @w3(printf), %4 0x0000000000000D88: 5D 00 00 04 # shldwq @w2(printf), %4 0x0000000000000D8C: 5D 00 00 04 # shldwq @w1(printf), %4 0x0000000000000D90: 5D 0D DC 04 # shldwq @w0(printf), %4 0x0000000000000D94: 40 04 03 00 # jmp %4, %RET 0x0000000000000D98: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000D9C: 38 28 02 02 # addq 40, %SP, %SP 0x0000000000000DA0: 41 00 00 04 # jmp for.incr.L45 #endif.L103: #endif.L95: #endif.L87: #endif.L79: #endif.L69: #endif.L57: #endif.L55: 0x0000000000000DA4: 18 F8 01 04 # movq -8(%FP), %4 0x0000000000000DA8: 38 01 04 05 # addq 1, %4, %5 0x0000000000000DAC: 28 05 F8 01 # movq %5, -8(%FP) #for.incr.L45: #endif.L49: #endif.L47: 0x0000000000000DB0: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000DB4: 38 01 04 05 # addq 1, %4, %5 0x0000000000000DB8: 28 05 18 01 # movq %5, 24(%FP) 0x0000000000000DBC: 41 FF FE 50 # jmp check.for.cond.L44 #for.end.L46: 0x0000000000000DC0: 56 00 01 04 # ldzwq 1, %4 0x0000000000000DC4: 2A 04 10 01 # movw %4, 16(%FP) 0x0000000000000DC8: 41 00 00 01 # jmp leave.L43 #leave.L43: 0x0000000000000DCC: 38 00 01 02 # addq 0, %FP, %SP 0x0000000000000DD0: 18 08 02 01 # movq 8(%SP), %FP 0x0000000000000DD4: 18 00 02 03 # movq 0(%SP), %RET 0x0000000000000DD8: 40 03 00 00 # jmp %RET, %0 #printf: 0x0000000000000DDC: 28 03 00 02 # movq %RET, 0(%SP) 0x0000000000000DE0: 28 01 08 02 # movq %FP, 8(%SP) 0x0000000000000DE4: 38 00 02 01 # addq 0, %SP, %FP 0x0000000000000DE8: 39 38 02 02 # subq 56, %SP, %SP 0x0000000000000DEC: 38 18 01 04 # addq 24, %FP, %4 0x0000000000000DF0: 56 00 01 05 # ldzwq 1, %5 0x0000000000000DF4: 3C 08 05 05 # imulq 8, %5, %5 0x0000000000000DF8: 30 05 04 06 # addq %5, %4, %6 0x0000000000000DFC: 28 06 F8 01 # movq %6, -8(%FP) 0x0000000000000E00: 39 28 02 02 # subq 40, %SP, %SP 0x0000000000000E04: 18 18 01 04 # movq 24(%FP), %4 0x0000000000000E08: 28 04 18 02 # movq %4, 24(%SP) 0x0000000000000E0C: 18 F8 01 04 # movq -8(%FP), %4 0x0000000000000E10: 28 04 20 02 # movq %4, 32(%SP) 0x0000000000000E14: 56 00 00 04 # ldzwq @w3(vprintf), %4 0x0000000000000E18: 5D 00 00 04 # shldwq @w2(vprintf), %4 0x0000000000000E1C: 5D 00 00 04 # shldwq @w1(vprintf), %4 0x0000000000000E20: 5D 06 E4 04 # shldwq @w0(vprintf), %4 0x0000000000000E24: 40 04 03 00 # jmp %4, %RET 0x0000000000000E28: 1E 10 02 04 # movswq 16(%SP), %4 0x0000000000000E2C: 38 28 02 02 # addq 40, %SP, %SP 0x0000000000000E30: 2A 04 10 01 # movw %4, 16(%FP) 0x0000000000000E34: 41 00 00 01 # jmp leave.L105 #leave.L105: 0x0000000000000E38: 38 00 01 02 # addq 0, %FP, %SP 0x0000000000000E3C: 18 08 02 01 # movq 8(%SP), %FP 0x0000000000000E40: 18 00 02 03 # movq 0(%SP), %RET 0x0000000000000E44: 40 03 00 00 # jmp %RET, %0 # from: /home/numerik/pub/ulmcc/lib/libulm.a(putchar.o) #putchar: 0x0000000000000E48: 28 03 00 02 # movq %RET, 0(%SP) 0x0000000000000E4C: 28 01 08 02 # movq %FP, 8(%SP) 0x0000000000000E50: 38 00 02 01 # addq 0, %SP, %FP 0x0000000000000E54: 39 00 02 02 # subq 0, %SP, %SP 0x0000000000000E58: 1F 12 01 04 # movsbq 18(%FP), %4 0x0000000000000E5C: 61 04 00 00 # putc %4 0x0000000000000E60: 2A 04 10 01 # movw %4, 16(%FP) 0x0000000000000E64: 41 00 00 01 # jmp leave.L0 #leave.L0: 0x0000000000000E68: 38 00 01 02 # addq 0, %FP, %SP 0x0000000000000E6C: 18 08 02 01 # movq 8(%SP), %FP 0x0000000000000E70: 18 00 02 03 # movq 0(%SP), %RET 0x0000000000000E74: 40 03 00 00 # jmp %RET, %0 #DATA 1 # from: bar.o #str.L0: 0x0000000000000E78: 66 6F 6F 20 62 61 72 0A 00 # .string "foo bar\n" # from: /home/numerik/pub/ulmcc/lib/libulm.a(stdio.o) #str.L0: 0x0000000000000E81: 28 6E 75 6C 6C 29 00 # .string "(null)" #str.L1: 0x0000000000000E88: 0A 70 72 69 6E 74 66 3A 20 75 6E 65 78 70 65 63 74 65 64 20 66 6F 72 6D 61 74 20 73 70 65 63 69 66 69 65 72 20 60 25 63 27 0A 00 # .string "\nprintf: unexpected format specifier `%c'\n" #BSS 1 0 #(begins at 0xEB3) #SYMTAB T _start 0x00000000000000A8 T bar 0x0000000000000054 T main 0x0000000000000014 T printf 0x0000000000000DDC T putchar 0x0000000000000E48 T puts 0x0000000000000668 T vprintf 0x00000000000006E4 a FP 0x0000000000000001 a FP 0x0000000000000001 a FP 0x0000000000000001 a FP 0x0000000000000001 a FP 0x0000000000000001 a RET 0x0000000000000003 a RET 0x0000000000000003 a RET 0x0000000000000003 a RET 0x0000000000000003 a RET 0x0000000000000003 a SP 0x0000000000000002 a SP 0x0000000000000002 a SP 0x0000000000000002 a SP 0x0000000000000002 a SP 0x0000000000000002 a ZERO 0x0000000000000000 a ZERO 0x0000000000000000 a ZERO 0x0000000000000000 a ZERO 0x0000000000000000 t check.for.cond.L18 0x00000000000002F0 t check.for.cond.L30 0x0000000000000474 t check.for.cond.L44 0x00000000000006FC t check.for.cond.L7 0x0000000000000178 t check.while.cond.L40 0x0000000000000600 t check.while.cond.L53 0x00000000000007F8 t else.L104 0x0000000000000D60 t else.L15 0x00000000000002E8 t else.L24 0x0000000000000388 t else.L27 0x000000000000046C t else.L4 0x0000000000000170 t else.L48 0x0000000000000764 t else.L50 0x00000000000007B0 t else.L56 0x0000000000000890 t else.L58 0x00000000000008DC t else.L60 0x0000000000000934 t else.L62 0x0000000000000928 t else.L64 0x000000000000096C t else.L68 0x00000000000009B0 t else.L70 0x0000000000000AC4 t else.L80 0x0000000000000B88 t else.L88 0x0000000000000C44 t else.L96 0x0000000000000D00 t endif.L103 0x0000000000000DA4 t endif.L12 0x0000000000000208 t endif.L14 0x000000000000034C t endif.L23 0x00000000000003B8 t endif.L26 0x00000000000004D0 t endif.L3 0x0000000000000208 t endif.L36 0x000000000000055C t endif.L37 0x000000000000055C t endif.L39 0x0000000000000600 t endif.L47 0x0000000000000DB0 t endif.L49 0x0000000000000DB0 t endif.L51 0x00000000000007D4 t endif.L52 0x00000000000007F8 t endif.L55 0x0000000000000DA4 t endif.L57 0x0000000000000DA4 t endif.L59 0x00000000000009B8 t endif.L61 0x0000000000000930 t endif.L63 0x00000000000009B8 t endif.L66 0x00000000000009B8 t endif.L67 0x00000000000009B8 t endif.L69 0x0000000000000DA4 t endif.L78 0x0000000000000A8C t endif.L79 0x0000000000000DA4 t endif.L87 0x0000000000000DA4 t endif.L95 0x0000000000000DA4 t for.end.L20 0x000000000000034C t for.end.L32 0x00000000000004D0 t for.end.L46 0x0000000000000DC0 t for.end.L9 0x00000000000001D4 t for.incr.L19 0x000000000000033C t for.incr.L31 0x00000000000004C0 t for.incr.L45 0x0000000000000DB0 t for.incr.L8 0x00000000000001C4 a fp 0x0000000000000008 t leave.L0 0x0000000000000044 t leave.L0 0x0000000000000E68 t leave.L1 0x0000000000000098 t leave.L105 0x0000000000000E38 t leave.L13 0x00000000000003B8 t leave.L2 0x0000000000000234 t leave.L25 0x00000000000004FC t leave.L35 0x0000000000000598 t leave.L38 0x0000000000000658 t leave.L42 0x00000000000006D4 t leave.L43 0x0000000000000DCC t print_int64 0x000000000000050C t print_int64_hex 0x0000000000000244 t print_uint64 0x00000000000000C4 t print_uint64_oct 0x00000000000003C8 t puts_ 0x00000000000005A8 a ret 0x0000000000000000 a rval 0x0000000000000010 d str.L0 0x0000000000000000 d str.L0 0x0000000000000009 d str.L1 0x0000000000000010 t while.end.L41 0x000000000000064C t while.end.L54 0x0000000000000844
No Error Message means ...
... the compiler tools could not help you to find the errors in your code. So you are on your own :(
Usually beginners in programming do not like error messages, but they should. Because the above statement will often be true. Here an example for a program that compiles perfectly but crashes terribly when you run it. The problem might be obvious. But in general the same type of problem can be hidden with within several thousands lines of code:
-
File foo.c with
1 2 3 4 5 6 7
void bar(void); int main() { bar(); }
-
File bar.c with
1
int bar = 42;
This compiles without any error or even warning into an executable:
theon$ gcc -Wall foo.c bar.c theon$
And this happens when you run it (it will run, but just for a few instructions):
theon$ a.out Segmentation Fault (core dumped) theon$ echo $? theon$