         Edinburgh IMP77 Compiler - Version 8.4
    1 %begin
				.section .mdebug.abi32
				.previous
				.nan	legacy
				.module	fp=xx
				.module	nooddspreg
				.abicalls
		$Ltext0:
				.align	2
				.globl	main
				LFB185 = .
				.set	nomips16
				.set	nomicromips
				.ent	main
		main:
				.frame	$sp,616,$31		# vars= 584, regs= 2/0, args= 16, gp= 8
				.mask	0x80010000,-4
				.fmask	0x00000000,0
				.set	noreorder
				.set	nomacro
				LVL0 = .
				addiu	$sp,$sp,-616
				sw	$31,612($sp)
				sw	$16,608($sp)
				lui	$28,%hi(__gnu_local_gp)
				addiu	$28,$28,%lo(__gnu_local_gp)
				.cprestore	16
				lw	$2,%got(__stack_chk_guard)($28)
				lw	$2,0($2)
				sw	$2,604($sp)
    2
				lw	$25,%call16(_imp_initialise)($28)
				.reloc	1f,R_MIPS_JALR,_imp_initialise
			1:	jalr	$25
				nop
				LVL1 = .
				lw	$28,16($sp)
				LVL2 = .
				LVL3 = .
				addiu	$16,$sp,200
				move	$3,$16
    3   ! the example in https://www.ancientgeek.org.uk/EMAS/EMAS_Papers/The_IMP_language_and_compiler.pdf
    4   %integer i, j, k, n
    5
    6   n = 42 ; ! a little initialisation has been added which was not explicit in the paper to avoid runtime errors.
    7
    8   %integer %array a(0:100), b(0:n)
    9
   10   a(n) = n %for n = 0, 1, 100
   11   b(n) = n %for n = 0, 1, 42
				li	$2,-1			# 0xffffffffffffffff
   12   write(n,3); newline
				li	$2,-1			# 0xffffffffffffffff
				LVL7 = .
				li	$5,3			# 0x3
				li	$4,42			# 0x2a
				lw	$25,%call16(_imp_writeint)($28)
				.reloc	1f,R_MIPS_JALR,_imp_writeint
			1:	jalr	$25
				nop
				LVL10 = .
				lw	$28,16($sp)
				LVL11 = .
				LBB11 = .
				LBB12 = .
				lw	$25,%call16(_imp_newline)($28)
				.reloc	1f,R_MIPS_JALR,_imp_newline
			1:	jalr	$25
				nop
				LVL12 = .
				lw	$28,16($sp)
				LVL13 = .
				addiu	$2,$sp,204
				addiu	$3,$sp,36
				addiu	$6,$16,172
				LBE12 = .
				LBE11 = .
				move	$4,$0
   13
				li	$4,100			# 0x64
				LVL4 = .
		$L2:
				bne	$2,$4,$L2
				addiu	$3,$3,4
				addiu	$3,$sp,28
				LVL6 = .
   14   n = 42
				addiu	$2,$2,1
				LVL5 = .
				li	$4,42			# 0x2a
				LVL8 = .
		$L3:
				addiu	$2,$2,1
				LVL9 = .
				bne	$2,$4,$L3
				addiu	$3,$3,4
				L4 = .
   15
				sw	$2,0($3)
				LDL1 = .
   16   j = 0; k = 0;
				sw	$2,0($3)
				LDL2 = .
				LDL3 = .
   17
				move	$16,$0
				LVL14 = .
		$L5:
				LBB13 = .
   18   %cycle i = 1, 1, n
   19     j = j + a(i)
				lw	$5,0($2)
				addu	$4,$4,$5
				LVL15 = .
   20     k = k + b(i+1)        ;! should cause a runtime error since i+1 == n+1 and array b is 0:n ...
				lw	$5,0($3)
				addu	$16,$16,$5
				LVL16 = .
				LDL4 = .
				addiu	$2,$2,4
   21   %repeat
   22
   23   write(j, 5); write(k, 5); newline
				bne	$2,$6,$L5
				addiu	$3,$3,4
				L6 = .
				LBE13 = .
				li	$5,5			# 0x5
				lw	$25,%call16(_imp_writeint)($28)
				.reloc	1f,R_MIPS_JALR,_imp_writeint
			1:	jalr	$25
				nop
				LVL17 = .
				lw	$28,16($sp)
				LVL18 = .
   24
				li	$5,5			# 0x5
				move	$4,$16
				lw	$25,%call16(_imp_writeint)($28)
				.reloc	1f,R_MIPS_JALR,_imp_writeint
			1:	jalr	$25
				nop
				LVL19 = .
				lw	$28,16($sp)
				LBB14 = .
				LBB15 = .
				lw	$25,%call16(_imp_newline)($28)
				.reloc	1f,R_MIPS_JALR,_imp_newline
			1:	jalr	$25
				nop
				LVL20 = .
				lw	$28,16($sp)
				LVL21 = .
				LBE15 = .
				LBE14 = .
				LBB16 = .
				LBB17 = .
				move	$4,$0
				lw	$25,%call16(exit)($28)
				.reloc	1f,R_MIPS_JALR,exit
			1:	jalr	$25
				nop
				LVL22 = .
				LBE17 = .
				LBE16 = .
				.set	macro
				.set	reorder
				.end	main
		$LFE185:
		$Letext0:
   25 %endofprogram
   19 Statements compiled
