   1              	/* --------------------------------------------------
   2              	   Define required labels for EGTAPI
   3              	   -------------------------------------------------- */
   4              	        .global main, Stop, CodeEnd, DataStart, DataEnd
   5              	
   6              		.global Pause, sumRange
   7              	
   8              	/* --------------------------------------------------
   9              	   Begin of the program instructions
  10              	   -------------------------------------------------- */
  11              		.text
  12              	main:
  13              		/* ======================================
  14              		   sum = sumRange(A, x, y)
  15              		   ====================================== */
  16 0000 000000E3 		movw	r0, #:lower16:y
  17 0004 000040E3 		movt	r0, #:upper16:y
  18 0008 000090E5 		ldr	r0, [r0]
  19 000c 04002DE5 		push	{r0}
  20              	
  21 0010 000000E3 	        movw    r0, #:lower16:x
  22 0014 000040E3 	        movt    r0, #:upper16:x
  23 0018 000090E5 	        ldr     r0, [r0]
  24 001c 04002DE5 	        push    {r0}
  25              	
  26 0020 000000E3 	        movw    r0, #:lower16:A
  27 0024 000040E3 	        movt    r0, #:upper16:A
  28 0028 04002DE5 	        push    {r0}
  29              	
  30 002c FEFFFFEB 		bl	sumRange
  31 0030 0CD08DE2 		add	sp, sp, #12
  32              	
  33 0034 001000E3 		movw    r1, #:lower16:sum
  34 0038 001040E3 	        movt    r1, #:upper16:sum
  35 003c 000081E5 		str	r0, [r1]
  36              	
  37              	Pause:
  38              		/* ======================================
  39              		   sum = sumRange(B, 3, 7)
  40              		   ====================================== */
  41 0040 0700A0E3 		mov	r0, #7
  42 0044 04002DE5 		push	{r0}
  43              	
  44 0048 0300A0E3 		mov	r0, #3
  45 004c 04002DE5 		push	{r0}
  46              	
  47 0050 000000E3 	        movw    r0, #:lower16:B
  48 0054 000040E3 	        movt    r0, #:upper16:B
  49 0058 04002DE5 	        push    {r0}
  50              	
  51 005c FEFFFFEB 	        bl      sumRange
  52 0060 0CD08DE2 	        add     sp, sp, #12
  53              	
  54 0064 001000E3 	        movw    r1, #:lower16:sum
  55 0068 001040E3 	        movt    r1, #:upper16:sum
  56 006c 000081E5 	        str     r0, [r1]
  57              	
  58              	Stop:
  59 0070 0000A0E1 		nop			   // Stop point of main( )
  60              	
  61              	
  62              	// Stack frame structure used:
  63              	// 
  64              	//          i				offset = -8
  65              	//          s				offset = -4
  66              	//    FP--> saved FP			(offset=0)
  67              	//          saved LR (return address)	(offset=4)
  68              	//	    A				offset = +8
  69              	//	    a				offset = +12
  70              	//	    b				offset = +16
  71              	//
  72              	// Store return value in r0
  73              	
  74              	sumRange:
  75 0074 04E02DE5 		push	{lr}
  76 0078 04B02DE5 		push	{fp}
  77 007c 0DB0A0E1 		mov	fp, sp
  78 0080 08D04DE2 		sub	sp, sp, #8
  79              	
  80              	// ============================================
  81              	
  82              		// s = 0
  83 0084 0000A0E3 		mov	r0, #0
  84 0088 04000BE5 		str 	r0, [fp,#-4]
  85              	
  86              		// i = a
  87 008c 0C009BE5 		ldr	r0, [fp,#12]
  88 0090 08000BE5 		str	r0, [fp,#-8]
  89              	
  90              	while:
  91 0094 08001BE5 		ldr	r0, [fp,#-8]
  92 0098 10109BE5 		ldr	r1, [fp,#16]
  93 009c 010050E1 		cmp	r0, r1
  94 00a0 0B0000AA 		bge	whileEnd
  95              	
  96              		// s = s + A[i]
  97 00a4 04001BE5 		ldr	r0, [fp,#-4]
  98              	
  99 00a8 08109BE5 		ldr	r1, [fp,#8]	// A
 100 00ac 08201BE5 		ldr	r2, [fp,#-8]	// i
 101 00b0 022082E0 		add	r2, r2, r2
 102 00b4 022082E0 		add	r2, r2, r2
 103              	
 104 00b8 021091E7 		ldr	r1, [r1,r2]
 105              	
 106 00bc 000081E0 		add	r0, r1, r0
 107              	
 108 00c0 04000BE5 		str	r0, [fp, #-4]
 109              	
 110              		// i++
 111 00c4 08001BE5 		ldr	r0, [fp,#-8]
 112 00c8 010080E2 		add	r0, r0, #1
 113 00cc 08000BE5 		str	r0, [fp,#-8]
 114              	
 115 00d0 EFFFFFEA 		b	while
 116              	
 117              	whileEnd:
 118 00d4 04001BE5 		ldr	r0,[fp,#-4]
 119              	
 120              	return:
 121 00d8 0BD0A0E1 		mov	sp, fp
 122 00dc 04B09DE4 		pop	{fp}
 123 00e0 04F09DE4 		pop	{pc}	// <----------- BUG
 124              	
 125              	
 126              	
 127              	
 128              	CodeEnd:
 129 00e4 0000A0E1 	    	nop
 130              	
 131              	/* --------------------------------------------------
 132              	   Begin of the permanent program variables
 133              	   -------------------------------------------------- */
 134              		.data
 135              	DataStart:
 136              	
 137 0000 0B000000 	A:	.4byte	11, 12, 13, 14, 15, 16, 17, 18, 19 , 20
 137      0C000000 
 137      0D000000 
 137      0E000000 
 137      0F000000 
 138 0028 01000000 	B:	.4byte	1, 2, 3, 4, 5, 6, 7, 8, 9, 10
 138      02000000 
 138      03000000 
 138      04000000 
 138      05000000 
 139 0050 01000000 	x:	.4byte	1
 140 0054 03000000 	y:	.4byte	3
 141 0058 FFFFFFFF 	sum:	.4byte  -1
 142              	
 143              	DataEnd:
 144              	
 145              		.end
DEFINED SYMBOLS
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:12     .text:0000000000000000 main
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:58     .text:0000000000000070 Stop
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:128    .text:00000000000000e4 CodeEnd
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:135    .data:0000000000000000 DataStart
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:143    .data:000000000000005c DataEnd
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:37     .text:0000000000000040 Pause
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:74     .text:0000000000000074 sumRange
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:140    .data:0000000000000054 y
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:16     .text:0000000000000000 $a
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:139    .data:0000000000000050 x
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:137    .data:0000000000000000 A
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:141    .data:0000000000000058 sum
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:138    .data:0000000000000028 B
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:90     .text:0000000000000094 while
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:117    .text:00000000000000d4 whileEnd
/home/cs255001/cs255/asm/8-sub/demo-sumRange.s:120    .text:00000000000000d8 return

NO UNDEFINED SYMBOLS
   1              	
   2              		.global	malloc, print
   3              		.global	stdout_start, stdout_end
   4              	
   5              	// **********************************************
   6              	// malloc: simulate memory allocate
   7              	//
   8              	// This function will NOT change ANY registers
   9              	// (I.e.: will preserve ALL registers)
  10              	// **********************************************
  11              	malloc:
  12 0000 0E002DE9 		push 	{r1, r2, r3}		// Save scratch registers
  13              	
  14 0004 001000E3 		movw	r1, #:lower16:maddr
  15 0008 001040E3 		movt	r1, #:upper16:maddr	// r1 = &maddr
  16 000c 003091E5 		ldr	r3, [r1]		// r3 = maddr 
  17              	
  18              		// --------------------------------------
  19              	        // Make new maddr (divisible by 8)
  20              	        // --------------------------------------
  21              	
  22 0010 002083E0 		add	r2, r3, r0		// New maddr
  23 0014 082082E2 		add	r2, r2, #8		// Making sure it increase
  24              	
  25 0018 0700A0E3 		mov	r0, #0x7		// r0 = 0000..00111
  26 001c 0000E0E1 		mvn	r0, r0			// r0 = 1111..11000
  27 0020 002002E0 		and	r2, r2, r0		// Knock off the last 3 bits
  28 0024 002081E5 		str	r2, [r1]		// Update maddr 
  29              	
  30              	
  31              		// --------------------------------------
  32              		// Return to caller
  33              		// --------------------------------------
  34 0028 0300A0E1 		mov	r0, r3			// Return maddr value in r0
  35 002c 0E00BDE8 		pop  	{r1, r2, r3}		// Restore scratch registers
  36 0030 0EF0A0E1 		mov	pc, lr			// Return
  37              	
  38 0034 00000400 	maddr:	.word 0x40000		// Start address of the heap
  39              	
  40              	
  41              	// *******************************************************************
  42              	// print: simulate print output in Egtapi
  43              	//
  44              	//	input: r0 = address of string
  45              	//	       r1 = # characters to write
  46              	//
  47              	// Egtapi will show ASCII data stored starting at stdout_start
  48              	// until stdout_end  in its output area
  49              	//
  50              	// This function will NOT change ANY registers
  51              	// (I.e.: will preserve ALL registers)
  52              	// *******************************************************************
  53              	print:
  54 0038 1C002DE9 		push	{r2, r3, r4}            	// Save scratch registers
  55              	
  56 003c 002000E3 	        movw    r2, #:lower16:stdout_end
  57 0040 002040E3 	        movt    r2, #:upper16:stdout_end	// r2 = &stdout_end
  58 0044 002092E5 	        ldr     r2, [r2]                	// r2 = stdout_end
  59              	
  60 0048 0130A0E1 		mov	r3, r1			// r3 = # char to copy
  61              	
  62              	printLoop:
  63 004c 000053E3 		cmp	r3, #0
  64 0050 0500000A 		beq	printDone
  65              	
  66 0054 0040D0E5 		ldrb	r4, [r0]		// Get next char
  67 0058 0040C2E5 		strb	r4, [r2]		// Write next char
  68              	
  69 005c 010080E2 		add	r0, r0, #1
  70 0060 012082E2 		add	r2, r2, #1
  71              	
  72 0064 013043E2 		sub	r3, r3, #1
  73              	
  74 0068 F7FFFFEA 		b	printLoop
  75              	
  76              	printDone:
  77 006c 2040A0E3 		mov	r4, #32			// Space
  78 0070 0040C2E5 		strb	r4, [r2]
  79 0074 012082E2 		add	r2, r2, #1
  80              	
  81 0078 003000E3 	        movw    r3, #:lower16:stdout_end
  82 007c 003040E3 	        movt    r3, #:upper16:stdout_end	// r2 = &stdout_end
  83 0080 002083E5 		str	r2, [r3]
  84              	
  85 0084 1C00BDE8 		pop  	{r2, r3, r4}		// Restore scratch registers
  86 0088 0EF0A0E1 		mov	pc, lr			// Return
  87              		
  88              	
  89              		
  90              	
  91 008c 00000500 	stdout_start: 	.word 0x50000		// This value remains unchanged
  92 0090 00000500 	stdout_end: 	.word 0x50000
  93              	
  94              	
  95              		.end
DEFINED SYMBOLS
/home/egtapi/lib/cs255lib.s:11     .text:0000000000000000 malloc
/home/egtapi/lib/cs255lib.s:53     .text:0000000000000038 print
/home/egtapi/lib/cs255lib.s:91     .text:000000000000008c stdout_start
/home/egtapi/lib/cs255lib.s:92     .text:0000000000000090 stdout_end
/home/egtapi/lib/cs255lib.s:12     .text:0000000000000000 $a
/home/egtapi/lib/cs255lib.s:38     .text:0000000000000034 maddr
/home/egtapi/lib/cs255lib.s:38     .text:0000000000000034 $d
/home/egtapi/lib/cs255lib.s:54     .text:0000000000000038 $a
/home/egtapi/lib/cs255lib.s:62     .text:000000000000004c printLoop
/home/egtapi/lib/cs255lib.s:76     .text:000000000000006c printDone
/home/egtapi/lib/cs255lib.s:91     .text:000000000000008c $d

NO UNDEFINED SYMBOLS
