   1              	/* --------------------------------------------
   2              	   demo.s: recursive insert at tail of list
   3              	   -------------------------------------------- */
   4              		.global main, Stop, CodeEnd, DataStart, DataEnd
   5              		.global head, ptr, Insert
   6              	
   7              	main:
   8              		// head = Insert(head, ptr)
   9              		// pass ptr
  10 0000 000000E3 		movw r0, #:lower16:ptr
  11 0004 000040E3 		movt r0, #:upper16:ptr
  12 0008 000090E5 		ldr  r0, [r0]		//r0 = ptr
  13 000c 04002DE5 		push {r0}
  14              		
  15              		// pass head
  16 0010 000000E3 	        movw r0, #:lower16:head
  17 0014 000040E3 	        movt r0, #:upper16:head
  18 0018 000090E5 	        ldr  r0, [r0]           //r0 = head
  19 001c 04002DE5 	        push {r0}
  20              	
  21 0020 FEFFFFEB 		bl  Insert
  22 0024 08D08DE2 		add sp, sp, #8
  23              	
  24 0028 000000E3 		movw r0, #:lower16:head
  25 002c 000040E3 	        movt r0, #:upper16:head
  26 0030 00A080E5 		str  r10, [r0]		// head = Insert(head, ptr)
  27              	
  28              	Stop:
  29 0034 0000A0E1 	    	nop
  30              	
  31              	// Return value in r10
  32              	Insert:
  33              		// Prelude
  34 0038 04E02DE5 		push {lr}
  35 003c 04B02DE5 		push {fp}
  36 0040 0DB0A0E1 		mov  fp, sp
  37 0044 00D04DE2 		sub  sp, sp, #0
  38              	
  39              		//Body
  40 0048 08009BE5 		ldr  r0, [fp, #8]
  41 004c 000050E3 		cmp  r0, #0
  42 0050 0400001A 		bne  else
  43              	
  44 0054 0000A0E3 		mov  r0, #0		//r0=null
  45 0058 0C109BE5 		ldr  r1, [fp, #12]
  46 005c 040081E5 		str  r0, [r1, #4]	// e.next = null
  47              	
  48 0060 0CA09BE5 		ldr  r10, [fp, #12]
  49 0064 090000EA 		b    postlude
  50              	
  51              	else:
  52              		// call insert(head.next, e)
  53 0068 0C009BE5 		ldr  r0, [fp,#12]
  54 006c 04002DE5 		push {r0}
  55              	
  56 0070 08009BE5 		ldr  r0, [fp,#8]
  57 0074 040090E5 		ldr  r0, [r0, #4]
  58 0078 04002DE5 		push {r0}
  59              	
  60 007c FEFFFFEB 		bl   Insert
  61 0080 08D08DE2 		add  sp, sp, #8
  62              	
  63 0084 08009BE5 		ldr  r0, [fp, #8]	// r0 = head
  64 0088 04A080E5 		str  r10,[r0, #4]       // head.next
  65              	
  66              	
  67 008c 08A09BE5 		ldr  r10, [fp, #8]	// r10 = head
  68              	
  69              		// Postlude
  70              	postlude:
  71 0090 0BD0A0E1 		mov  sp, fp
  72 0094 04B09DE4 		pop  {fp}
  73 0098 04F09DE4 		pop  {pc}
  74              	
  75              	CodeEnd:
  76 009c 0000A0E1 	    	nop
  77              	
  78              	
  79              	/* ***********************************************
  80              	   Prepared variables (head, ptr, a linked list)
  81              	   *********************************************** */
  82              	
  83              		.data
  84              	DataStart:
  85              	
  86 0000 08000000 	head:   .4byte p0	// head = address of first list elem
  87              				// head->[11]->[22]->[33]->[44]->[55]
  88              	
  89 0004 30000000 	ptr:	.4byte p9	// ptr points to list elem to insert
  90              	
  91              	// list structure is: [int value, next]
  92 0008 0B000000 	p0: .4byte  11, p3	// p0 contains [11, p3]
  92      20000000 
  93 0010 21000000 	p1: .4byte  33, p2	// p1 contains [33, p2]
  93      18000000 
  94 0018 2C000000 	p2: .4byte  44, p4	// p2 contains [44, p4]
  94      28000000 
  95 0020 16000000 	p3: .4byte  22, p1	// p3 contains [22, p1]
  95      10000000 
  96 0028 37000000 	p4: .4byte  55, 0	// p4 contains [55, 0]
  96      00000000 
  97              	
  98 0030 63000000 	p9: .4byte  99, 0	// p9 contains [99, 0]
  98      00000000 
  99              	
 100              	DataEnd:
 101              		.end
DEFINED SYMBOLS
/home/cs255001/cs255/demo/9-list-recursion/demo.s:7      .text:0000000000000000 main
/home/cs255001/cs255/demo/9-list-recursion/demo.s:28     .text:0000000000000034 Stop
/home/cs255001/cs255/demo/9-list-recursion/demo.s:75     .text:000000000000009c CodeEnd
/home/cs255001/cs255/demo/9-list-recursion/demo.s:84     .data:0000000000000000 DataStart
/home/cs255001/cs255/demo/9-list-recursion/demo.s:100    .data:0000000000000038 DataEnd
/home/cs255001/cs255/demo/9-list-recursion/demo.s:86     .data:0000000000000000 head
/home/cs255001/cs255/demo/9-list-recursion/demo.s:89     .data:0000000000000004 ptr
/home/cs255001/cs255/demo/9-list-recursion/demo.s:32     .text:0000000000000038 Insert
/home/cs255001/cs255/demo/9-list-recursion/demo.s:10     .text:0000000000000000 $a
/home/cs255001/cs255/demo/9-list-recursion/demo.s:51     .text:0000000000000068 else
/home/cs255001/cs255/demo/9-list-recursion/demo.s:70     .text:0000000000000090 postlude
/home/cs255001/cs255/demo/9-list-recursion/demo.s:92     .data:0000000000000008 p0
/home/cs255001/cs255/demo/9-list-recursion/demo.s:98     .data:0000000000000030 p9
/home/cs255001/cs255/demo/9-list-recursion/demo.s:95     .data:0000000000000020 p3
/home/cs255001/cs255/demo/9-list-recursion/demo.s:93     .data:0000000000000010 p1
/home/cs255001/cs255/demo/9-list-recursion/demo.s:94     .data:0000000000000018 p2
/home/cs255001/cs255/demo/9-list-recursion/demo.s:96     .data:0000000000000028 p4

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
