ls.asm 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997
  1. _ls: file format elf32-littlearm
  2. Disassembly of section .text:
  3. 00000000 <main>:
  4. int
  5. main(int argc, char *argv[])
  6. {
  7. int i;
  8. if(argc < 2){
  9. 0: e3500001 cmp r0, #1
  10. close(fd);
  11. }
  12. int
  13. main(int argc, char *argv[])
  14. {
  15. 4: e92d4878 push {r3, r4, r5, r6, fp, lr}
  16. 8: e1a04000 mov r4, r0
  17. c: e28db014 add fp, sp, #20
  18. int i;
  19. if(argc < 2){
  20. ls(".");
  21. exit();
  22. 10: c1a06001 movgt r6, r1
  23. int
  24. main(int argc, char *argv[])
  25. {
  26. int i;
  27. if(argc < 2){
  28. 14: c3a05001 movgt r5, #1
  29. 18: da000005 ble 34 <main+0x34>
  30. ls(".");
  31. exit();
  32. }
  33. for(i=1; i<argc; i++)
  34. ls(argv[i]);
  35. 1c: e5b60004 ldr r0, [r6, #4]!
  36. if(argc < 2){
  37. ls(".");
  38. exit();
  39. }
  40. for(i=1; i<argc; i++)
  41. 20: e2855001 add r5, r5, #1
  42. ls(argv[i]);
  43. 24: eb000030 bl ec <ls>
  44. if(argc < 2){
  45. ls(".");
  46. exit();
  47. }
  48. for(i=1; i<argc; i++)
  49. 28: e1550004 cmp r5, r4
  50. 2c: 1afffffa bne 1c <main+0x1c>
  51. ls(argv[i]);
  52. exit();
  53. 30: eb00013e bl 530 <exit>
  54. main(int argc, char *argv[])
  55. {
  56. int i;
  57. if(argc < 2){
  58. ls(".");
  59. 34: e59f0004 ldr r0, [pc, #4] ; 40 <main+0x40>
  60. 38: eb00002b bl ec <ls>
  61. exit();
  62. 3c: eb00013b bl 530 <exit>
  63. 40: 00000db0 .word 0x00000db0
  64. 00000044 <fmtname>:
  65. #include "user.h"
  66. #include "fs.h"
  67. char*
  68. fmtname(char *path)
  69. {
  70. 44: e92d4878 push {r3, r4, r5, r6, fp, lr}
  71. 48: e28db014 add fp, sp, #20
  72. 4c: e1a05000 mov r5, r0
  73. static char buf[DIRSIZ+1];
  74. char *p;
  75. // Find first character after last slash.
  76. for(p=path+strlen(path); p >= path && *p != '/'; p--)
  77. 50: eb0000ab bl 304 <strlen>
  78. 54: e0954000 adds r4, r5, r0
  79. 58: 2a00000a bcs 88 <fmtname+0x44>
  80. 5c: e7d53000 ldrb r3, [r5, r0]
  81. 60: e353002f cmp r3, #47 ; 0x2f
  82. 64: 0a000007 beq 88 <fmtname+0x44>
  83. 68: e1a03004 mov r3, r4
  84. 6c: ea000002 b 7c <fmtname+0x38>
  85. 70: e5732001 ldrb r2, [r3, #-1]!
  86. 74: e352002f cmp r2, #47 ; 0x2f
  87. 78: 0a000002 beq 88 <fmtname+0x44>
  88. 7c: e2444001 sub r4, r4, #1
  89. 80: e1550004 cmp r5, r4
  90. 84: 9afffff9 bls 70 <fmtname+0x2c>
  91. ;
  92. p++;
  93. 88: e2844001 add r4, r4, #1
  94. // Return blank-padded name.
  95. if(strlen(p) >= DIRSIZ)
  96. 8c: e1a00004 mov r0, r4
  97. 90: eb00009b bl 304 <strlen>
  98. 94: e350000d cmp r0, #13
  99. 98: 8a000010 bhi e0 <fmtname+0x9c>
  100. return p;
  101. memmove(buf, p, strlen(p));
  102. 9c: e1a00004 mov r0, r4
  103. a0: eb000097 bl 304 <strlen>
  104. a4: e59f503c ldr r5, [pc, #60] ; e8 <fmtname+0xa4>
  105. a8: e1a01004 mov r1, r4
  106. ac: e1a02000 mov r2, r0
  107. b0: e1a00005 mov r0, r5
  108. b4: eb000103 bl 4c8 <memmove>
  109. memset(buf+strlen(p), ' ', DIRSIZ-strlen(p));
  110. b8: e1a00004 mov r0, r4
  111. bc: eb000090 bl 304 <strlen>
  112. c0: e1a06000 mov r6, r0
  113. c4: e1a00004 mov r0, r4
  114. c8: eb00008d bl 304 <strlen>
  115. cc: e3a01020 mov r1, #32
  116. return buf;
  117. d0: e1a04005 mov r4, r5
  118. // Return blank-padded name.
  119. if(strlen(p) >= DIRSIZ)
  120. return p;
  121. memmove(buf, p, strlen(p));
  122. memset(buf+strlen(p), ' ', DIRSIZ-strlen(p));
  123. d4: e260200e rsb r2, r0, #14
  124. d8: e0850006 add r0, r5, r6
  125. dc: eb000098 bl 344 <memset>
  126. return buf;
  127. }
  128. e0: e1a00004 mov r0, r4
  129. e4: e8bd8878 pop {r3, r4, r5, r6, fp, pc}
  130. e8: 00000dd0 .word 0x00000dd0
  131. 000000ec <ls>:
  132. void
  133. ls(char *path)
  134. {
  135. ec: e92d49f0 push {r4, r5, r6, r7, r8, fp, lr}
  136. f0: e28db018 add fp, sp, #24
  137. f4: e24ddf8d sub sp, sp, #564 ; 0x234
  138. char buf[512], *p;
  139. int fd;
  140. struct dirent de;
  141. struct stat st;
  142. if((fd = open(path, 0)) < 0){
  143. f8: e3a01000 mov r1, #0
  144. return buf;
  145. }
  146. void
  147. ls(char *path)
  148. {
  149. fc: e1a06000 mov r6, r0
  150. char buf[512], *p;
  151. int fd;
  152. struct dirent de;
  153. struct stat st;
  154. if((fd = open(path, 0)) < 0){
  155. 100: eb000172 bl 6d0 <open>
  156. 104: e2504000 subs r4, r0, #0
  157. 108: ba00004b blt 23c <ls+0x150>
  158. printf(2, "ls: cannot open %s\n", path);
  159. return;
  160. }
  161. if(fstat(fd, &st) < 0){
  162. 10c: e24b1040 sub r1, fp, #64 ; 0x40
  163. 110: eb000195 bl 76c <fstat>
  164. 114: e3500000 cmp r0, #0
  165. 118: ba000051 blt 264 <ls+0x178>
  166. printf(2, "ls: cannot stat %s\n", path);
  167. close(fd);
  168. return;
  169. }
  170. switch(st.type){
  171. 11c: e15b54f0 ldrsh r5, [fp, #-64] ; 0xffffffc0
  172. 120: e3550001 cmp r5, #1
  173. 124: 0a000011 beq 170 <ls+0x84>
  174. 128: e3550002 cmp r5, #2
  175. 12c: 0a000003 beq 140 <ls+0x54>
  176. }
  177. printf(1, "%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size);
  178. }
  179. break;
  180. }
  181. close(fd);
  182. 130: e1a00004 mov r0, r4
  183. 134: eb00013e bl 634 <close>
  184. }
  185. 138: e24bd018 sub sp, fp, #24
  186. 13c: e8bd89f0 pop {r4, r5, r6, r7, r8, fp, pc}
  187. return;
  188. }
  189. switch(st.type){
  190. case T_FILE:
  191. printf(1, "%s %d %d %d\n", fmtname(path), st.type, st.ino, st.size);
  192. 140: e1a00006 mov r0, r6
  193. 144: ebffffbe bl 44 <fmtname>
  194. 148: e51bc038 ldr ip, [fp, #-56] ; 0x38
  195. 14c: e15b34f0 ldrsh r3, [fp, #-64] ; 0xffffffc0
  196. 150: e58dc000 str ip, [sp]
  197. 154: e51bc030 ldr ip, [fp, #-48] ; 0x30
  198. 158: e59f1120 ldr r1, [pc, #288] ; 280 <ls+0x194>
  199. 15c: e58dc004 str ip, [sp, #4]
  200. 160: e1a02000 mov r2, r0
  201. 164: e3a00001 mov r0, #1
  202. 168: eb000243 bl a7c <printf>
  203. break;
  204. 16c: eaffffef b 130 <ls+0x44>
  205. case T_DIR:
  206. if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){
  207. 170: e1a00006 mov r0, r6
  208. 174: eb000062 bl 304 <strlen>
  209. 178: e2800010 add r0, r0, #16
  210. 17c: e3500c02 cmp r0, #512 ; 0x200
  211. 180: 8a000029 bhi 22c <ls+0x140>
  212. printf(1, "ls: path too long\n");
  213. break;
  214. }
  215. strcpy(buf, path);
  216. 184: e24b5d09 sub r5, fp, #576 ; 0x240
  217. 188: e1a01006 mov r1, r6
  218. 18c: e1a00005 mov r0, r5
  219. 190: eb00003e bl 290 <strcpy>
  220. p = buf+strlen(buf);
  221. 194: e1a00005 mov r0, r5
  222. 198: eb000059 bl 304 <strlen>
  223. *p++ = '/';
  224. while(read(fd, &de, sizeof(de)) == sizeof(de)){
  225. if(de.inum == 0)
  226. continue;
  227. memmove(p, de.name, DIRSIZ);
  228. p[DIRSIZ] = 0;
  229. 19c: e3a08000 mov r8, #0
  230. printf(1, "ls: path too long\n");
  231. break;
  232. }
  233. strcpy(buf, path);
  234. p = buf+strlen(buf);
  235. *p++ = '/';
  236. 1a0: e3a0302f mov r3, #47 ; 0x2f
  237. if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){
  238. printf(1, "ls: path too long\n");
  239. break;
  240. }
  241. strcpy(buf, path);
  242. p = buf+strlen(buf);
  243. 1a4: e0856000 add r6, r5, r0
  244. *p++ = '/';
  245. 1a8: e2867001 add r7, r6, #1
  246. 1ac: e7c53000 strb r3, [r5, r0]
  247. while(read(fd, &de, sizeof(de)) == sizeof(de)){
  248. 1b0: e24b102c sub r1, fp, #44 ; 0x2c
  249. 1b4: e1a00004 mov r0, r4
  250. 1b8: e3a02010 mov r2, #16
  251. 1bc: eb000102 bl 5cc <read>
  252. 1c0: e3500010 cmp r0, #16
  253. 1c4: 1affffd9 bne 130 <ls+0x44>
  254. if(de.inum == 0)
  255. 1c8: e15b32bc ldrh r3, [fp, #-44] ; 0xffffffd4
  256. 1cc: e3530000 cmp r3, #0
  257. 1d0: 0afffff6 beq 1b0 <ls+0xc4>
  258. continue;
  259. memmove(p, de.name, DIRSIZ);
  260. 1d4: e3a0200e mov r2, #14
  261. 1d8: e24b102a sub r1, fp, #42 ; 0x2a
  262. 1dc: e1a00007 mov r0, r7
  263. 1e0: eb0000b8 bl 4c8 <memmove>
  264. p[DIRSIZ] = 0;
  265. if(stat(buf, &st) < 0){
  266. 1e4: e24b1040 sub r1, fp, #64 ; 0x40
  267. 1e8: e1a00005 mov r0, r5
  268. *p++ = '/';
  269. while(read(fd, &de, sizeof(de)) == sizeof(de)){
  270. if(de.inum == 0)
  271. continue;
  272. memmove(p, de.name, DIRSIZ);
  273. p[DIRSIZ] = 0;
  274. 1ec: e5c6800f strb r8, [r6, #15]
  275. if(stat(buf, &st) < 0){
  276. 1f0: eb000090 bl 438 <stat>
  277. 1f4: e3500000 cmp r0, #0
  278. printf(1, "ls: cannot stat %s\n", buf);
  279. continue;
  280. }
  281. printf(1, "%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size);
  282. 1f8: e1a00005 mov r0, r5
  283. while(read(fd, &de, sizeof(de)) == sizeof(de)){
  284. if(de.inum == 0)
  285. continue;
  286. memmove(p, de.name, DIRSIZ);
  287. p[DIRSIZ] = 0;
  288. if(stat(buf, &st) < 0){
  289. 1fc: ba000013 blt 250 <ls+0x164>
  290. printf(1, "ls: cannot stat %s\n", buf);
  291. continue;
  292. }
  293. printf(1, "%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size);
  294. 200: ebffff8f bl 44 <fmtname>
  295. 204: e51bc038 ldr ip, [fp, #-56] ; 0x38
  296. 208: e15b34f0 ldrsh r3, [fp, #-64] ; 0xffffffc0
  297. 20c: e58dc000 str ip, [sp]
  298. 210: e51bc030 ldr ip, [fp, #-48] ; 0x30
  299. 214: e59f1064 ldr r1, [pc, #100] ; 280 <ls+0x194>
  300. 218: e58dc004 str ip, [sp, #4]
  301. 21c: e1a02000 mov r2, r0
  302. 220: e3a00001 mov r0, #1
  303. 224: eb000214 bl a7c <printf>
  304. 228: eaffffe0 b 1b0 <ls+0xc4>
  305. printf(1, "%s %d %d %d\n", fmtname(path), st.type, st.ino, st.size);
  306. break;
  307. case T_DIR:
  308. if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){
  309. printf(1, "ls: path too long\n");
  310. 22c: e1a00005 mov r0, r5
  311. 230: e59f104c ldr r1, [pc, #76] ; 284 <ls+0x198>
  312. 234: eb000210 bl a7c <printf>
  313. break;
  314. 238: eaffffbc b 130 <ls+0x44>
  315. int fd;
  316. struct dirent de;
  317. struct stat st;
  318. if((fd = open(path, 0)) < 0){
  319. printf(2, "ls: cannot open %s\n", path);
  320. 23c: e3a00002 mov r0, #2
  321. 240: e59f1040 ldr r1, [pc, #64] ; 288 <ls+0x19c>
  322. 244: e1a02006 mov r2, r6
  323. 248: eb00020b bl a7c <printf>
  324. return;
  325. 24c: eaffffb9 b 138 <ls+0x4c>
  326. if(de.inum == 0)
  327. continue;
  328. memmove(p, de.name, DIRSIZ);
  329. p[DIRSIZ] = 0;
  330. if(stat(buf, &st) < 0){
  331. printf(1, "ls: cannot stat %s\n", buf);
  332. 250: e3a00001 mov r0, #1
  333. 254: e59f1030 ldr r1, [pc, #48] ; 28c <ls+0x1a0>
  334. 258: e1a02005 mov r2, r5
  335. 25c: eb000206 bl a7c <printf>
  336. continue;
  337. 260: eaffffd2 b 1b0 <ls+0xc4>
  338. printf(2, "ls: cannot open %s\n", path);
  339. return;
  340. }
  341. if(fstat(fd, &st) < 0){
  342. printf(2, "ls: cannot stat %s\n", path);
  343. 264: e59f1020 ldr r1, [pc, #32] ; 28c <ls+0x1a0>
  344. 268: e1a02006 mov r2, r6
  345. 26c: e3a00002 mov r0, #2
  346. 270: eb000201 bl a7c <printf>
  347. close(fd);
  348. 274: e1a00004 mov r0, r4
  349. 278: eb0000ed bl 634 <close>
  350. return;
  351. 27c: eaffffad b 138 <ls+0x4c>
  352. 280: 00000d8c .word 0x00000d8c
  353. 284: 00000d9c .word 0x00000d9c
  354. 288: 00000d64 .word 0x00000d64
  355. 28c: 00000d78 .word 0x00000d78
  356. 00000290 <strcpy>:
  357. #include "user.h"
  358. #include "arm.h"
  359. char*
  360. strcpy(char *s, char *t)
  361. {
  362. 290: e52db004 push {fp} ; (str fp, [sp, #-4]!)
  363. char *os;
  364. os = s;
  365. while((*s++ = *t++) != 0)
  366. 294: e1a02000 mov r2, r0
  367. #include "user.h"
  368. #include "arm.h"
  369. char*
  370. strcpy(char *s, char *t)
  371. {
  372. 298: e28db000 add fp, sp, #0
  373. char *os;
  374. os = s;
  375. while((*s++ = *t++) != 0)
  376. 29c: e4d13001 ldrb r3, [r1], #1
  377. 2a0: e3530000 cmp r3, #0
  378. 2a4: e4c23001 strb r3, [r2], #1
  379. 2a8: 1afffffb bne 29c <strcpy+0xc>
  380. ;
  381. return os;
  382. }
  383. 2ac: e28bd000 add sp, fp, #0
  384. 2b0: e8bd0800 pop {fp}
  385. 2b4: e12fff1e bx lr
  386. 000002b8 <strcmp>:
  387. int
  388. strcmp(const char *p, const char *q)
  389. {
  390. 2b8: e52db004 push {fp} ; (str fp, [sp, #-4]!)
  391. 2bc: e28db000 add fp, sp, #0
  392. while(*p && *p == *q)
  393. 2c0: e5d03000 ldrb r3, [r0]
  394. 2c4: e5d12000 ldrb r2, [r1]
  395. 2c8: e3530000 cmp r3, #0
  396. 2cc: 1a000004 bne 2e4 <strcmp+0x2c>
  397. 2d0: ea000005 b 2ec <strcmp+0x34>
  398. 2d4: e5f03001 ldrb r3, [r0, #1]!
  399. 2d8: e3530000 cmp r3, #0
  400. 2dc: 0a000006 beq 2fc <strcmp+0x44>
  401. 2e0: e5f12001 ldrb r2, [r1, #1]!
  402. 2e4: e1530002 cmp r3, r2
  403. 2e8: 0afffff9 beq 2d4 <strcmp+0x1c>
  404. p++, q++;
  405. return (uchar)*p - (uchar)*q;
  406. }
  407. 2ec: e0620003 rsb r0, r2, r3
  408. 2f0: e28bd000 add sp, fp, #0
  409. 2f4: e8bd0800 pop {fp}
  410. 2f8: e12fff1e bx lr
  411. }
  412. int
  413. strcmp(const char *p, const char *q)
  414. {
  415. while(*p && *p == *q)
  416. 2fc: e5d12001 ldrb r2, [r1, #1]
  417. 300: eafffff9 b 2ec <strcmp+0x34>
  418. 00000304 <strlen>:
  419. return (uchar)*p - (uchar)*q;
  420. }
  421. uint
  422. strlen(char *s)
  423. {
  424. 304: e52db004 push {fp} ; (str fp, [sp, #-4]!)
  425. 308: e28db000 add fp, sp, #0
  426. int n;
  427. for(n = 0; s[n]; n++)
  428. 30c: e5d03000 ldrb r3, [r0]
  429. 310: e3530000 cmp r3, #0
  430. 314: 01a00003 moveq r0, r3
  431. 318: 0a000006 beq 338 <strlen+0x34>
  432. 31c: e1a02000 mov r2, r0
  433. 320: e3a03000 mov r3, #0
  434. 324: e5f21001 ldrb r1, [r2, #1]!
  435. 328: e2833001 add r3, r3, #1
  436. 32c: e1a00003 mov r0, r3
  437. 330: e3510000 cmp r1, #0
  438. 334: 1afffffa bne 324 <strlen+0x20>
  439. ;
  440. return n;
  441. }
  442. 338: e28bd000 add sp, fp, #0
  443. 33c: e8bd0800 pop {fp}
  444. 340: e12fff1e bx lr
  445. 00000344 <memset>:
  446. memset(void *dst, int c, uint n)
  447. {
  448. char *p=dst;
  449. u32 rc=n;
  450. while (rc-- > 0) *p++ = c;
  451. 344: e3520000 cmp r2, #0
  452. return n;
  453. }
  454. void*
  455. memset(void *dst, int c, uint n)
  456. {
  457. 348: e52db004 push {fp} ; (str fp, [sp, #-4]!)
  458. 34c: e28db000 add fp, sp, #0
  459. char *p=dst;
  460. u32 rc=n;
  461. while (rc-- > 0) *p++ = c;
  462. 350: 0a000006 beq 370 <memset+0x2c>
  463. 354: e6ef1071 uxtb r1, r1
  464. 358: e1a03002 mov r3, r2
  465. }
  466. void*
  467. memset(void *dst, int c, uint n)
  468. {
  469. char *p=dst;
  470. 35c: e1a0c000 mov ip, r0
  471. u32 rc=n;
  472. while (rc-- > 0) *p++ = c;
  473. 360: e2533001 subs r3, r3, #1
  474. 364: e4cc1001 strb r1, [ip], #1
  475. 368: 1afffffc bne 360 <memset+0x1c>
  476. 36c: e0800002 add r0, r0, r2
  477. return (void *)p;
  478. }
  479. 370: e28bd000 add sp, fp, #0
  480. 374: e8bd0800 pop {fp}
  481. 378: e12fff1e bx lr
  482. 0000037c <strchr>:
  483. char*
  484. strchr(const char *s, char c)
  485. {
  486. 37c: e52db004 push {fp} ; (str fp, [sp, #-4]!)
  487. 380: e28db000 add fp, sp, #0
  488. for(; *s; s++)
  489. 384: e5d03000 ldrb r3, [r0]
  490. 388: e3530000 cmp r3, #0
  491. 38c: 1a000004 bne 3a4 <strchr+0x28>
  492. 390: ea000008 b 3b8 <strchr+0x3c>
  493. 394: e5d03001 ldrb r3, [r0, #1]
  494. 398: e2800001 add r0, r0, #1
  495. 39c: e3530000 cmp r3, #0
  496. 3a0: 0a000004 beq 3b8 <strchr+0x3c>
  497. if(*s == c)
  498. 3a4: e1530001 cmp r3, r1
  499. 3a8: 1afffff9 bne 394 <strchr+0x18>
  500. return (char*)s;
  501. return 0;
  502. }
  503. 3ac: e28bd000 add sp, fp, #0
  504. 3b0: e8bd0800 pop {fp}
  505. 3b4: e12fff1e bx lr
  506. strchr(const char *s, char c)
  507. {
  508. for(; *s; s++)
  509. if(*s == c)
  510. return (char*)s;
  511. return 0;
  512. 3b8: e1a00003 mov r0, r3
  513. 3bc: eafffffa b 3ac <strchr+0x30>
  514. 000003c0 <gets>:
  515. }
  516. char*
  517. gets(char *buf, int max)
  518. {
  519. 3c0: e92d49f0 push {r4, r5, r6, r7, r8, fp, lr}
  520. 3c4: e28db018 add fp, sp, #24
  521. 3c8: e24dd00c sub sp, sp, #12
  522. 3cc: e1a08000 mov r8, r0
  523. 3d0: e1a07001 mov r7, r1
  524. int i, cc;
  525. char c;
  526. for(i=0; i+1 < max; ){
  527. 3d4: e1a06000 mov r6, r0
  528. 3d8: e3a05000 mov r5, #0
  529. 3dc: ea000008 b 404 <gets+0x44>
  530. cc = read(0, &c, 1);
  531. 3e0: eb000079 bl 5cc <read>
  532. if(cc < 1)
  533. 3e4: e3500000 cmp r0, #0
  534. 3e8: da00000b ble 41c <gets+0x5c>
  535. break;
  536. buf[i++] = c;
  537. 3ec: e55b301d ldrb r3, [fp, #-29]
  538. if(c == '\n' || c == '\r')
  539. 3f0: e1a05004 mov r5, r4
  540. 3f4: e353000a cmp r3, #10
  541. 3f8: 1353000d cmpne r3, #13
  542. for(i=0; i+1 < max; ){
  543. cc = read(0, &c, 1);
  544. if(cc < 1)
  545. break;
  546. buf[i++] = c;
  547. 3fc: e4c63001 strb r3, [r6], #1
  548. if(c == '\n' || c == '\r')
  549. 400: 0a00000a beq 430 <gets+0x70>
  550. {
  551. int i, cc;
  552. char c;
  553. for(i=0; i+1 < max; ){
  554. cc = read(0, &c, 1);
  555. 404: e3a02001 mov r2, #1
  556. gets(char *buf, int max)
  557. {
  558. int i, cc;
  559. char c;
  560. for(i=0; i+1 < max; ){
  561. 408: e0854002 add r4, r5, r2
  562. 40c: e1540007 cmp r4, r7
  563. cc = read(0, &c, 1);
  564. 410: e3a00000 mov r0, #0
  565. 414: e24b101d sub r1, fp, #29
  566. gets(char *buf, int max)
  567. {
  568. int i, cc;
  569. char c;
  570. for(i=0; i+1 < max; ){
  571. 418: bafffff0 blt 3e0 <gets+0x20>
  572. break;
  573. buf[i++] = c;
  574. if(c == '\n' || c == '\r')
  575. break;
  576. }
  577. buf[i] = '\0';
  578. 41c: e3a03000 mov r3, #0
  579. 420: e7c83005 strb r3, [r8, r5]
  580. return buf;
  581. }
  582. 424: e1a00008 mov r0, r8
  583. 428: e24bd018 sub sp, fp, #24
  584. 42c: e8bd89f0 pop {r4, r5, r6, r7, r8, fp, pc}
  585. gets(char *buf, int max)
  586. {
  587. int i, cc;
  588. char c;
  589. for(i=0; i+1 < max; ){
  590. 430: e1a05004 mov r5, r4
  591. 434: eafffff8 b 41c <gets+0x5c>
  592. 00000438 <stat>:
  593. return buf;
  594. }
  595. int
  596. stat(char *n, struct stat *st)
  597. {
  598. 438: e92d4830 push {r4, r5, fp, lr}
  599. 43c: e1a05001 mov r5, r1
  600. 440: e28db00c add fp, sp, #12
  601. int fd;
  602. int r;
  603. fd = open(n, O_RDONLY);
  604. 444: e3a01000 mov r1, #0
  605. 448: eb0000a0 bl 6d0 <open>
  606. if(fd < 0)
  607. 44c: e2504000 subs r4, r0, #0
  608. return -1;
  609. 450: b3e05000 mvnlt r5, #0
  610. {
  611. int fd;
  612. int r;
  613. fd = open(n, O_RDONLY);
  614. if(fd < 0)
  615. 454: ba000004 blt 46c <stat+0x34>
  616. return -1;
  617. r = fstat(fd, st);
  618. 458: e1a01005 mov r1, r5
  619. 45c: eb0000c2 bl 76c <fstat>
  620. 460: e1a05000 mov r5, r0
  621. close(fd);
  622. 464: e1a00004 mov r0, r4
  623. 468: eb000071 bl 634 <close>
  624. return r;
  625. }
  626. 46c: e1a00005 mov r0, r5
  627. 470: e8bd8830 pop {r4, r5, fp, pc}
  628. 00000474 <atoi>:
  629. int
  630. atoi(const char *s)
  631. {
  632. 474: e52db004 push {fp} ; (str fp, [sp, #-4]!)
  633. 478: e28db000 add fp, sp, #0
  634. int n;
  635. n = 0;
  636. while('0' <= *s && *s <= '9')
  637. 47c: e5d03000 ldrb r3, [r0]
  638. 480: e2432030 sub r2, r3, #48 ; 0x30
  639. 484: e6ef2072 uxtb r2, r2
  640. 488: e3520009 cmp r2, #9
  641. int
  642. atoi(const char *s)
  643. {
  644. int n;
  645. n = 0;
  646. 48c: 83a00000 movhi r0, #0
  647. while('0' <= *s && *s <= '9')
  648. 490: 8a000009 bhi 4bc <atoi+0x48>
  649. 494: e1a02000 mov r2, r0
  650. int
  651. atoi(const char *s)
  652. {
  653. int n;
  654. n = 0;
  655. 498: e3a00000 mov r0, #0
  656. while('0' <= *s && *s <= '9')
  657. n = n*10 + *s++ - '0';
  658. 49c: e0800100 add r0, r0, r0, lsl #2
  659. 4a0: e0830080 add r0, r3, r0, lsl #1
  660. atoi(const char *s)
  661. {
  662. int n;
  663. n = 0;
  664. while('0' <= *s && *s <= '9')
  665. 4a4: e5f23001 ldrb r3, [r2, #1]!
  666. n = n*10 + *s++ - '0';
  667. 4a8: e2400030 sub r0, r0, #48 ; 0x30
  668. atoi(const char *s)
  669. {
  670. int n;
  671. n = 0;
  672. while('0' <= *s && *s <= '9')
  673. 4ac: e2431030 sub r1, r3, #48 ; 0x30
  674. 4b0: e6ef1071 uxtb r1, r1
  675. 4b4: e3510009 cmp r1, #9
  676. 4b8: 9afffff7 bls 49c <atoi+0x28>
  677. n = n*10 + *s++ - '0';
  678. return n;
  679. }
  680. 4bc: e28bd000 add sp, fp, #0
  681. 4c0: e8bd0800 pop {fp}
  682. 4c4: e12fff1e bx lr
  683. 000004c8 <memmove>:
  684. {
  685. char *dst, *src;
  686. dst = vdst;
  687. src = vsrc;
  688. while(n-- > 0)
  689. 4c8: e3520000 cmp r2, #0
  690. return n;
  691. }
  692. void*
  693. memmove(void *vdst, void *vsrc, int n)
  694. {
  695. 4cc: e52db004 push {fp} ; (str fp, [sp, #-4]!)
  696. 4d0: e28db000 add fp, sp, #0
  697. char *dst, *src;
  698. dst = vdst;
  699. src = vsrc;
  700. while(n-- > 0)
  701. 4d4: da000005 ble 4f0 <memmove+0x28>
  702. n = n*10 + *s++ - '0';
  703. return n;
  704. }
  705. void*
  706. memmove(void *vdst, void *vsrc, int n)
  707. 4d8: e0802002 add r2, r0, r2
  708. {
  709. char *dst, *src;
  710. dst = vdst;
  711. 4dc: e1a03000 mov r3, r0
  712. src = vsrc;
  713. while(n-- > 0)
  714. *dst++ = *src++;
  715. 4e0: e4d1c001 ldrb ip, [r1], #1
  716. 4e4: e4c3c001 strb ip, [r3], #1
  717. {
  718. char *dst, *src;
  719. dst = vdst;
  720. src = vsrc;
  721. while(n-- > 0)
  722. 4e8: e1530002 cmp r3, r2
  723. 4ec: 1afffffb bne 4e0 <memmove+0x18>
  724. *dst++ = *src++;
  725. return vdst;
  726. }
  727. 4f0: e28bd000 add sp, fp, #0
  728. 4f4: e8bd0800 pop {fp}
  729. 4f8: e12fff1e bx lr
  730. 000004fc <fork>:
  731. 4fc: e92d4000 push {lr}
  732. 500: e92d0008 push {r3}
  733. 504: e92d0004 push {r2}
  734. 508: e92d0002 push {r1}
  735. 50c: e92d0001 push {r0}
  736. 510: e3a00001 mov r0, #1
  737. 514: ef000040 svc 0x00000040
  738. 518: e8bd0002 pop {r1}
  739. 51c: e8bd0002 pop {r1}
  740. 520: e8bd0004 pop {r2}
  741. 524: e8bd0008 pop {r3}
  742. 528: e8bd4000 pop {lr}
  743. 52c: e12fff1e bx lr
  744. 00000530 <exit>:
  745. 530: e92d4000 push {lr}
  746. 534: e92d0008 push {r3}
  747. 538: e92d0004 push {r2}
  748. 53c: e92d0002 push {r1}
  749. 540: e92d0001 push {r0}
  750. 544: e3a00002 mov r0, #2
  751. 548: ef000040 svc 0x00000040
  752. 54c: e8bd0002 pop {r1}
  753. 550: e8bd0002 pop {r1}
  754. 554: e8bd0004 pop {r2}
  755. 558: e8bd0008 pop {r3}
  756. 55c: e8bd4000 pop {lr}
  757. 560: e12fff1e bx lr
  758. 00000564 <wait>:
  759. 564: e92d4000 push {lr}
  760. 568: e92d0008 push {r3}
  761. 56c: e92d0004 push {r2}
  762. 570: e92d0002 push {r1}
  763. 574: e92d0001 push {r0}
  764. 578: e3a00003 mov r0, #3
  765. 57c: ef000040 svc 0x00000040
  766. 580: e8bd0002 pop {r1}
  767. 584: e8bd0002 pop {r1}
  768. 588: e8bd0004 pop {r2}
  769. 58c: e8bd0008 pop {r3}
  770. 590: e8bd4000 pop {lr}
  771. 594: e12fff1e bx lr
  772. 00000598 <pipe>:
  773. 598: e92d4000 push {lr}
  774. 59c: e92d0008 push {r3}
  775. 5a0: e92d0004 push {r2}
  776. 5a4: e92d0002 push {r1}
  777. 5a8: e92d0001 push {r0}
  778. 5ac: e3a00004 mov r0, #4
  779. 5b0: ef000040 svc 0x00000040
  780. 5b4: e8bd0002 pop {r1}
  781. 5b8: e8bd0002 pop {r1}
  782. 5bc: e8bd0004 pop {r2}
  783. 5c0: e8bd0008 pop {r3}
  784. 5c4: e8bd4000 pop {lr}
  785. 5c8: e12fff1e bx lr
  786. 000005cc <read>:
  787. 5cc: e92d4000 push {lr}
  788. 5d0: e92d0008 push {r3}
  789. 5d4: e92d0004 push {r2}
  790. 5d8: e92d0002 push {r1}
  791. 5dc: e92d0001 push {r0}
  792. 5e0: e3a00005 mov r0, #5
  793. 5e4: ef000040 svc 0x00000040
  794. 5e8: e8bd0002 pop {r1}
  795. 5ec: e8bd0002 pop {r1}
  796. 5f0: e8bd0004 pop {r2}
  797. 5f4: e8bd0008 pop {r3}
  798. 5f8: e8bd4000 pop {lr}
  799. 5fc: e12fff1e bx lr
  800. 00000600 <write>:
  801. 600: e92d4000 push {lr}
  802. 604: e92d0008 push {r3}
  803. 608: e92d0004 push {r2}
  804. 60c: e92d0002 push {r1}
  805. 610: e92d0001 push {r0}
  806. 614: e3a00010 mov r0, #16
  807. 618: ef000040 svc 0x00000040
  808. 61c: e8bd0002 pop {r1}
  809. 620: e8bd0002 pop {r1}
  810. 624: e8bd0004 pop {r2}
  811. 628: e8bd0008 pop {r3}
  812. 62c: e8bd4000 pop {lr}
  813. 630: e12fff1e bx lr
  814. 00000634 <close>:
  815. 634: e92d4000 push {lr}
  816. 638: e92d0008 push {r3}
  817. 63c: e92d0004 push {r2}
  818. 640: e92d0002 push {r1}
  819. 644: e92d0001 push {r0}
  820. 648: e3a00015 mov r0, #21
  821. 64c: ef000040 svc 0x00000040
  822. 650: e8bd0002 pop {r1}
  823. 654: e8bd0002 pop {r1}
  824. 658: e8bd0004 pop {r2}
  825. 65c: e8bd0008 pop {r3}
  826. 660: e8bd4000 pop {lr}
  827. 664: e12fff1e bx lr
  828. 00000668 <kill>:
  829. 668: e92d4000 push {lr}
  830. 66c: e92d0008 push {r3}
  831. 670: e92d0004 push {r2}
  832. 674: e92d0002 push {r1}
  833. 678: e92d0001 push {r0}
  834. 67c: e3a00006 mov r0, #6
  835. 680: ef000040 svc 0x00000040
  836. 684: e8bd0002 pop {r1}
  837. 688: e8bd0002 pop {r1}
  838. 68c: e8bd0004 pop {r2}
  839. 690: e8bd0008 pop {r3}
  840. 694: e8bd4000 pop {lr}
  841. 698: e12fff1e bx lr
  842. 0000069c <exec>:
  843. 69c: e92d4000 push {lr}
  844. 6a0: e92d0008 push {r3}
  845. 6a4: e92d0004 push {r2}
  846. 6a8: e92d0002 push {r1}
  847. 6ac: e92d0001 push {r0}
  848. 6b0: e3a00007 mov r0, #7
  849. 6b4: ef000040 svc 0x00000040
  850. 6b8: e8bd0002 pop {r1}
  851. 6bc: e8bd0002 pop {r1}
  852. 6c0: e8bd0004 pop {r2}
  853. 6c4: e8bd0008 pop {r3}
  854. 6c8: e8bd4000 pop {lr}
  855. 6cc: e12fff1e bx lr
  856. 000006d0 <open>:
  857. 6d0: e92d4000 push {lr}
  858. 6d4: e92d0008 push {r3}
  859. 6d8: e92d0004 push {r2}
  860. 6dc: e92d0002 push {r1}
  861. 6e0: e92d0001 push {r0}
  862. 6e4: e3a0000f mov r0, #15
  863. 6e8: ef000040 svc 0x00000040
  864. 6ec: e8bd0002 pop {r1}
  865. 6f0: e8bd0002 pop {r1}
  866. 6f4: e8bd0004 pop {r2}
  867. 6f8: e8bd0008 pop {r3}
  868. 6fc: e8bd4000 pop {lr}
  869. 700: e12fff1e bx lr
  870. 00000704 <mknod>:
  871. 704: e92d4000 push {lr}
  872. 708: e92d0008 push {r3}
  873. 70c: e92d0004 push {r2}
  874. 710: e92d0002 push {r1}
  875. 714: e92d0001 push {r0}
  876. 718: e3a00011 mov r0, #17
  877. 71c: ef000040 svc 0x00000040
  878. 720: e8bd0002 pop {r1}
  879. 724: e8bd0002 pop {r1}
  880. 728: e8bd0004 pop {r2}
  881. 72c: e8bd0008 pop {r3}
  882. 730: e8bd4000 pop {lr}
  883. 734: e12fff1e bx lr
  884. 00000738 <unlink>:
  885. 738: e92d4000 push {lr}
  886. 73c: e92d0008 push {r3}
  887. 740: e92d0004 push {r2}
  888. 744: e92d0002 push {r1}
  889. 748: e92d0001 push {r0}
  890. 74c: e3a00012 mov r0, #18
  891. 750: ef000040 svc 0x00000040
  892. 754: e8bd0002 pop {r1}
  893. 758: e8bd0002 pop {r1}
  894. 75c: e8bd0004 pop {r2}
  895. 760: e8bd0008 pop {r3}
  896. 764: e8bd4000 pop {lr}
  897. 768: e12fff1e bx lr
  898. 0000076c <fstat>:
  899. 76c: e92d4000 push {lr}
  900. 770: e92d0008 push {r3}
  901. 774: e92d0004 push {r2}
  902. 778: e92d0002 push {r1}
  903. 77c: e92d0001 push {r0}
  904. 780: e3a00008 mov r0, #8
  905. 784: ef000040 svc 0x00000040
  906. 788: e8bd0002 pop {r1}
  907. 78c: e8bd0002 pop {r1}
  908. 790: e8bd0004 pop {r2}
  909. 794: e8bd0008 pop {r3}
  910. 798: e8bd4000 pop {lr}
  911. 79c: e12fff1e bx lr
  912. 000007a0 <link>:
  913. 7a0: e92d4000 push {lr}
  914. 7a4: e92d0008 push {r3}
  915. 7a8: e92d0004 push {r2}
  916. 7ac: e92d0002 push {r1}
  917. 7b0: e92d0001 push {r0}
  918. 7b4: e3a00013 mov r0, #19
  919. 7b8: ef000040 svc 0x00000040
  920. 7bc: e8bd0002 pop {r1}
  921. 7c0: e8bd0002 pop {r1}
  922. 7c4: e8bd0004 pop {r2}
  923. 7c8: e8bd0008 pop {r3}
  924. 7cc: e8bd4000 pop {lr}
  925. 7d0: e12fff1e bx lr
  926. 000007d4 <mkdir>:
  927. 7d4: e92d4000 push {lr}
  928. 7d8: e92d0008 push {r3}
  929. 7dc: e92d0004 push {r2}
  930. 7e0: e92d0002 push {r1}
  931. 7e4: e92d0001 push {r0}
  932. 7e8: e3a00014 mov r0, #20
  933. 7ec: ef000040 svc 0x00000040
  934. 7f0: e8bd0002 pop {r1}
  935. 7f4: e8bd0002 pop {r1}
  936. 7f8: e8bd0004 pop {r2}
  937. 7fc: e8bd0008 pop {r3}
  938. 800: e8bd4000 pop {lr}
  939. 804: e12fff1e bx lr
  940. 00000808 <chdir>:
  941. 808: e92d4000 push {lr}
  942. 80c: e92d0008 push {r3}
  943. 810: e92d0004 push {r2}
  944. 814: e92d0002 push {r1}
  945. 818: e92d0001 push {r0}
  946. 81c: e3a00009 mov r0, #9
  947. 820: ef000040 svc 0x00000040
  948. 824: e8bd0002 pop {r1}
  949. 828: e8bd0002 pop {r1}
  950. 82c: e8bd0004 pop {r2}
  951. 830: e8bd0008 pop {r3}
  952. 834: e8bd4000 pop {lr}
  953. 838: e12fff1e bx lr
  954. 0000083c <dup>:
  955. 83c: e92d4000 push {lr}
  956. 840: e92d0008 push {r3}
  957. 844: e92d0004 push {r2}
  958. 848: e92d0002 push {r1}
  959. 84c: e92d0001 push {r0}
  960. 850: e3a0000a mov r0, #10
  961. 854: ef000040 svc 0x00000040
  962. 858: e8bd0002 pop {r1}
  963. 85c: e8bd0002 pop {r1}
  964. 860: e8bd0004 pop {r2}
  965. 864: e8bd0008 pop {r3}
  966. 868: e8bd4000 pop {lr}
  967. 86c: e12fff1e bx lr
  968. 00000870 <getpid>:
  969. 870: e92d4000 push {lr}
  970. 874: e92d0008 push {r3}
  971. 878: e92d0004 push {r2}
  972. 87c: e92d0002 push {r1}
  973. 880: e92d0001 push {r0}
  974. 884: e3a0000b mov r0, #11
  975. 888: ef000040 svc 0x00000040
  976. 88c: e8bd0002 pop {r1}
  977. 890: e8bd0002 pop {r1}
  978. 894: e8bd0004 pop {r2}
  979. 898: e8bd0008 pop {r3}
  980. 89c: e8bd4000 pop {lr}
  981. 8a0: e12fff1e bx lr
  982. 000008a4 <sbrk>:
  983. 8a4: e92d4000 push {lr}
  984. 8a8: e92d0008 push {r3}
  985. 8ac: e92d0004 push {r2}
  986. 8b0: e92d0002 push {r1}
  987. 8b4: e92d0001 push {r0}
  988. 8b8: e3a0000c mov r0, #12
  989. 8bc: ef000040 svc 0x00000040
  990. 8c0: e8bd0002 pop {r1}
  991. 8c4: e8bd0002 pop {r1}
  992. 8c8: e8bd0004 pop {r2}
  993. 8cc: e8bd0008 pop {r3}
  994. 8d0: e8bd4000 pop {lr}
  995. 8d4: e12fff1e bx lr
  996. 000008d8 <sleep>:
  997. 8d8: e92d4000 push {lr}
  998. 8dc: e92d0008 push {r3}
  999. 8e0: e92d0004 push {r2}
  1000. 8e4: e92d0002 push {r1}
  1001. 8e8: e92d0001 push {r0}
  1002. 8ec: e3a0000d mov r0, #13
  1003. 8f0: ef000040 svc 0x00000040
  1004. 8f4: e8bd0002 pop {r1}
  1005. 8f8: e8bd0002 pop {r1}
  1006. 8fc: e8bd0004 pop {r2}
  1007. 900: e8bd0008 pop {r3}
  1008. 904: e8bd4000 pop {lr}
  1009. 908: e12fff1e bx lr
  1010. 0000090c <uptime>:
  1011. 90c: e92d4000 push {lr}
  1012. 910: e92d0008 push {r3}
  1013. 914: e92d0004 push {r2}
  1014. 918: e92d0002 push {r1}
  1015. 91c: e92d0001 push {r0}
  1016. 920: e3a0000e mov r0, #14
  1017. 924: ef000040 svc 0x00000040
  1018. 928: e8bd0002 pop {r1}
  1019. 92c: e8bd0002 pop {r1}
  1020. 930: e8bd0004 pop {r2}
  1021. 934: e8bd0008 pop {r3}
  1022. 938: e8bd4000 pop {lr}
  1023. 93c: e12fff1e bx lr
  1024. 00000940 <putc>:
  1025. #include "stat.h"
  1026. #include "user.h"
  1027. static void
  1028. putc(int fd, char c)
  1029. {
  1030. 940: e92d4800 push {fp, lr}
  1031. 944: e28db004 add fp, sp, #4
  1032. 948: e24b3004 sub r3, fp, #4
  1033. 94c: e24dd008 sub sp, sp, #8
  1034. write(fd, &c, 1);
  1035. 950: e3a02001 mov r2, #1
  1036. #include "stat.h"
  1037. #include "user.h"
  1038. static void
  1039. putc(int fd, char c)
  1040. {
  1041. 954: e5631001 strb r1, [r3, #-1]!
  1042. write(fd, &c, 1);
  1043. 958: e1a01003 mov r1, r3
  1044. 95c: ebffff27 bl 600 <write>
  1045. }
  1046. 960: e24bd004 sub sp, fp, #4
  1047. 964: e8bd8800 pop {fp, pc}
  1048. 00000968 <printint>:
  1049. return q;
  1050. }
  1051. static void
  1052. printint(int fd, int xx, int base, int sgn)
  1053. {
  1054. 968: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  1055. 96c: e1a04000 mov r4, r0
  1056. char buf[16];
  1057. int i, neg;
  1058. uint x, y, b;
  1059. neg = 0;
  1060. if(sgn && xx < 0){
  1061. 970: e1a00fa1 lsr r0, r1, #31
  1062. 974: e3530000 cmp r3, #0
  1063. 978: 03a03000 moveq r3, #0
  1064. 97c: 12003001 andne r3, r0, #1
  1065. return q;
  1066. }
  1067. static void
  1068. printint(int fd, int xx, int base, int sgn)
  1069. {
  1070. 980: e28db020 add fp, sp, #32
  1071. char buf[16];
  1072. int i, neg;
  1073. uint x, y, b;
  1074. neg = 0;
  1075. if(sgn && xx < 0){
  1076. 984: e3530000 cmp r3, #0
  1077. return q;
  1078. }
  1079. static void
  1080. printint(int fd, int xx, int base, int sgn)
  1081. {
  1082. 988: e24dd014 sub sp, sp, #20
  1083. 98c: e59f909c ldr r9, [pc, #156] ; a30 <printint+0xc8>
  1084. uint x, y, b;
  1085. neg = 0;
  1086. if(sgn && xx < 0){
  1087. neg = 1;
  1088. x = -xx;
  1089. 990: 12611000 rsbne r1, r1, #0
  1090. int i, neg;
  1091. uint x, y, b;
  1092. neg = 0;
  1093. if(sgn && xx < 0){
  1094. neg = 1;
  1095. 994: 13a03001 movne r3, #1
  1096. } else {
  1097. x = xx;
  1098. }
  1099. b = base;
  1100. i = 0;
  1101. 998: e3a0a000 mov sl, #0
  1102. 99c: e24b6034 sub r6, fp, #52 ; 0x34
  1103. for(i=31;i>=0;i--){
  1104. r = r << 1;
  1105. r = r | ((n >> i) & 1);
  1106. if(r >= d) {
  1107. r = r - d;
  1108. q = q | (1 << i);
  1109. 9a0: e3a08001 mov r8, #1
  1110. write(fd, &c, 1);
  1111. }
  1112. u32 div(u32 n, u32 d) // long division
  1113. {
  1114. u32 q=0, r=0;
  1115. 9a4: e3a07000 mov r7, #0
  1116. int i;
  1117. for(i=31;i>=0;i--){
  1118. 9a8: e3a0001f mov r0, #31
  1119. write(fd, &c, 1);
  1120. }
  1121. u32 div(u32 n, u32 d) // long division
  1122. {
  1123. u32 q=0, r=0;
  1124. 9ac: e1a0c007 mov ip, r7
  1125. int i;
  1126. for(i=31;i>=0;i--){
  1127. r = r << 1;
  1128. r = r | ((n >> i) & 1);
  1129. 9b0: e1a0e031 lsr lr, r1, r0
  1130. 9b4: e20ee001 and lr, lr, #1
  1131. 9b8: e18ec08c orr ip, lr, ip, lsl #1
  1132. if(r >= d) {
  1133. 9bc: e152000c cmp r2, ip
  1134. r = r - d;
  1135. q = q | (1 << i);
  1136. 9c0: 91877018 orrls r7, r7, r8, lsl r0
  1137. for(i=31;i>=0;i--){
  1138. r = r << 1;
  1139. r = r | ((n >> i) & 1);
  1140. if(r >= d) {
  1141. r = r - d;
  1142. 9c4: 9062c00c rsbls ip, r2, ip
  1143. u32 div(u32 n, u32 d) // long division
  1144. {
  1145. u32 q=0, r=0;
  1146. int i;
  1147. for(i=31;i>=0;i--){
  1148. 9c8: e2500001 subs r0, r0, #1
  1149. 9cc: 2afffff7 bcs 9b0 <printint+0x48>
  1150. b = base;
  1151. i = 0;
  1152. do{
  1153. y = div(x, b);
  1154. buf[i++] = digits[x - y * b];
  1155. 9d0: e0000792 mul r0, r2, r7
  1156. }while((x = y) != 0);
  1157. 9d4: e3570000 cmp r7, #0
  1158. b = base;
  1159. i = 0;
  1160. do{
  1161. y = div(x, b);
  1162. buf[i++] = digits[x - y * b];
  1163. 9d8: e0601001 rsb r1, r0, r1
  1164. 9dc: e28a5001 add r5, sl, #1
  1165. 9e0: e7d91001 ldrb r1, [r9, r1]
  1166. 9e4: e7c6100a strb r1, [r6, sl]
  1167. }while((x = y) != 0);
  1168. 9e8: 11a01007 movne r1, r7
  1169. b = base;
  1170. i = 0;
  1171. do{
  1172. y = div(x, b);
  1173. buf[i++] = digits[x - y * b];
  1174. 9ec: 11a0a005 movne sl, r5
  1175. 9f0: 1affffeb bne 9a4 <printint+0x3c>
  1176. }while((x = y) != 0);
  1177. if(neg)
  1178. 9f4: e3530000 cmp r3, #0
  1179. buf[i++] = '-';
  1180. 9f8: 124b2024 subne r2, fp, #36 ; 0x24
  1181. 9fc: 10823005 addne r3, r2, r5
  1182. a00: 128a5002 addne r5, sl, #2
  1183. while(--i >= 0)
  1184. a04: e2455001 sub r5, r5, #1
  1185. do{
  1186. y = div(x, b);
  1187. buf[i++] = digits[x - y * b];
  1188. }while((x = y) != 0);
  1189. if(neg)
  1190. buf[i++] = '-';
  1191. a08: 13a0202d movne r2, #45 ; 0x2d
  1192. a0c: 15432010 strbne r2, [r3, #-16]
  1193. while(--i >= 0)
  1194. putc(fd, buf[i]);
  1195. a10: e7d61005 ldrb r1, [r6, r5]
  1196. a14: e1a00004 mov r0, r4
  1197. buf[i++] = digits[x - y * b];
  1198. }while((x = y) != 0);
  1199. if(neg)
  1200. buf[i++] = '-';
  1201. while(--i >= 0)
  1202. a18: e2455001 sub r5, r5, #1
  1203. putc(fd, buf[i]);
  1204. a1c: ebffffc7 bl 940 <putc>
  1205. buf[i++] = digits[x - y * b];
  1206. }while((x = y) != 0);
  1207. if(neg)
  1208. buf[i++] = '-';
  1209. while(--i >= 0)
  1210. a20: e3750001 cmn r5, #1
  1211. a24: 1afffff9 bne a10 <printint+0xa8>
  1212. putc(fd, buf[i]);
  1213. }
  1214. a28: e24bd020 sub sp, fp, #32
  1215. a2c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  1216. a30: 00000db4 .word 0x00000db4
  1217. 00000a34 <div>:
  1218. write(fd, &c, 1);
  1219. }
  1220. u32 div(u32 n, u32 d) // long division
  1221. {
  1222. u32 q=0, r=0;
  1223. a34: e3a03000 mov r3, #0
  1224. {
  1225. write(fd, &c, 1);
  1226. }
  1227. u32 div(u32 n, u32 d) // long division
  1228. {
  1229. a38: e92d0830 push {r4, r5, fp}
  1230. a3c: e1a02000 mov r2, r0
  1231. a40: e28db008 add fp, sp, #8
  1232. u32 q=0, r=0;
  1233. int i;
  1234. for(i=31;i>=0;i--){
  1235. a44: e3a0c01f mov ip, #31
  1236. write(fd, &c, 1);
  1237. }
  1238. u32 div(u32 n, u32 d) // long division
  1239. {
  1240. u32 q=0, r=0;
  1241. a48: e1a00003 mov r0, r3
  1242. for(i=31;i>=0;i--){
  1243. r = r << 1;
  1244. r = r | ((n >> i) & 1);
  1245. if(r >= d) {
  1246. r = r - d;
  1247. q = q | (1 << i);
  1248. a4c: e3a05001 mov r5, #1
  1249. u32 q=0, r=0;
  1250. int i;
  1251. for(i=31;i>=0;i--){
  1252. r = r << 1;
  1253. r = r | ((n >> i) & 1);
  1254. a50: e1a04c32 lsr r4, r2, ip
  1255. a54: e2044001 and r4, r4, #1
  1256. a58: e1843083 orr r3, r4, r3, lsl #1
  1257. if(r >= d) {
  1258. a5c: e1530001 cmp r3, r1
  1259. r = r - d;
  1260. q = q | (1 << i);
  1261. a60: 21800c15 orrcs r0, r0, r5, lsl ip
  1262. for(i=31;i>=0;i--){
  1263. r = r << 1;
  1264. r = r | ((n >> i) & 1);
  1265. if(r >= d) {
  1266. r = r - d;
  1267. a64: 20613003 rsbcs r3, r1, r3
  1268. u32 div(u32 n, u32 d) // long division
  1269. {
  1270. u32 q=0, r=0;
  1271. int i;
  1272. for(i=31;i>=0;i--){
  1273. a68: e25cc001 subs ip, ip, #1
  1274. a6c: 2afffff7 bcs a50 <div+0x1c>
  1275. r = r - d;
  1276. q = q | (1 << i);
  1277. }
  1278. }
  1279. return q;
  1280. }
  1281. a70: e24bd008 sub sp, fp, #8
  1282. a74: e8bd0830 pop {r4, r5, fp}
  1283. a78: e12fff1e bx lr
  1284. 00000a7c <printf>:
  1285. }
  1286. // Print to the given fd. Only understands %d, %x, %p, %s.
  1287. void
  1288. printf(int fd, char *fmt, ...)
  1289. {
  1290. a7c: e92d000e push {r1, r2, r3}
  1291. a80: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  1292. a84: e28db020 add fp, sp, #32
  1293. a88: e1a05000 mov r5, r0
  1294. int c, i, state;
  1295. uint *ap;
  1296. state = 0;
  1297. ap = (uint*)(void*)&fmt + 1;
  1298. for(i = 0; fmt[i]; i++){
  1299. a8c: e59b4004 ldr r4, [fp, #4]
  1300. a90: e5d48000 ldrb r8, [r4]
  1301. a94: e3580000 cmp r8, #0
  1302. a98: 0a000027 beq b3c <printf+0xc0>
  1303. ap++;
  1304. } else if(c == 's'){
  1305. s = (char*)*ap;
  1306. ap++;
  1307. if(s == 0)
  1308. s = "(null)";
  1309. a9c: e59f712c ldr r7, [pc, #300] ; bd0 <printf+0x154>
  1310. char *s;
  1311. int c, i, state;
  1312. uint *ap;
  1313. state = 0;
  1314. ap = (uint*)(void*)&fmt + 1;
  1315. aa0: e28b6008 add r6, fp, #8
  1316. {
  1317. char *s;
  1318. int c, i, state;
  1319. uint *ap;
  1320. state = 0;
  1321. aa4: e3a0a000 mov sl, #0
  1322. aa8: ea000008 b ad0 <printf+0x54>
  1323. ap = (uint*)(void*)&fmt + 1;
  1324. for(i = 0; fmt[i]; i++){
  1325. c = fmt[i] & 0xff;
  1326. if(state == 0){
  1327. if(c == '%'){
  1328. aac: e3580025 cmp r8, #37 ; 0x25
  1329. state = '%';
  1330. ab0: 01a0a008 moveq sl, r8
  1331. state = 0;
  1332. ap = (uint*)(void*)&fmt + 1;
  1333. for(i = 0; fmt[i]; i++){
  1334. c = fmt[i] & 0xff;
  1335. if(state == 0){
  1336. if(c == '%'){
  1337. ab4: 0a000002 beq ac4 <printf+0x48>
  1338. state = '%';
  1339. } else {
  1340. putc(fd, c);
  1341. ab8: e1a00005 mov r0, r5
  1342. abc: e1a01008 mov r1, r8
  1343. ac0: ebffff9e bl 940 <putc>
  1344. int c, i, state;
  1345. uint *ap;
  1346. state = 0;
  1347. ap = (uint*)(void*)&fmt + 1;
  1348. for(i = 0; fmt[i]; i++){
  1349. ac4: e5f48001 ldrb r8, [r4, #1]!
  1350. ac8: e3580000 cmp r8, #0
  1351. acc: 0a00001a beq b3c <printf+0xc0>
  1352. c = fmt[i] & 0xff;
  1353. if(state == 0){
  1354. ad0: e35a0000 cmp sl, #0
  1355. ad4: 0afffff4 beq aac <printf+0x30>
  1356. if(c == '%'){
  1357. state = '%';
  1358. } else {
  1359. putc(fd, c);
  1360. }
  1361. } else if(state == '%'){
  1362. ad8: e35a0025 cmp sl, #37 ; 0x25
  1363. adc: 1afffff8 bne ac4 <printf+0x48>
  1364. if(c == 'd'){
  1365. ae0: e3580064 cmp r8, #100 ; 0x64
  1366. ae4: 0a00002c beq b9c <printf+0x120>
  1367. printint(fd, *ap, 10, 1);
  1368. ap++;
  1369. } else if(c == 'x' || c == 'p'){
  1370. ae8: e3580078 cmp r8, #120 ; 0x78
  1371. aec: 13580070 cmpne r8, #112 ; 0x70
  1372. af0: 13a09000 movne r9, #0
  1373. af4: 03a09001 moveq r9, #1
  1374. af8: 0a000013 beq b4c <printf+0xd0>
  1375. printint(fd, *ap, 16, 0);
  1376. ap++;
  1377. } else if(c == 's'){
  1378. afc: e3580073 cmp r8, #115 ; 0x73
  1379. b00: 0a000018 beq b68 <printf+0xec>
  1380. s = "(null)";
  1381. while(*s != 0){
  1382. putc(fd, *s);
  1383. s++;
  1384. }
  1385. } else if(c == 'c'){
  1386. b04: e3580063 cmp r8, #99 ; 0x63
  1387. b08: 0a00002a beq bb8 <printf+0x13c>
  1388. putc(fd, *ap);
  1389. ap++;
  1390. } else if(c == '%'){
  1391. b0c: e3580025 cmp r8, #37 ; 0x25
  1392. putc(fd, c);
  1393. b10: e1a0100a mov r1, sl
  1394. b14: e1a00005 mov r0, r5
  1395. s++;
  1396. }
  1397. } else if(c == 'c'){
  1398. putc(fd, *ap);
  1399. ap++;
  1400. } else if(c == '%'){
  1401. b18: 0a000002 beq b28 <printf+0xac>
  1402. putc(fd, c);
  1403. } else {
  1404. // Unknown % sequence. Print it to draw attention.
  1405. putc(fd, '%');
  1406. b1c: ebffff87 bl 940 <putc>
  1407. putc(fd, c);
  1408. b20: e1a00005 mov r0, r5
  1409. b24: e1a01008 mov r1, r8
  1410. b28: ebffff84 bl 940 <putc>
  1411. int c, i, state;
  1412. uint *ap;
  1413. state = 0;
  1414. ap = (uint*)(void*)&fmt + 1;
  1415. for(i = 0; fmt[i]; i++){
  1416. b2c: e5f48001 ldrb r8, [r4, #1]!
  1417. } else {
  1418. // Unknown % sequence. Print it to draw attention.
  1419. putc(fd, '%');
  1420. putc(fd, c);
  1421. }
  1422. state = 0;
  1423. b30: e1a0a009 mov sl, r9
  1424. int c, i, state;
  1425. uint *ap;
  1426. state = 0;
  1427. ap = (uint*)(void*)&fmt + 1;
  1428. for(i = 0; fmt[i]; i++){
  1429. b34: e3580000 cmp r8, #0
  1430. b38: 1affffe4 bne ad0 <printf+0x54>
  1431. putc(fd, c);
  1432. }
  1433. state = 0;
  1434. }
  1435. }
  1436. }
  1437. b3c: e24bd020 sub sp, fp, #32
  1438. b40: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  1439. b44: e28dd00c add sp, sp, #12
  1440. b48: e12fff1e bx lr
  1441. } else if(state == '%'){
  1442. if(c == 'd'){
  1443. printint(fd, *ap, 10, 1);
  1444. ap++;
  1445. } else if(c == 'x' || c == 'p'){
  1446. printint(fd, *ap, 16, 0);
  1447. b4c: e1a00005 mov r0, r5
  1448. b50: e4961004 ldr r1, [r6], #4
  1449. b54: e3a02010 mov r2, #16
  1450. b58: e3a03000 mov r3, #0
  1451. b5c: ebffff81 bl 968 <printint>
  1452. } else {
  1453. // Unknown % sequence. Print it to draw attention.
  1454. putc(fd, '%');
  1455. putc(fd, c);
  1456. }
  1457. state = 0;
  1458. b60: e3a0a000 mov sl, #0
  1459. b64: eaffffd6 b ac4 <printf+0x48>
  1460. ap++;
  1461. } else if(c == 'x' || c == 'p'){
  1462. printint(fd, *ap, 16, 0);
  1463. ap++;
  1464. } else if(c == 's'){
  1465. s = (char*)*ap;
  1466. b68: e4968004 ldr r8, [r6], #4
  1467. ap++;
  1468. if(s == 0)
  1469. s = "(null)";
  1470. b6c: e3580000 cmp r8, #0
  1471. b70: 01a08007 moveq r8, r7
  1472. while(*s != 0){
  1473. b74: e5d81000 ldrb r1, [r8]
  1474. b78: e3510000 cmp r1, #0
  1475. b7c: 0a000004 beq b94 <printf+0x118>
  1476. putc(fd, *s);
  1477. b80: e1a00005 mov r0, r5
  1478. b84: ebffff6d bl 940 <putc>
  1479. } else if(c == 's'){
  1480. s = (char*)*ap;
  1481. ap++;
  1482. if(s == 0)
  1483. s = "(null)";
  1484. while(*s != 0){
  1485. b88: e5f81001 ldrb r1, [r8, #1]!
  1486. b8c: e3510000 cmp r1, #0
  1487. b90: 1afffffa bne b80 <printf+0x104>
  1488. } else {
  1489. // Unknown % sequence. Print it to draw attention.
  1490. putc(fd, '%');
  1491. putc(fd, c);
  1492. }
  1493. state = 0;
  1494. b94: e1a0a001 mov sl, r1
  1495. b98: eaffffc9 b ac4 <printf+0x48>
  1496. } else {
  1497. putc(fd, c);
  1498. }
  1499. } else if(state == '%'){
  1500. if(c == 'd'){
  1501. printint(fd, *ap, 10, 1);
  1502. b9c: e1a00005 mov r0, r5
  1503. ba0: e4961004 ldr r1, [r6], #4
  1504. ba4: e3a0200a mov r2, #10
  1505. ba8: e3a03001 mov r3, #1
  1506. bac: ebffff6d bl 968 <printint>
  1507. } else {
  1508. // Unknown % sequence. Print it to draw attention.
  1509. putc(fd, '%');
  1510. putc(fd, c);
  1511. }
  1512. state = 0;
  1513. bb0: e3a0a000 mov sl, #0
  1514. bb4: eaffffc2 b ac4 <printf+0x48>
  1515. while(*s != 0){
  1516. putc(fd, *s);
  1517. s++;
  1518. }
  1519. } else if(c == 'c'){
  1520. putc(fd, *ap);
  1521. bb8: e4961004 ldr r1, [r6], #4
  1522. bbc: e1a00005 mov r0, r5
  1523. } else {
  1524. // Unknown % sequence. Print it to draw attention.
  1525. putc(fd, '%');
  1526. putc(fd, c);
  1527. }
  1528. state = 0;
  1529. bc0: e1a0a009 mov sl, r9
  1530. while(*s != 0){
  1531. putc(fd, *s);
  1532. s++;
  1533. }
  1534. } else if(c == 'c'){
  1535. putc(fd, *ap);
  1536. bc4: e6ef1071 uxtb r1, r1
  1537. bc8: ebffff5c bl 940 <putc>
  1538. bcc: eaffffbc b ac4 <printf+0x48>
  1539. bd0: 00000dc8 .word 0x00000dc8
  1540. 00000bd4 <free>:
  1541. free(void *ap)
  1542. {
  1543. Header *bp, *p;
  1544. bp = (Header*)ap - 1;
  1545. for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  1546. bd4: e59f3098 ldr r3, [pc, #152] ; c74 <free+0xa0>
  1547. static Header base;
  1548. static Header *freep;
  1549. void
  1550. free(void *ap)
  1551. {
  1552. bd8: e92d0830 push {r4, r5, fp}
  1553. Header *bp, *p;
  1554. bp = (Header*)ap - 1;
  1555. bdc: e240c008 sub ip, r0, #8
  1556. for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  1557. be0: e5932000 ldr r2, [r3]
  1558. static Header base;
  1559. static Header *freep;
  1560. void
  1561. free(void *ap)
  1562. {
  1563. be4: e28db008 add fp, sp, #8
  1564. Header *bp, *p;
  1565. bp = (Header*)ap - 1;
  1566. for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  1567. be8: e152000c cmp r2, ip
  1568. bec: e5921000 ldr r1, [r2]
  1569. bf0: 2a000001 bcs bfc <free+0x28>
  1570. bf4: e15c0001 cmp ip, r1
  1571. bf8: 3a000007 bcc c1c <free+0x48>
  1572. if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  1573. bfc: e1520001 cmp r2, r1
  1574. c00: 3a000003 bcc c14 <free+0x40>
  1575. c04: e152000c cmp r2, ip
  1576. c08: 3a000003 bcc c1c <free+0x48>
  1577. c0c: e15c0001 cmp ip, r1
  1578. c10: 3a000001 bcc c1c <free+0x48>
  1579. static Header base;
  1580. static Header *freep;
  1581. void
  1582. free(void *ap)
  1583. {
  1584. c14: e1a02001 mov r2, r1
  1585. c18: eafffff2 b be8 <free+0x14>
  1586. bp = (Header*)ap - 1;
  1587. for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  1588. if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  1589. break;
  1590. if(bp + bp->s.size == p->s.ptr){
  1591. c1c: e5104004 ldr r4, [r0, #-4]
  1592. if(p + p->s.size == bp){
  1593. p->s.size += bp->s.size;
  1594. p->s.ptr = bp->s.ptr;
  1595. } else
  1596. p->s.ptr = bp;
  1597. freep = p;
  1598. c20: e5832000 str r2, [r3]
  1599. bp = (Header*)ap - 1;
  1600. for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  1601. if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  1602. break;
  1603. if(bp + bp->s.size == p->s.ptr){
  1604. c24: e08c5184 add r5, ip, r4, lsl #3
  1605. c28: e1550001 cmp r5, r1
  1606. bp->s.size += p->s.ptr->s.size;
  1607. c2c: 05911004 ldreq r1, [r1, #4]
  1608. c30: 00814004 addeq r4, r1, r4
  1609. c34: 05004004 streq r4, [r0, #-4]
  1610. bp->s.ptr = p->s.ptr->s.ptr;
  1611. c38: 05921000 ldreq r1, [r2]
  1612. c3c: 05911000 ldreq r1, [r1]
  1613. } else
  1614. bp->s.ptr = p->s.ptr;
  1615. c40: e5001008 str r1, [r0, #-8]
  1616. if(p + p->s.size == bp){
  1617. c44: e5921004 ldr r1, [r2, #4]
  1618. c48: e0824181 add r4, r2, r1, lsl #3
  1619. c4c: e15c0004 cmp ip, r4
  1620. p->s.size += bp->s.size;
  1621. p->s.ptr = bp->s.ptr;
  1622. } else
  1623. p->s.ptr = bp;
  1624. c50: 1582c000 strne ip, [r2]
  1625. bp->s.size += p->s.ptr->s.size;
  1626. bp->s.ptr = p->s.ptr->s.ptr;
  1627. } else
  1628. bp->s.ptr = p->s.ptr;
  1629. if(p + p->s.size == bp){
  1630. p->s.size += bp->s.size;
  1631. c54: 0510c004 ldreq ip, [r0, #-4]
  1632. c58: 008c1001 addeq r1, ip, r1
  1633. c5c: 05821004 streq r1, [r2, #4]
  1634. p->s.ptr = bp->s.ptr;
  1635. c60: 05101008 ldreq r1, [r0, #-8]
  1636. c64: 05821000 streq r1, [r2]
  1637. } else
  1638. p->s.ptr = bp;
  1639. freep = p;
  1640. }
  1641. c68: e24bd008 sub sp, fp, #8
  1642. c6c: e8bd0830 pop {r4, r5, fp}
  1643. c70: e12fff1e bx lr
  1644. c74: 00000de0 .word 0x00000de0
  1645. 00000c78 <malloc>:
  1646. return freep;
  1647. }
  1648. void*
  1649. malloc(uint nbytes)
  1650. {
  1651. c78: e92d49f8 push {r3, r4, r5, r6, r7, r8, fp, lr}
  1652. Header *p, *prevp;
  1653. uint nunits;
  1654. nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  1655. c7c: e2804007 add r4, r0, #7
  1656. if((prevp = freep) == 0){
  1657. c80: e59f50d4 ldr r5, [pc, #212] ; d5c <malloc+0xe4>
  1658. malloc(uint nbytes)
  1659. {
  1660. Header *p, *prevp;
  1661. uint nunits;
  1662. nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  1663. c84: e1a041a4 lsr r4, r4, #3
  1664. return freep;
  1665. }
  1666. void*
  1667. malloc(uint nbytes)
  1668. {
  1669. c88: e28db01c add fp, sp, #28
  1670. Header *p, *prevp;
  1671. uint nunits;
  1672. nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  1673. if((prevp = freep) == 0){
  1674. c8c: e5953000 ldr r3, [r5]
  1675. malloc(uint nbytes)
  1676. {
  1677. Header *p, *prevp;
  1678. uint nunits;
  1679. nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  1680. c90: e2844001 add r4, r4, #1
  1681. if((prevp = freep) == 0){
  1682. c94: e3530000 cmp r3, #0
  1683. c98: 0a00002b beq d4c <malloc+0xd4>
  1684. c9c: e5930000 ldr r0, [r3]
  1685. ca0: e5902004 ldr r2, [r0, #4]
  1686. base.s.ptr = freep = prevp = &base;
  1687. base.s.size = 0;
  1688. }
  1689. for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  1690. if(p->s.size >= nunits){
  1691. ca4: e1520004 cmp r2, r4
  1692. ca8: 2a00001b bcs d1c <malloc+0xa4>
  1693. morecore(uint nu)
  1694. {
  1695. char *p;
  1696. Header *hp;
  1697. if(nu < 4096)
  1698. cac: e59f80ac ldr r8, [pc, #172] ; d60 <malloc+0xe8>
  1699. p->s.size -= nunits;
  1700. p += p->s.size;
  1701. p->s.size = nunits;
  1702. }
  1703. freep = prevp;
  1704. return (void*)(p + 1);
  1705. cb0: e1a07184 lsl r7, r4, #3
  1706. cb4: ea000003 b cc8 <malloc+0x50>
  1707. nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  1708. if((prevp = freep) == 0){
  1709. base.s.ptr = freep = prevp = &base;
  1710. base.s.size = 0;
  1711. }
  1712. for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  1713. cb8: e5930000 ldr r0, [r3]
  1714. if(p->s.size >= nunits){
  1715. cbc: e5902004 ldr r2, [r0, #4]
  1716. cc0: e1540002 cmp r4, r2
  1717. cc4: 9a000014 bls d1c <malloc+0xa4>
  1718. p->s.size = nunits;
  1719. }
  1720. freep = prevp;
  1721. return (void*)(p + 1);
  1722. }
  1723. if(p == freep)
  1724. cc8: e5952000 ldr r2, [r5]
  1725. ccc: e1a03000 mov r3, r0
  1726. cd0: e1500002 cmp r0, r2
  1727. cd4: 1afffff7 bne cb8 <malloc+0x40>
  1728. morecore(uint nu)
  1729. {
  1730. char *p;
  1731. Header *hp;
  1732. if(nu < 4096)
  1733. cd8: e1540008 cmp r4, r8
  1734. nu = 4096;
  1735. p = sbrk(nu * sizeof(Header));
  1736. cdc: 81a00007 movhi r0, r7
  1737. ce0: 93a00902 movls r0, #32768 ; 0x8000
  1738. morecore(uint nu)
  1739. {
  1740. char *p;
  1741. Header *hp;
  1742. if(nu < 4096)
  1743. ce4: 81a06004 movhi r6, r4
  1744. ce8: 93a06a01 movls r6, #4096 ; 0x1000
  1745. nu = 4096;
  1746. p = sbrk(nu * sizeof(Header));
  1747. cec: ebfffeec bl 8a4 <sbrk>
  1748. cf0: e1a03000 mov r3, r0
  1749. if(p == (char*)-1)
  1750. cf4: e3730001 cmn r3, #1
  1751. return 0;
  1752. hp = (Header*)p;
  1753. hp->s.size = nu;
  1754. free((void*)(hp + 1));
  1755. cf8: e2800008 add r0, r0, #8
  1756. Header *hp;
  1757. if(nu < 4096)
  1758. nu = 4096;
  1759. p = sbrk(nu * sizeof(Header));
  1760. if(p == (char*)-1)
  1761. cfc: 0a000010 beq d44 <malloc+0xcc>
  1762. return 0;
  1763. hp = (Header*)p;
  1764. hp->s.size = nu;
  1765. d00: e5836004 str r6, [r3, #4]
  1766. free((void*)(hp + 1));
  1767. d04: ebffffb2 bl bd4 <free>
  1768. return freep;
  1769. d08: e5953000 ldr r3, [r5]
  1770. }
  1771. freep = prevp;
  1772. return (void*)(p + 1);
  1773. }
  1774. if(p == freep)
  1775. if((p = morecore(nunits)) == 0)
  1776. d0c: e3530000 cmp r3, #0
  1777. d10: 1affffe8 bne cb8 <malloc+0x40>
  1778. return 0;
  1779. d14: e1a00003 mov r0, r3
  1780. }
  1781. }
  1782. d18: e8bd89f8 pop {r3, r4, r5, r6, r7, r8, fp, pc}
  1783. base.s.ptr = freep = prevp = &base;
  1784. base.s.size = 0;
  1785. }
  1786. for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  1787. if(p->s.size >= nunits){
  1788. if(p->s.size == nunits)
  1789. d1c: e1540002 cmp r4, r2
  1790. prevp->s.ptr = p->s.ptr;
  1791. else {
  1792. p->s.size -= nunits;
  1793. d20: 10642002 rsbne r2, r4, r2
  1794. d24: 15802004 strne r2, [r0, #4]
  1795. base.s.size = 0;
  1796. }
  1797. for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  1798. if(p->s.size >= nunits){
  1799. if(p->s.size == nunits)
  1800. prevp->s.ptr = p->s.ptr;
  1801. d28: 05902000 ldreq r2, [r0]
  1802. else {
  1803. p->s.size -= nunits;
  1804. p += p->s.size;
  1805. d2c: 10800182 addne r0, r0, r2, lsl #3
  1806. base.s.size = 0;
  1807. }
  1808. for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  1809. if(p->s.size >= nunits){
  1810. if(p->s.size == nunits)
  1811. prevp->s.ptr = p->s.ptr;
  1812. d30: 05832000 streq r2, [r3]
  1813. else {
  1814. p->s.size -= nunits;
  1815. p += p->s.size;
  1816. p->s.size = nunits;
  1817. d34: 15804004 strne r4, [r0, #4]
  1818. }
  1819. freep = prevp;
  1820. d38: e5853000 str r3, [r5]
  1821. return (void*)(p + 1);
  1822. d3c: e2800008 add r0, r0, #8
  1823. d40: e8bd89f8 pop {r3, r4, r5, r6, r7, r8, fp, pc}
  1824. }
  1825. if(p == freep)
  1826. if((p = morecore(nunits)) == 0)
  1827. return 0;
  1828. d44: e3a00000 mov r0, #0
  1829. d48: e8bd89f8 pop {r3, r4, r5, r6, r7, r8, fp, pc}
  1830. Header *p, *prevp;
  1831. uint nunits;
  1832. nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  1833. if((prevp = freep) == 0){
  1834. base.s.ptr = freep = prevp = &base;
  1835. d4c: e2850004 add r0, r5, #4
  1836. d50: e5850000 str r0, [r5]
  1837. base.s.size = 0;
  1838. d54: e9850009 stmib r5, {r0, r3}
  1839. d58: eaffffd3 b cac <malloc+0x34>
  1840. d5c: 00000de0 .word 0x00000de0
  1841. d60: 00000fff .word 0x00000fff