	.file	"array-stack-int3D.c"
	.version	"01.01"
gcc2_compiled.:
.text
	.align 4
.globl intArray3D
	.type	 intArray3D,@function
intArray3D:
	pushl %ebp
	movl %esp,%ebp
        /* Woah thats a lot of memory */
	subl $1224,%esp
	nop
        /* Set var1 = 0 */
	movl $0,-1204(%ebp)
	.p2align 4,,7
.L3:
        /* While(var1 <= 2) */
	cmpl $2,-1204(%ebp)
	jle .L6
	jmp .L4
	.p2align 4,,7
.L6:
        /* set var2 = 0 */
	movl $0,-1208(%ebp)
	.p2align 4,,7
.L7:
        /* While(var2 <= 9) */
	cmpl $9,-1208(%ebp)
	jle .L10
	jmp .L5
	.p2align 4,,7
.L10:
        /* Set var3 = 0 */
	movl $0,-1212(%ebp)
	.p2align 4,,7
.L11:
        /* While(var3 <= 9) */
	cmpl $9,-1212(%ebp)
	jle .L14
	jmp .L9
	.p2align 4,,7
.L14:
        /* var2 -> eax */
	movl -1208(%ebp),%eax

        /* if(var2 != var3) then jump*/
	cmpl -1212(%ebp),%eax
	jne .L15

        /* code executed if(var2 == var3) */

        /* place var3 in eax */       
	movl -1212(%ebp),%eax
	movl %eax,%edx

        /* eax = var3 *4 */
	leal 0(,%edx,4),%eax

        /* place var2 in ecx */
	movl -1208(%ebp),%ecx
	movl %ecx,%edx

        /* edx = var2*4 */
	sall $2,%edx
        /* edx = var2*5 */
	addl %ecx,%edx

        /* ecx = var2*40 */
	leal 0(,%edx,8),%ecx

        /* eax = var2*40 + var3 * 4 */
	addl %ecx,%eax

        /* ecx = var1 */
	movl -1204(%ebp),%ecx
	movl %ecx,%edx

        /* edx = var1*4 */
	sall $2,%edx
        /* edx = var1*5 */
	addl %ecx,%edx

        /* ecx = var1*20 */
	leal 0(,%edx,4),%ecx

        /* edx = var1*25 */
	addl %ecx,%edx
	movl %edx,%ecx

        /* ecx = var1*25*16 = var1*100*4 = var1*400 */
	sall $4,%ecx

        /* eax = var1*400 + var2*40 + var3*4 */
	addl %ecx,%eax
        
        /* edx = base of array */
	leal -1200(%ebp),%edx

        /* ecx = var1 */
	movl -1204(%ebp),%ecx

        /* set *(array + var1*400 + var2*40 + var3*4) = var1.
         * So: array[var1][var2][var3] = var1;
         *
         * Can we guess the dimensions of our array at this point yet?
         *
         * From the formula given, 400 = dim2*dim1*type, 40 = dim1*type,
         * 4=type.
         * 
         * So type is int, dim1 is 10, dim2 is 10, dim3 is unknown.
         * For a hint at dim3, what does the loop iterate var1 over? 
         * It executes so long as var1 <= 2. So our array is probably declared
         * as:
         * int array[3][10][10];
         */
	movl %ecx,(%eax,%edx)
	jmp .L13
	.p2align 4,,7
.L15:
        /* else clause for if(var2 == var3) */

        /* this is pretty much the same code as above.. with one exception.. */
	movl -1212(%ebp),%eax
	movl %eax,%edx

	leal 0(,%edx,4),%eax
	movl -1208(%ebp),%ecx
	movl %ecx,%edx
	sall $2,%edx
	addl %ecx,%edx
	leal 0(,%edx,8),%ecx
	addl %ecx,%eax
	movl -1204(%ebp),%ecx
	movl %ecx,%edx
	sall $2,%edx
	addl %ecx,%edx
	leal 0(,%edx,4),%ecx
	addl %ecx,%edx
	movl %edx,%ecx
	sall $4,%ecx
	addl %ecx,%eax
	leal -1200(%ebp),%edx

        /* set *(array + var1*400 + var2*40 + var3*4) = 0 */
	movl $0,(%eax,%edx)
.L16:
.L13:
        /* var3++ */
	incl -1212(%ebp)
	jmp .L11
	.p2align 4,,7
.L12:
.L9:
        /* var2++ */
	incl -1208(%ebp)
	jmp .L7
	.p2align 4,,7
.L8:
.L5:
        /* var1++ */
	incl -1204(%ebp)
	jmp .L3
	.p2align 4,,7
.L4:

        /* So can you visualize what is going on with our 3D array?
         * What does it look like? You should be able to do this on your own
         * with little to no difficulty now.
         */

	addl $-12,%esp
	leal -1200(%ebp),%eax
	pushl %eax
	call printArray
	addl $16,%esp
.L2:
	leave
	ret
.Lfe1:
	.size	 intArray3D,.Lfe1-intArray3D
	.ident	"GCC: (GNU) 2.95.4  (Debian prerelease)"

