obj/kern/kernel: file format elf32-i386 Disassembly of section .text: f0100000 <_start+0xeffffff4>: .globl _start _start = RELOC(entry) .globl entry entry: movw $0x1234,0x472 # warm boot f0100000: 02 b0 ad 1b 00 00 add 0x1bad(%eax),%dh f0100006: 00 00 add %al,(%eax) f0100008: fe 4f 52 decb 0x52(%edi) f010000b: e4 .byte 0xe4 f010000c : f010000c: 66 c7 05 72 04 00 00 movw $0x1234,0x472 f0100013: 34 12 # sufficient until we set up our real page table in mem_init # in lab 2. # Load the physical address of entry_pgdir into cr3. entry_pgdir # is defined in entrypgdir.c. movl $(RELOC(entry_pgdir)), %eax f0100015: b8 00 00 11 00 mov $0x110000,%eax movl %eax, %cr3 f010001a: 0f 22 d8 mov %eax,%cr3 # Turn on paging. movl %cr0, %eax f010001d: 0f 20 c0 mov %cr0,%eax orl $(CR0_PE|CR0_PG|CR0_WP), %eax f0100020: 0d 01 00 01 80 or $0x80010001,%eax movl %eax, %cr0 f0100025: 0f 22 c0 mov %eax,%cr0 # Now paging is enabled, but we're still running at a low EIP # (why is this okay?). Jump up above KERNBASE before entering # C code. mov $relocated, %eax f0100028: b8 2f 00 10 f0 mov $0xf010002f,%eax jmp *%eax f010002d: ff e0 jmp *%eax f010002f : relocated: # Clear the frame pointer register (EBP) # so that once we get into debugging C code, # stack backtraces will be terminated properly. movl $0x0,%ebp # nuke frame pointer f010002f: bd 00 00 00 00 mov $0x0,%ebp # Set the stack pointer movl $(bootstacktop),%esp f0100034: bc 00 00 11 f0 mov $0xf0110000,%esp # now to C code call i386_init f0100039: e8 5a 00 00 00 call f0100098 f010003e : # Should never get here, but in case we do, just spin. spin: jmp spin f010003e: eb fe jmp f010003e f0100040 : #include // Test the stack backtrace function (lab 1 only) void test_backtrace(int x) { f0100040: f3 0f 1e fb endbr32 f0100044: 55 push %ebp f0100045: 89 e5 mov %esp,%ebp f0100047: 53 push %ebx f0100048: 83 ec 0c sub $0xc,%esp f010004b: 8b 5d 08 mov 0x8(%ebp),%ebx cprintf("entering test_backtrace %d\n", x); f010004e: 53 push %ebx f010004f: 68 a0 18 10 f0 push $0xf01018a0 f0100054: e8 ce 08 00 00 call f0100927 if (x > 0) f0100059: 83 c4 10 add $0x10,%esp f010005c: 85 db test %ebx,%ebx f010005e: 7e 25 jle f0100085 test_backtrace(x-1); f0100060: 83 ec 0c sub $0xc,%esp f0100063: 8d 43 ff lea -0x1(%ebx),%eax f0100066: 50 push %eax f0100067: e8 d4 ff ff ff call f0100040 f010006c: 83 c4 10 add $0x10,%esp else mon_backtrace(0, 0, 0); cprintf("leaving test_backtrace %d\n", x); f010006f: 83 ec 08 sub $0x8,%esp f0100072: 53 push %ebx f0100073: 68 bc 18 10 f0 push $0xf01018bc f0100078: e8 aa 08 00 00 call f0100927 } f010007d: 83 c4 10 add $0x10,%esp f0100080: 8b 5d fc mov -0x4(%ebp),%ebx f0100083: c9 leave f0100084: c3 ret mon_backtrace(0, 0, 0); f0100085: 83 ec 04 sub $0x4,%esp f0100088: 6a 00 push $0x0 f010008a: 6a 00 push $0x0 f010008c: 6a 00 push $0x0 f010008e: e8 ff 06 00 00 call f0100792 f0100093: 83 c4 10 add $0x10,%esp f0100096: eb d7 jmp f010006f f0100098 : void i386_init(void) { f0100098: f3 0f 1e fb endbr32 f010009c: 55 push %ebp f010009d: 89 e5 mov %esp,%ebp f010009f: 83 ec 0c sub $0xc,%esp extern char edata[], end[]; // Before doing anything else, complete the ELF loading process. // Clear the uninitialized global data (BSS) section of our program. // This ensures that all static/global variables start out zero. memset(edata, 0, end - edata); f01000a2: b8 40 29 11 f0 mov $0xf0112940,%eax f01000a7: 2d 00 23 11 f0 sub $0xf0112300,%eax f01000ac: 50 push %eax f01000ad: 6a 00 push $0x0 f01000af: 68 00 23 11 f0 push $0xf0112300 f01000b4: e8 62 13 00 00 call f010141b // Initialize the console. // Can't call cprintf until after we do this! cons_init(); f01000b9: e8 af 04 00 00 call f010056d cprintf("6828 decimal is %o octal!\n", 6828); f01000be: 83 c4 08 add $0x8,%esp f01000c1: 68 ac 1a 00 00 push $0x1aac f01000c6: 68 d7 18 10 f0 push $0xf01018d7 f01000cb: e8 57 08 00 00 call f0100927 // Test the stack backtrace function (lab 1 only) test_backtrace(5); f01000d0: c7 04 24 05 00 00 00 movl $0x5,(%esp) f01000d7: e8 64 ff ff ff call f0100040 f01000dc: 83 c4 10 add $0x10,%esp // Drop into the kernel monitor. while (1) monitor(NULL); f01000df: 83 ec 0c sub $0xc,%esp f01000e2: 6a 00 push $0x0 f01000e4: e8 b3 06 00 00 call f010079c f01000e9: 83 c4 10 add $0x10,%esp f01000ec: eb f1 jmp f01000df f01000ee <_panic>: * Panic is called on unresolvable fatal errors. * It prints "panic: mesg", and then enters the kernel monitor. */ void _panic(const char *file, int line, const char *fmt,...) { f01000ee: f3 0f 1e fb endbr32 f01000f2: 55 push %ebp f01000f3: 89 e5 mov %esp,%ebp f01000f5: 56 push %esi f01000f6: 53 push %ebx f01000f7: 8b 75 10 mov 0x10(%ebp),%esi va_list ap; if (panicstr) f01000fa: 83 3d 44 29 11 f0 00 cmpl $0x0,0xf0112944 f0100101: 74 0f je f0100112 <_panic+0x24> va_end(ap); dead: /* break into the kernel monitor */ while (1) monitor(NULL); f0100103: 83 ec 0c sub $0xc,%esp f0100106: 6a 00 push $0x0 f0100108: e8 8f 06 00 00 call f010079c f010010d: 83 c4 10 add $0x10,%esp f0100110: eb f1 jmp f0100103 <_panic+0x15> panicstr = fmt; f0100112: 89 35 44 29 11 f0 mov %esi,0xf0112944 asm volatile("cli; cld"); f0100118: fa cli f0100119: fc cld va_start(ap, fmt); f010011a: 8d 5d 14 lea 0x14(%ebp),%ebx cprintf("kernel panic at %s:%d: ", file, line); f010011d: 83 ec 04 sub $0x4,%esp f0100120: ff 75 0c pushl 0xc(%ebp) f0100123: ff 75 08 pushl 0x8(%ebp) f0100126: 68 f2 18 10 f0 push $0xf01018f2 f010012b: e8 f7 07 00 00 call f0100927 vcprintf(fmt, ap); f0100130: 83 c4 08 add $0x8,%esp f0100133: 53 push %ebx f0100134: 56 push %esi f0100135: e8 c3 07 00 00 call f01008fd cprintf("\n"); f010013a: c7 04 24 2e 19 10 f0 movl $0xf010192e,(%esp) f0100141: e8 e1 07 00 00 call f0100927 f0100146: 83 c4 10 add $0x10,%esp f0100149: eb b8 jmp f0100103 <_panic+0x15> f010014b <_warn>: } /* like panic, but don't */ void _warn(const char *file, int line, const char *fmt,...) { f010014b: f3 0f 1e fb endbr32 f010014f: 55 push %ebp f0100150: 89 e5 mov %esp,%ebp f0100152: 53 push %ebx f0100153: 83 ec 08 sub $0x8,%esp va_list ap; va_start(ap, fmt); f0100156: 8d 5d 14 lea 0x14(%ebp),%ebx cprintf("kernel warning at %s:%d: ", file, line); f0100159: ff 75 0c pushl 0xc(%ebp) f010015c: ff 75 08 pushl 0x8(%ebp) f010015f: 68 0a 19 10 f0 push $0xf010190a f0100164: e8 be 07 00 00 call f0100927 vcprintf(fmt, ap); f0100169: 83 c4 08 add $0x8,%esp f010016c: 53 push %ebx f010016d: ff 75 10 pushl 0x10(%ebp) f0100170: e8 88 07 00 00 call f01008fd cprintf("\n"); f0100175: c7 04 24 2e 19 10 f0 movl $0xf010192e,(%esp) f010017c: e8 a6 07 00 00 call f0100927 va_end(ap); } f0100181: 83 c4 10 add $0x10,%esp f0100184: 8b 5d fc mov -0x4(%ebp),%ebx f0100187: c9 leave f0100188: c3 ret f0100189 : static bool serial_exists; static int serial_proc_data(void) { f0100189: f3 0f 1e fb endbr32 static inline uint8_t inb(int port) { uint8_t data; asm volatile("inb %w1,%0" : "=a" (data) : "d" (port)); f010018d: ba fd 03 00 00 mov $0x3fd,%edx f0100192: ec in (%dx),%al if (!(inb(COM1+COM_LSR) & COM_LSR_DATA)) f0100193: a8 01 test $0x1,%al f0100195: 74 0a je f01001a1 f0100197: ba f8 03 00 00 mov $0x3f8,%edx f010019c: ec in (%dx),%al return -1; return inb(COM1+COM_RX); f010019d: 0f b6 c0 movzbl %al,%eax f01001a0: c3 ret return -1; f01001a1: b8 ff ff ff ff mov $0xffffffff,%eax } f01001a6: c3 ret f01001a7 : // called by device interrupt routines to feed input characters // into the circular console input buffer. static void cons_intr(int (*proc)(void)) { f01001a7: 55 push %ebp f01001a8: 89 e5 mov %esp,%ebp f01001aa: 53 push %ebx f01001ab: 83 ec 04 sub $0x4,%esp f01001ae: 89 c3 mov %eax,%ebx int c; while ((c = (*proc)()) != -1) { f01001b0: ff d3 call *%ebx f01001b2: 83 f8 ff cmp $0xffffffff,%eax f01001b5: 74 29 je f01001e0 if (c == 0) f01001b7: 85 c0 test %eax,%eax f01001b9: 74 f5 je f01001b0 continue; cons.buf[cons.wpos++] = c; f01001bb: 8b 0d 24 25 11 f0 mov 0xf0112524,%ecx f01001c1: 8d 51 01 lea 0x1(%ecx),%edx f01001c4: 88 81 20 23 11 f0 mov %al,-0xfeedce0(%ecx) if (cons.wpos == CONSBUFSIZE) f01001ca: 81 fa 00 02 00 00 cmp $0x200,%edx cons.wpos = 0; f01001d0: b8 00 00 00 00 mov $0x0,%eax f01001d5: 0f 44 d0 cmove %eax,%edx f01001d8: 89 15 24 25 11 f0 mov %edx,0xf0112524 f01001de: eb d0 jmp f01001b0 } } f01001e0: 83 c4 04 add $0x4,%esp f01001e3: 5b pop %ebx f01001e4: 5d pop %ebp f01001e5: c3 ret f01001e6 : { f01001e6: f3 0f 1e fb endbr32 f01001ea: 55 push %ebp f01001eb: 89 e5 mov %esp,%ebp f01001ed: 53 push %ebx f01001ee: 83 ec 04 sub $0x4,%esp f01001f1: ba 64 00 00 00 mov $0x64,%edx f01001f6: ec in (%dx),%al if ((stat & KBS_DIB) == 0) f01001f7: a8 01 test $0x1,%al f01001f9: 0f 84 f2 00 00 00 je f01002f1 if (stat & KBS_TERR) f01001ff: a8 20 test $0x20,%al f0100201: 0f 85 f1 00 00 00 jne f01002f8 f0100207: ba 60 00 00 00 mov $0x60,%edx f010020c: ec in (%dx),%al f010020d: 89 c2 mov %eax,%edx if (data == 0xE0) { f010020f: 3c e0 cmp $0xe0,%al f0100211: 74 61 je f0100274 } else if (data & 0x80) { f0100213: 84 c0 test %al,%al f0100215: 78 70 js f0100287 } else if (shift & E0ESC) { f0100217: 8b 0d 00 23 11 f0 mov 0xf0112300,%ecx f010021d: f6 c1 40 test $0x40,%cl f0100220: 74 0e je f0100230 data |= 0x80; f0100222: 83 c8 80 or $0xffffff80,%eax f0100225: 89 c2 mov %eax,%edx shift &= ~E0ESC; f0100227: 83 e1 bf and $0xffffffbf,%ecx f010022a: 89 0d 00 23 11 f0 mov %ecx,0xf0112300 shift |= shiftcode[data]; f0100230: 0f b6 d2 movzbl %dl,%edx f0100233: 0f b6 82 80 1a 10 f0 movzbl -0xfefe580(%edx),%eax f010023a: 0b 05 00 23 11 f0 or 0xf0112300,%eax shift ^= togglecode[data]; f0100240: 0f b6 8a 80 19 10 f0 movzbl -0xfefe680(%edx),%ecx f0100247: 31 c8 xor %ecx,%eax f0100249: a3 00 23 11 f0 mov %eax,0xf0112300 c = charcode[shift & (CTL | SHIFT)][data]; f010024e: 89 c1 mov %eax,%ecx f0100250: 83 e1 03 and $0x3,%ecx f0100253: 8b 0c 8d 60 19 10 f0 mov -0xfefe6a0(,%ecx,4),%ecx f010025a: 0f b6 14 11 movzbl (%ecx,%edx,1),%edx f010025e: 0f b6 da movzbl %dl,%ebx if (shift & CAPSLOCK) { f0100261: a8 08 test $0x8,%al f0100263: 74 61 je f01002c6 if ('a' <= c && c <= 'z') f0100265: 89 da mov %ebx,%edx f0100267: 8d 4b 9f lea -0x61(%ebx),%ecx f010026a: 83 f9 19 cmp $0x19,%ecx f010026d: 77 4b ja f01002ba c += 'A' - 'a'; f010026f: 83 eb 20 sub $0x20,%ebx f0100272: eb 0c jmp f0100280 shift |= E0ESC; f0100274: 83 0d 00 23 11 f0 40 orl $0x40,0xf0112300 return 0; f010027b: bb 00 00 00 00 mov $0x0,%ebx } f0100280: 89 d8 mov %ebx,%eax f0100282: 8b 5d fc mov -0x4(%ebp),%ebx f0100285: c9 leave f0100286: c3 ret data = (shift & E0ESC ? data : data & 0x7F); f0100287: 8b 0d 00 23 11 f0 mov 0xf0112300,%ecx f010028d: 89 cb mov %ecx,%ebx f010028f: 83 e3 40 and $0x40,%ebx f0100292: 83 e0 7f and $0x7f,%eax f0100295: 85 db test %ebx,%ebx f0100297: 0f 44 d0 cmove %eax,%edx shift &= ~(shiftcode[data] | E0ESC); f010029a: 0f b6 d2 movzbl %dl,%edx f010029d: 0f b6 82 80 1a 10 f0 movzbl -0xfefe580(%edx),%eax f01002a4: 83 c8 40 or $0x40,%eax f01002a7: 0f b6 c0 movzbl %al,%eax f01002aa: f7 d0 not %eax f01002ac: 21 c8 and %ecx,%eax f01002ae: a3 00 23 11 f0 mov %eax,0xf0112300 return 0; f01002b3: bb 00 00 00 00 mov $0x0,%ebx f01002b8: eb c6 jmp f0100280 else if ('A' <= c && c <= 'Z') f01002ba: 83 ea 41 sub $0x41,%edx c += 'a' - 'A'; f01002bd: 8d 4b 20 lea 0x20(%ebx),%ecx f01002c0: 83 fa 1a cmp $0x1a,%edx f01002c3: 0f 42 d9 cmovb %ecx,%ebx if (!(~shift & (CTL | ALT)) && c == KEY_DEL) { f01002c6: f7 d0 not %eax f01002c8: a8 06 test $0x6,%al f01002ca: 75 b4 jne f0100280 f01002cc: 81 fb e9 00 00 00 cmp $0xe9,%ebx f01002d2: 75 ac jne f0100280 cprintf("Rebooting!\n"); f01002d4: 83 ec 0c sub $0xc,%esp f01002d7: 68 24 19 10 f0 push $0xf0101924 f01002dc: e8 46 06 00 00 call f0100927 } static inline void outb(int port, uint8_t data) { asm volatile("outb %0,%w1" : : "a" (data), "d" (port)); f01002e1: b8 03 00 00 00 mov $0x3,%eax f01002e6: ba 92 00 00 00 mov $0x92,%edx f01002eb: ee out %al,(%dx) } f01002ec: 83 c4 10 add $0x10,%esp f01002ef: eb 8f jmp f0100280 return -1; f01002f1: bb ff ff ff ff mov $0xffffffff,%ebx f01002f6: eb 88 jmp f0100280 return -1; f01002f8: bb ff ff ff ff mov $0xffffffff,%ebx f01002fd: eb 81 jmp f0100280 f01002ff : } // output a character to the console static void cons_putc(int c) { f01002ff: 55 push %ebp f0100300: 89 e5 mov %esp,%ebp f0100302: 57 push %edi f0100303: 56 push %esi f0100304: 53 push %ebx f0100305: 83 ec 1c sub $0x1c,%esp f0100308: 89 c1 mov %eax,%ecx for (i = 0; f010030a: be 00 00 00 00 mov $0x0,%esi asm volatile("inb %w1,%0" : "=a" (data) : "d" (port)); f010030f: bf fd 03 00 00 mov $0x3fd,%edi f0100314: bb 84 00 00 00 mov $0x84,%ebx f0100319: 89 fa mov %edi,%edx f010031b: ec in (%dx),%al !(inb(COM1 + COM_LSR) & COM_LSR_TXRDY) && i < 12800; f010031c: a8 20 test $0x20,%al f010031e: 75 13 jne f0100333 f0100320: 81 fe ff 31 00 00 cmp $0x31ff,%esi f0100326: 7f 0b jg f0100333 f0100328: 89 da mov %ebx,%edx f010032a: ec in (%dx),%al f010032b: ec in (%dx),%al f010032c: ec in (%dx),%al f010032d: ec in (%dx),%al i++) f010032e: 83 c6 01 add $0x1,%esi f0100331: eb e6 jmp f0100319 outb(COM1 + COM_TX, c); f0100333: 88 4d e7 mov %cl,-0x19(%ebp) asm volatile("outb %0,%w1" : : "a" (data), "d" (port)); f0100336: ba f8 03 00 00 mov $0x3f8,%edx f010033b: 89 c8 mov %ecx,%eax f010033d: ee out %al,(%dx) for (i = 0; !(inb(0x378+1) & 0x80) && i < 12800; i++) f010033e: be 00 00 00 00 mov $0x0,%esi asm volatile("inb %w1,%0" : "=a" (data) : "d" (port)); f0100343: bf 79 03 00 00 mov $0x379,%edi f0100348: bb 84 00 00 00 mov $0x84,%ebx f010034d: 89 fa mov %edi,%edx f010034f: ec in (%dx),%al f0100350: 81 fe ff 31 00 00 cmp $0x31ff,%esi f0100356: 7f 0f jg f0100367 f0100358: 84 c0 test %al,%al f010035a: 78 0b js f0100367 f010035c: 89 da mov %ebx,%edx f010035e: ec in (%dx),%al f010035f: ec in (%dx),%al f0100360: ec in (%dx),%al f0100361: ec in (%dx),%al f0100362: 83 c6 01 add $0x1,%esi f0100365: eb e6 jmp f010034d asm volatile("outb %0,%w1" : : "a" (data), "d" (port)); f0100367: ba 78 03 00 00 mov $0x378,%edx f010036c: 0f b6 45 e7 movzbl -0x19(%ebp),%eax f0100370: ee out %al,(%dx) f0100371: ba 7a 03 00 00 mov $0x37a,%edx f0100376: b8 0d 00 00 00 mov $0xd,%eax f010037b: ee out %al,(%dx) f010037c: b8 08 00 00 00 mov $0x8,%eax f0100381: ee out %al,(%dx) c |= 0x0700; f0100382: 89 c8 mov %ecx,%eax f0100384: 80 cc 07 or $0x7,%ah f0100387: f7 c1 00 ff ff ff test $0xffffff00,%ecx f010038d: 0f 44 c8 cmove %eax,%ecx switch (c & 0xff) { f0100390: 0f b6 c1 movzbl %cl,%eax f0100393: 80 f9 0a cmp $0xa,%cl f0100396: 0f 84 dd 00 00 00 je f0100479 f010039c: 83 f8 0a cmp $0xa,%eax f010039f: 7f 46 jg f01003e7 f01003a1: 83 f8 08 cmp $0x8,%eax f01003a4: 0f 84 a7 00 00 00 je f0100451 f01003aa: 83 f8 09 cmp $0x9,%eax f01003ad: 0f 85 d3 00 00 00 jne f0100486 cons_putc(' '); f01003b3: b8 20 00 00 00 mov $0x20,%eax f01003b8: e8 42 ff ff ff call f01002ff cons_putc(' '); f01003bd: b8 20 00 00 00 mov $0x20,%eax f01003c2: e8 38 ff ff ff call f01002ff cons_putc(' '); f01003c7: b8 20 00 00 00 mov $0x20,%eax f01003cc: e8 2e ff ff ff call f01002ff cons_putc(' '); f01003d1: b8 20 00 00 00 mov $0x20,%eax f01003d6: e8 24 ff ff ff call f01002ff cons_putc(' '); f01003db: b8 20 00 00 00 mov $0x20,%eax f01003e0: e8 1a ff ff ff call f01002ff break; f01003e5: eb 25 jmp f010040c switch (c & 0xff) { f01003e7: 83 f8 0d cmp $0xd,%eax f01003ea: 0f 85 96 00 00 00 jne f0100486 crt_pos -= (crt_pos % CRT_COLS); f01003f0: 0f b7 05 28 25 11 f0 movzwl 0xf0112528,%eax f01003f7: 69 c0 cd cc 00 00 imul $0xcccd,%eax,%eax f01003fd: c1 e8 16 shr $0x16,%eax f0100400: 8d 04 80 lea (%eax,%eax,4),%eax f0100403: c1 e0 04 shl $0x4,%eax f0100406: 66 a3 28 25 11 f0 mov %ax,0xf0112528 if (crt_pos >= CRT_SIZE) { f010040c: 66 81 3d 28 25 11 f0 cmpw $0x7cf,0xf0112528 f0100413: cf 07 f0100415: 0f 87 8e 00 00 00 ja f01004a9 outb(addr_6845, 14); f010041b: 8b 0d 30 25 11 f0 mov 0xf0112530,%ecx f0100421: b8 0e 00 00 00 mov $0xe,%eax f0100426: 89 ca mov %ecx,%edx f0100428: ee out %al,(%dx) outb(addr_6845 + 1, crt_pos >> 8); f0100429: 0f b7 1d 28 25 11 f0 movzwl 0xf0112528,%ebx f0100430: 8d 71 01 lea 0x1(%ecx),%esi f0100433: 89 d8 mov %ebx,%eax f0100435: 66 c1 e8 08 shr $0x8,%ax f0100439: 89 f2 mov %esi,%edx f010043b: ee out %al,(%dx) f010043c: b8 0f 00 00 00 mov $0xf,%eax f0100441: 89 ca mov %ecx,%edx f0100443: ee out %al,(%dx) f0100444: 89 d8 mov %ebx,%eax f0100446: 89 f2 mov %esi,%edx f0100448: ee out %al,(%dx) serial_putc(c); lpt_putc(c); cga_putc(c); } f0100449: 8d 65 f4 lea -0xc(%ebp),%esp f010044c: 5b pop %ebx f010044d: 5e pop %esi f010044e: 5f pop %edi f010044f: 5d pop %ebp f0100450: c3 ret if (crt_pos > 0) { f0100451: 0f b7 05 28 25 11 f0 movzwl 0xf0112528,%eax f0100458: 66 85 c0 test %ax,%ax f010045b: 74 be je f010041b crt_pos--; f010045d: 83 e8 01 sub $0x1,%eax f0100460: 66 a3 28 25 11 f0 mov %ax,0xf0112528 crt_buf[crt_pos] = (c & ~0xff) | ' '; f0100466: 0f b7 d0 movzwl %ax,%edx f0100469: b1 00 mov $0x0,%cl f010046b: 83 c9 20 or $0x20,%ecx f010046e: a1 2c 25 11 f0 mov 0xf011252c,%eax f0100473: 66 89 0c 50 mov %cx,(%eax,%edx,2) f0100477: eb 93 jmp f010040c crt_pos += CRT_COLS; f0100479: 66 83 05 28 25 11 f0 addw $0x50,0xf0112528 f0100480: 50 f0100481: e9 6a ff ff ff jmp f01003f0 crt_buf[crt_pos++] = c; /* write the character */ f0100486: 0f b7 05 28 25 11 f0 movzwl 0xf0112528,%eax f010048d: 8d 50 01 lea 0x1(%eax),%edx f0100490: 66 89 15 28 25 11 f0 mov %dx,0xf0112528 f0100497: 0f b7 c0 movzwl %ax,%eax f010049a: 8b 15 2c 25 11 f0 mov 0xf011252c,%edx f01004a0: 66 89 0c 42 mov %cx,(%edx,%eax,2) break; f01004a4: e9 63 ff ff ff jmp f010040c memmove(crt_buf, crt_buf + CRT_COLS, (CRT_SIZE - CRT_COLS) * sizeof(uint16_t)); f01004a9: a1 2c 25 11 f0 mov 0xf011252c,%eax f01004ae: 83 ec 04 sub $0x4,%esp f01004b1: 68 00 0f 00 00 push $0xf00 f01004b6: 8d 90 a0 00 00 00 lea 0xa0(%eax),%edx f01004bc: 52 push %edx f01004bd: 50 push %eax f01004be: e8 a4 0f 00 00 call f0101467 crt_buf[i] = 0x0700 | ' '; f01004c3: 8b 15 2c 25 11 f0 mov 0xf011252c,%edx f01004c9: 8d 82 00 0f 00 00 lea 0xf00(%edx),%eax f01004cf: 81 c2 a0 0f 00 00 add $0xfa0,%edx f01004d5: 83 c4 10 add $0x10,%esp f01004d8: 66 c7 00 20 07 movw $0x720,(%eax) f01004dd: 83 c0 02 add $0x2,%eax for (i = CRT_SIZE - CRT_COLS; i < CRT_SIZE; i++) f01004e0: 39 d0 cmp %edx,%eax f01004e2: 75 f4 jne f01004d8 crt_pos -= CRT_COLS; f01004e4: 66 83 2d 28 25 11 f0 subw $0x50,0xf0112528 f01004eb: 50 f01004ec: e9 2a ff ff ff jmp f010041b f01004f1 : { f01004f1: f3 0f 1e fb endbr32 if (serial_exists) f01004f5: 80 3d 34 25 11 f0 00 cmpb $0x0,0xf0112534 f01004fc: 75 01 jne f01004ff f01004fe: c3 ret { f01004ff: 55 push %ebp f0100500: 89 e5 mov %esp,%ebp f0100502: 83 ec 08 sub $0x8,%esp cons_intr(serial_proc_data); f0100505: b8 89 01 10 f0 mov $0xf0100189,%eax f010050a: e8 98 fc ff ff call f01001a7 } f010050f: c9 leave f0100510: c3 ret f0100511 : { f0100511: f3 0f 1e fb endbr32 f0100515: 55 push %ebp f0100516: 89 e5 mov %esp,%ebp f0100518: 83 ec 08 sub $0x8,%esp cons_intr(kbd_proc_data); f010051b: b8 e6 01 10 f0 mov $0xf01001e6,%eax f0100520: e8 82 fc ff ff call f01001a7 } f0100525: c9 leave f0100526: c3 ret f0100527 : { f0100527: f3 0f 1e fb endbr32 f010052b: 55 push %ebp f010052c: 89 e5 mov %esp,%ebp f010052e: 83 ec 08 sub $0x8,%esp serial_intr(); f0100531: e8 bb ff ff ff call f01004f1 kbd_intr(); f0100536: e8 d6 ff ff ff call f0100511 if (cons.rpos != cons.wpos) { f010053b: a1 20 25 11 f0 mov 0xf0112520,%eax return 0; f0100540: ba 00 00 00 00 mov $0x0,%edx if (cons.rpos != cons.wpos) { f0100545: 3b 05 24 25 11 f0 cmp 0xf0112524,%eax f010054b: 74 1c je f0100569 c = cons.buf[cons.rpos++]; f010054d: 8d 48 01 lea 0x1(%eax),%ecx f0100550: 0f b6 90 20 23 11 f0 movzbl -0xfeedce0(%eax),%edx cons.rpos = 0; f0100557: 3d ff 01 00 00 cmp $0x1ff,%eax f010055c: b8 00 00 00 00 mov $0x0,%eax f0100561: 0f 45 c1 cmovne %ecx,%eax f0100564: a3 20 25 11 f0 mov %eax,0xf0112520 } f0100569: 89 d0 mov %edx,%eax f010056b: c9 leave f010056c: c3 ret f010056d : // initialize the console devices void cons_init(void) { f010056d: f3 0f 1e fb endbr32 f0100571: 55 push %ebp f0100572: 89 e5 mov %esp,%ebp f0100574: 57 push %edi f0100575: 56 push %esi f0100576: 53 push %ebx f0100577: 83 ec 0c sub $0xc,%esp was = *cp; f010057a: 0f b7 15 00 80 0b f0 movzwl 0xf00b8000,%edx *cp = (uint16_t) 0xA55A; f0100581: 66 c7 05 00 80 0b f0 movw $0xa55a,0xf00b8000 f0100588: 5a a5 if (*cp != 0xA55A) { f010058a: 0f b7 05 00 80 0b f0 movzwl 0xf00b8000,%eax f0100591: 66 3d 5a a5 cmp $0xa55a,%ax f0100595: 0f 84 b7 00 00 00 je f0100652 addr_6845 = MONO_BASE; f010059b: c7 05 30 25 11 f0 b4 movl $0x3b4,0xf0112530 f01005a2: 03 00 00 cp = (uint16_t*) (KERNBASE + MONO_BUF); f01005a5: be 00 00 0b f0 mov $0xf00b0000,%esi outb(addr_6845, 14); f01005aa: 8b 3d 30 25 11 f0 mov 0xf0112530,%edi f01005b0: b8 0e 00 00 00 mov $0xe,%eax f01005b5: 89 fa mov %edi,%edx f01005b7: ee out %al,(%dx) pos = inb(addr_6845 + 1) << 8; f01005b8: 8d 4f 01 lea 0x1(%edi),%ecx asm volatile("inb %w1,%0" : "=a" (data) : "d" (port)); f01005bb: 89 ca mov %ecx,%edx f01005bd: ec in (%dx),%al f01005be: 0f b6 c0 movzbl %al,%eax f01005c1: c1 e0 08 shl $0x8,%eax f01005c4: 89 c3 mov %eax,%ebx asm volatile("outb %0,%w1" : : "a" (data), "d" (port)); f01005c6: b8 0f 00 00 00 mov $0xf,%eax f01005cb: 89 fa mov %edi,%edx f01005cd: ee out %al,(%dx) asm volatile("inb %w1,%0" : "=a" (data) : "d" (port)); f01005ce: 89 ca mov %ecx,%edx f01005d0: ec in (%dx),%al crt_buf = (uint16_t*) cp; f01005d1: 89 35 2c 25 11 f0 mov %esi,0xf011252c pos |= inb(addr_6845 + 1); f01005d7: 0f b6 c0 movzbl %al,%eax f01005da: 09 d8 or %ebx,%eax crt_pos = pos; f01005dc: 66 a3 28 25 11 f0 mov %ax,0xf0112528 asm volatile("outb %0,%w1" : : "a" (data), "d" (port)); f01005e2: bb 00 00 00 00 mov $0x0,%ebx f01005e7: b9 fa 03 00 00 mov $0x3fa,%ecx f01005ec: 89 d8 mov %ebx,%eax f01005ee: 89 ca mov %ecx,%edx f01005f0: ee out %al,(%dx) f01005f1: bf fb 03 00 00 mov $0x3fb,%edi f01005f6: b8 80 ff ff ff mov $0xffffff80,%eax f01005fb: 89 fa mov %edi,%edx f01005fd: ee out %al,(%dx) f01005fe: b8 0c 00 00 00 mov $0xc,%eax f0100603: ba f8 03 00 00 mov $0x3f8,%edx f0100608: ee out %al,(%dx) f0100609: be f9 03 00 00 mov $0x3f9,%esi f010060e: 89 d8 mov %ebx,%eax f0100610: 89 f2 mov %esi,%edx f0100612: ee out %al,(%dx) f0100613: b8 03 00 00 00 mov $0x3,%eax f0100618: 89 fa mov %edi,%edx f010061a: ee out %al,(%dx) f010061b: ba fc 03 00 00 mov $0x3fc,%edx f0100620: 89 d8 mov %ebx,%eax f0100622: ee out %al,(%dx) f0100623: b8 01 00 00 00 mov $0x1,%eax f0100628: 89 f2 mov %esi,%edx f010062a: ee out %al,(%dx) asm volatile("inb %w1,%0" : "=a" (data) : "d" (port)); f010062b: ba fd 03 00 00 mov $0x3fd,%edx f0100630: ec in (%dx),%al f0100631: 89 c3 mov %eax,%ebx serial_exists = (inb(COM1+COM_LSR) != 0xFF); f0100633: 3c ff cmp $0xff,%al f0100635: 0f 95 05 34 25 11 f0 setne 0xf0112534 f010063c: 89 ca mov %ecx,%edx f010063e: ec in (%dx),%al f010063f: ba f8 03 00 00 mov $0x3f8,%edx f0100644: ec in (%dx),%al cga_init(); kbd_init(); serial_init(); if (!serial_exists) f0100645: 80 fb ff cmp $0xff,%bl f0100648: 74 23 je f010066d cprintf("Serial port does not exist!\n"); } f010064a: 8d 65 f4 lea -0xc(%ebp),%esp f010064d: 5b pop %ebx f010064e: 5e pop %esi f010064f: 5f pop %edi f0100650: 5d pop %ebp f0100651: c3 ret *cp = was; f0100652: 66 89 15 00 80 0b f0 mov %dx,0xf00b8000 addr_6845 = CGA_BASE; f0100659: c7 05 30 25 11 f0 d4 movl $0x3d4,0xf0112530 f0100660: 03 00 00 cp = (uint16_t*) (KERNBASE + CGA_BUF); f0100663: be 00 80 0b f0 mov $0xf00b8000,%esi f0100668: e9 3d ff ff ff jmp f01005aa cprintf("Serial port does not exist!\n"); f010066d: 83 ec 0c sub $0xc,%esp f0100670: 68 30 19 10 f0 push $0xf0101930 f0100675: e8 ad 02 00 00 call f0100927 f010067a: 83 c4 10 add $0x10,%esp } f010067d: eb cb jmp f010064a f010067f : // `High'-level console I/O. Used by readline and cprintf. void cputchar(int c) { f010067f: f3 0f 1e fb endbr32 f0100683: 55 push %ebp f0100684: 89 e5 mov %esp,%ebp f0100686: 83 ec 08 sub $0x8,%esp cons_putc(c); f0100689: 8b 45 08 mov 0x8(%ebp),%eax f010068c: e8 6e fc ff ff call f01002ff } f0100691: c9 leave f0100692: c3 ret f0100693 : int getchar(void) { f0100693: f3 0f 1e fb endbr32 f0100697: 55 push %ebp f0100698: 89 e5 mov %esp,%ebp f010069a: 83 ec 08 sub $0x8,%esp int c; while ((c = cons_getc()) == 0) f010069d: e8 85 fe ff ff call f0100527 f01006a2: 85 c0 test %eax,%eax f01006a4: 74 f7 je f010069d /* do nothing */; return c; } f01006a6: c9 leave f01006a7: c3 ret f01006a8 : int iscons(int fdnum) { f01006a8: f3 0f 1e fb endbr32 // used by readline return 1; } f01006ac: b8 01 00 00 00 mov $0x1,%eax f01006b1: c3 ret f01006b2 : /***** Implementations of basic kernel monitor commands *****/ int mon_help(int argc, char **argv, struct Trapframe *tf) { f01006b2: f3 0f 1e fb endbr32 f01006b6: 55 push %ebp f01006b7: 89 e5 mov %esp,%ebp f01006b9: 83 ec 0c sub $0xc,%esp int i; for (i = 0; i < ARRAY_SIZE(commands); i++) cprintf("%s - %s\n", commands[i].name, commands[i].desc); f01006bc: 68 80 1b 10 f0 push $0xf0101b80 f01006c1: 68 9e 1b 10 f0 push $0xf0101b9e f01006c6: 68 a3 1b 10 f0 push $0xf0101ba3 f01006cb: e8 57 02 00 00 call f0100927 f01006d0: 83 c4 0c add $0xc,%esp f01006d3: 68 0c 1c 10 f0 push $0xf0101c0c f01006d8: 68 ac 1b 10 f0 push $0xf0101bac f01006dd: 68 a3 1b 10 f0 push $0xf0101ba3 f01006e2: e8 40 02 00 00 call f0100927 return 0; } f01006e7: b8 00 00 00 00 mov $0x0,%eax f01006ec: c9 leave f01006ed: c3 ret f01006ee : int mon_kerninfo(int argc, char **argv, struct Trapframe *tf) { f01006ee: f3 0f 1e fb endbr32 f01006f2: 55 push %ebp f01006f3: 89 e5 mov %esp,%ebp f01006f5: 83 ec 14 sub $0x14,%esp extern char _start[], entry[], etext[], edata[], end[]; cprintf("Special kernel symbols:\n"); f01006f8: 68 b5 1b 10 f0 push $0xf0101bb5 f01006fd: e8 25 02 00 00 call f0100927 cprintf(" _start %08x (phys)\n", _start); f0100702: 83 c4 08 add $0x8,%esp f0100705: 68 0c 00 10 00 push $0x10000c f010070a: 68 34 1c 10 f0 push $0xf0101c34 f010070f: e8 13 02 00 00 call f0100927 cprintf(" entry %08x (virt) %08x (phys)\n", entry, entry - KERNBASE); f0100714: 83 c4 0c add $0xc,%esp f0100717: 68 0c 00 10 00 push $0x10000c f010071c: 68 0c 00 10 f0 push $0xf010000c f0100721: 68 5c 1c 10 f0 push $0xf0101c5c f0100726: e8 fc 01 00 00 call f0100927 cprintf(" etext %08x (virt) %08x (phys)\n", etext, etext - KERNBASE); f010072b: 83 c4 0c add $0xc,%esp f010072e: 68 8d 18 10 00 push $0x10188d f0100733: 68 8d 18 10 f0 push $0xf010188d f0100738: 68 80 1c 10 f0 push $0xf0101c80 f010073d: e8 e5 01 00 00 call f0100927 cprintf(" edata %08x (virt) %08x (phys)\n", edata, edata - KERNBASE); f0100742: 83 c4 0c add $0xc,%esp f0100745: 68 00 23 11 00 push $0x112300 f010074a: 68 00 23 11 f0 push $0xf0112300 f010074f: 68 a4 1c 10 f0 push $0xf0101ca4 f0100754: e8 ce 01 00 00 call f0100927 cprintf(" end %08x (virt) %08x (phys)\n", end, end - KERNBASE); f0100759: 83 c4 0c add $0xc,%esp f010075c: 68 40 29 11 00 push $0x112940 f0100761: 68 40 29 11 f0 push $0xf0112940 f0100766: 68 c8 1c 10 f0 push $0xf0101cc8 f010076b: e8 b7 01 00 00 call f0100927 cprintf("Kernel executable memory footprint: %dKB\n", f0100770: 83 c4 08 add $0x8,%esp ROUNDUP(end - entry, 1024) / 1024); f0100773: b8 40 29 11 f0 mov $0xf0112940,%eax f0100778: 2d 0d fc 0f f0 sub $0xf00ffc0d,%eax cprintf("Kernel executable memory footprint: %dKB\n", f010077d: c1 f8 0a sar $0xa,%eax f0100780: 50 push %eax f0100781: 68 ec 1c 10 f0 push $0xf0101cec f0100786: e8 9c 01 00 00 call f0100927 return 0; } f010078b: b8 00 00 00 00 mov $0x0,%eax f0100790: c9 leave f0100791: c3 ret f0100792 : int mon_backtrace(int argc, char **argv, struct Trapframe *tf) { f0100792: f3 0f 1e fb endbr32 // Your code here. return 0; } f0100796: b8 00 00 00 00 mov $0x0,%eax f010079b: c3 ret f010079c : return 0; } void monitor(struct Trapframe *tf) { f010079c: f3 0f 1e fb endbr32 f01007a0: 55 push %ebp f01007a1: 89 e5 mov %esp,%ebp f01007a3: 57 push %edi f01007a4: 56 push %esi f01007a5: 53 push %ebx f01007a6: 83 ec 58 sub $0x58,%esp char *buf; cprintf("Welcome to the JOS kernel monitor!\n"); f01007a9: 68 18 1d 10 f0 push $0xf0101d18 f01007ae: e8 74 01 00 00 call f0100927 cprintf("Type 'help' for a list of commands.\n"); f01007b3: c7 04 24 3c 1d 10 f0 movl $0xf0101d3c,(%esp) f01007ba: e8 68 01 00 00 call f0100927 f01007bf: 83 c4 10 add $0x10,%esp f01007c2: e9 cf 00 00 00 jmp f0100896 while (*buf && strchr(WHITESPACE, *buf)) f01007c7: 83 ec 08 sub $0x8,%esp f01007ca: 0f be c0 movsbl %al,%eax f01007cd: 50 push %eax f01007ce: 68 d2 1b 10 f0 push $0xf0101bd2 f01007d3: e8 fe 0b 00 00 call f01013d6 f01007d8: 83 c4 10 add $0x10,%esp f01007db: 85 c0 test %eax,%eax f01007dd: 74 6c je f010084b *buf++ = 0; f01007df: c6 03 00 movb $0x0,(%ebx) f01007e2: 89 f7 mov %esi,%edi f01007e4: 8d 5b 01 lea 0x1(%ebx),%ebx f01007e7: 89 fe mov %edi,%esi while (*buf && strchr(WHITESPACE, *buf)) f01007e9: 0f b6 03 movzbl (%ebx),%eax f01007ec: 84 c0 test %al,%al f01007ee: 75 d7 jne f01007c7 argv[argc] = 0; f01007f0: c7 44 b5 a8 00 00 00 movl $0x0,-0x58(%ebp,%esi,4) f01007f7: 00 if (argc == 0) f01007f8: 85 f6 test %esi,%esi f01007fa: 0f 84 96 00 00 00 je f0100896 if (strcmp(argv[0], commands[i].name) == 0) f0100800: 83 ec 08 sub $0x8,%esp f0100803: 68 9e 1b 10 f0 push $0xf0101b9e f0100808: ff 75 a8 pushl -0x58(%ebp) f010080b: e8 60 0b 00 00 call f0101370 f0100810: 83 c4 10 add $0x10,%esp f0100813: 85 c0 test %eax,%eax f0100815: 0f 84 a7 00 00 00 je f01008c2 f010081b: 83 ec 08 sub $0x8,%esp f010081e: 68 ac 1b 10 f0 push $0xf0101bac f0100823: ff 75 a8 pushl -0x58(%ebp) f0100826: e8 45 0b 00 00 call f0101370 f010082b: 83 c4 10 add $0x10,%esp f010082e: 85 c0 test %eax,%eax f0100830: 0f 84 87 00 00 00 je f01008bd cprintf("Unknown command '%s'\n", argv[0]); f0100836: 83 ec 08 sub $0x8,%esp f0100839: ff 75 a8 pushl -0x58(%ebp) f010083c: 68 f4 1b 10 f0 push $0xf0101bf4 f0100841: e8 e1 00 00 00 call f0100927 return 0; f0100846: 83 c4 10 add $0x10,%esp f0100849: eb 4b jmp f0100896 if (*buf == 0) f010084b: 80 3b 00 cmpb $0x0,(%ebx) f010084e: 74 a0 je f01007f0 if (argc == MAXARGS-1) { f0100850: 83 fe 0f cmp $0xf,%esi f0100853: 74 2f je f0100884 argv[argc++] = buf; f0100855: 8d 7e 01 lea 0x1(%esi),%edi f0100858: 89 5c b5 a8 mov %ebx,-0x58(%ebp,%esi,4) while (*buf && !strchr(WHITESPACE, *buf)) f010085c: 0f b6 03 movzbl (%ebx),%eax f010085f: 84 c0 test %al,%al f0100861: 74 84 je f01007e7 f0100863: 83 ec 08 sub $0x8,%esp f0100866: 0f be c0 movsbl %al,%eax f0100869: 50 push %eax f010086a: 68 d2 1b 10 f0 push $0xf0101bd2 f010086f: e8 62 0b 00 00 call f01013d6 f0100874: 83 c4 10 add $0x10,%esp f0100877: 85 c0 test %eax,%eax f0100879: 0f 85 68 ff ff ff jne f01007e7 buf++; f010087f: 83 c3 01 add $0x1,%ebx f0100882: eb d8 jmp f010085c cprintf("Too many arguments (max %d)\n", MAXARGS); f0100884: 83 ec 08 sub $0x8,%esp f0100887: 6a 10 push $0x10 f0100889: 68 d7 1b 10 f0 push $0xf0101bd7 f010088e: e8 94 00 00 00 call f0100927 return 0; f0100893: 83 c4 10 add $0x10,%esp while (1) { buf = readline("K> "); f0100896: 83 ec 0c sub $0xc,%esp f0100899: 68 ce 1b 10 f0 push $0xf0101bce f010089e: e8 e5 08 00 00 call f0101188 f01008a3: 89 c3 mov %eax,%ebx if (buf != NULL) f01008a5: 83 c4 10 add $0x10,%esp f01008a8: 85 c0 test %eax,%eax f01008aa: 74 ea je f0100896 argv[argc] = 0; f01008ac: c7 45 a8 00 00 00 00 movl $0x0,-0x58(%ebp) argc = 0; f01008b3: be 00 00 00 00 mov $0x0,%esi f01008b8: e9 2c ff ff ff jmp f01007e9 for (i = 0; i < ARRAY_SIZE(commands); i++) { f01008bd: b8 01 00 00 00 mov $0x1,%eax return commands[i].func(argc, argv, tf); f01008c2: 83 ec 04 sub $0x4,%esp f01008c5: 8d 04 40 lea (%eax,%eax,2),%eax f01008c8: ff 75 08 pushl 0x8(%ebp) f01008cb: 8d 55 a8 lea -0x58(%ebp),%edx f01008ce: 52 push %edx f01008cf: 56 push %esi f01008d0: ff 14 85 6c 1d 10 f0 call *-0xfefe294(,%eax,4) if (runcmd(buf, tf) < 0) f01008d7: 83 c4 10 add $0x10,%esp f01008da: 85 c0 test %eax,%eax f01008dc: 79 b8 jns f0100896 break; } } f01008de: 8d 65 f4 lea -0xc(%ebp),%esp f01008e1: 5b pop %ebx f01008e2: 5e pop %esi f01008e3: 5f pop %edi f01008e4: 5d pop %ebp f01008e5: c3 ret f01008e6 : #include static void putch(int ch, int *cnt) { f01008e6: f3 0f 1e fb endbr32 f01008ea: 55 push %ebp f01008eb: 89 e5 mov %esp,%ebp f01008ed: 83 ec 14 sub $0x14,%esp cputchar(ch); f01008f0: ff 75 08 pushl 0x8(%ebp) f01008f3: e8 87 fd ff ff call f010067f *cnt++; } f01008f8: 83 c4 10 add $0x10,%esp f01008fb: c9 leave f01008fc: c3 ret f01008fd : int vcprintf(const char *fmt, va_list ap) { f01008fd: f3 0f 1e fb endbr32 f0100901: 55 push %ebp f0100902: 89 e5 mov %esp,%ebp f0100904: 83 ec 18 sub $0x18,%esp int cnt = 0; f0100907: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) vprintfmt((void*)putch, &cnt, fmt, ap); f010090e: ff 75 0c pushl 0xc(%ebp) f0100911: ff 75 08 pushl 0x8(%ebp) f0100914: 8d 45 f4 lea -0xc(%ebp),%eax f0100917: 50 push %eax f0100918: 68 e6 08 10 f0 push $0xf01008e6 f010091d: e8 d3 03 00 00 call f0100cf5 return cnt; } f0100922: 8b 45 f4 mov -0xc(%ebp),%eax f0100925: c9 leave f0100926: c3 ret f0100927 : int cprintf(const char *fmt, ...) { f0100927: f3 0f 1e fb endbr32 f010092b: 55 push %ebp f010092c: 89 e5 mov %esp,%ebp f010092e: 83 ec 10 sub $0x10,%esp va_list ap; int cnt; va_start(ap, fmt); f0100931: 8d 45 0c lea 0xc(%ebp),%eax cnt = vcprintf(fmt, ap); f0100934: 50 push %eax f0100935: ff 75 08 pushl 0x8(%ebp) f0100938: e8 c0 ff ff ff call f01008fd va_end(ap); return cnt; } f010093d: c9 leave f010093e: c3 ret f010093f : // will exit setting left = 118, right = 554. // static void stab_binsearch(const struct Stab *stabs, int *region_left, int *region_right, int type, uintptr_t addr) { f010093f: 55 push %ebp f0100940: 89 e5 mov %esp,%ebp f0100942: 57 push %edi f0100943: 56 push %esi f0100944: 53 push %ebx f0100945: 83 ec 14 sub $0x14,%esp f0100948: 89 45 ec mov %eax,-0x14(%ebp) f010094b: 89 55 e4 mov %edx,-0x1c(%ebp) f010094e: 89 4d e0 mov %ecx,-0x20(%ebp) f0100951: 8b 75 08 mov 0x8(%ebp),%esi int l = *region_left, r = *region_right, any_matches = 0; f0100954: 8b 1a mov (%edx),%ebx f0100956: 8b 01 mov (%ecx),%eax f0100958: 89 45 f0 mov %eax,-0x10(%ebp) f010095b: c7 45 e8 00 00 00 00 movl $0x0,-0x18(%ebp) while (l <= r) { f0100962: eb 23 jmp f0100987 // search for earliest stab with right type while (m >= l && stabs[m].n_type != type) m--; if (m < l) { // no match in [l, m] l = true_m + 1; f0100964: 8d 5f 01 lea 0x1(%edi),%ebx continue; f0100967: eb 1e jmp f0100987 } // actual binary search any_matches = 1; if (stabs[m].n_value < addr) { f0100969: 8d 14 40 lea (%eax,%eax,2),%edx f010096c: 8b 4d ec mov -0x14(%ebp),%ecx f010096f: 8b 54 91 08 mov 0x8(%ecx,%edx,4),%edx f0100973: 3b 55 0c cmp 0xc(%ebp),%edx f0100976: 73 46 jae f01009be *region_left = m; f0100978: 8b 5d e4 mov -0x1c(%ebp),%ebx f010097b: 89 03 mov %eax,(%ebx) l = true_m + 1; f010097d: 8d 5f 01 lea 0x1(%edi),%ebx any_matches = 1; f0100980: c7 45 e8 01 00 00 00 movl $0x1,-0x18(%ebp) while (l <= r) { f0100987: 3b 5d f0 cmp -0x10(%ebp),%ebx f010098a: 7f 5f jg f01009eb int true_m = (l + r) / 2, m = true_m; f010098c: 8b 45 f0 mov -0x10(%ebp),%eax f010098f: 8d 14 03 lea (%ebx,%eax,1),%edx f0100992: 89 d0 mov %edx,%eax f0100994: c1 e8 1f shr $0x1f,%eax f0100997: 01 d0 add %edx,%eax f0100999: 89 c7 mov %eax,%edi f010099b: d1 ff sar %edi f010099d: 83 e0 fe and $0xfffffffe,%eax f01009a0: 01 f8 add %edi,%eax f01009a2: 8b 4d ec mov -0x14(%ebp),%ecx f01009a5: 8d 54 81 04 lea 0x4(%ecx,%eax,4),%edx f01009a9: 89 f8 mov %edi,%eax while (m >= l && stabs[m].n_type != type) f01009ab: 39 c3 cmp %eax,%ebx f01009ad: 7f b5 jg f0100964 f01009af: 0f b6 0a movzbl (%edx),%ecx f01009b2: 83 ea 0c sub $0xc,%edx f01009b5: 39 f1 cmp %esi,%ecx f01009b7: 74 b0 je f0100969 m--; f01009b9: 83 e8 01 sub $0x1,%eax f01009bc: eb ed jmp f01009ab } else if (stabs[m].n_value > addr) { f01009be: 3b 55 0c cmp 0xc(%ebp),%edx f01009c1: 76 14 jbe f01009d7 *region_right = m - 1; f01009c3: 83 e8 01 sub $0x1,%eax f01009c6: 89 45 f0 mov %eax,-0x10(%ebp) f01009c9: 8b 7d e0 mov -0x20(%ebp),%edi f01009cc: 89 07 mov %eax,(%edi) any_matches = 1; f01009ce: c7 45 e8 01 00 00 00 movl $0x1,-0x18(%ebp) f01009d5: eb b0 jmp f0100987 r = m - 1; } else { // exact match for 'addr', but continue loop to find // *region_right *region_left = m; f01009d7: 8b 7d e4 mov -0x1c(%ebp),%edi f01009da: 89 07 mov %eax,(%edi) l = m; addr++; f01009dc: 83 45 0c 01 addl $0x1,0xc(%ebp) f01009e0: 89 c3 mov %eax,%ebx any_matches = 1; f01009e2: c7 45 e8 01 00 00 00 movl $0x1,-0x18(%ebp) f01009e9: eb 9c jmp f0100987 } } if (!any_matches) f01009eb: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) f01009ef: 75 15 jne f0100a06 *region_right = *region_left - 1; f01009f1: 8b 45 e4 mov -0x1c(%ebp),%eax f01009f4: 8b 00 mov (%eax),%eax f01009f6: 83 e8 01 sub $0x1,%eax f01009f9: 8b 7d e0 mov -0x20(%ebp),%edi f01009fc: 89 07 mov %eax,(%edi) l > *region_left && stabs[l].n_type != type; l--) /* do nothing */; *region_left = l; } } f01009fe: 83 c4 14 add $0x14,%esp f0100a01: 5b pop %ebx f0100a02: 5e pop %esi f0100a03: 5f pop %edi f0100a04: 5d pop %ebp f0100a05: c3 ret for (l = *region_right; f0100a06: 8b 45 e0 mov -0x20(%ebp),%eax f0100a09: 8b 00 mov (%eax),%eax l > *region_left && stabs[l].n_type != type; f0100a0b: 8b 7d e4 mov -0x1c(%ebp),%edi f0100a0e: 8b 0f mov (%edi),%ecx f0100a10: 8d 14 40 lea (%eax,%eax,2),%edx f0100a13: 8b 7d ec mov -0x14(%ebp),%edi f0100a16: 8d 54 97 04 lea 0x4(%edi,%edx,4),%edx for (l = *region_right; f0100a1a: eb 03 jmp f0100a1f l--) f0100a1c: 83 e8 01 sub $0x1,%eax for (l = *region_right; f0100a1f: 39 c1 cmp %eax,%ecx f0100a21: 7d 0a jge f0100a2d l > *region_left && stabs[l].n_type != type; f0100a23: 0f b6 1a movzbl (%edx),%ebx f0100a26: 83 ea 0c sub $0xc,%edx f0100a29: 39 f3 cmp %esi,%ebx f0100a2b: 75 ef jne f0100a1c *region_left = l; f0100a2d: 8b 7d e4 mov -0x1c(%ebp),%edi f0100a30: 89 07 mov %eax,(%edi) } f0100a32: eb ca jmp f01009fe f0100a34 : // negative if not. But even if it returns negative it has stored some // information into '*info'. // int debuginfo_eip(uintptr_t addr, struct Eipdebuginfo *info) { f0100a34: f3 0f 1e fb endbr32 f0100a38: 55 push %ebp f0100a39: 89 e5 mov %esp,%ebp f0100a3b: 57 push %edi f0100a3c: 56 push %esi f0100a3d: 53 push %ebx f0100a3e: 83 ec 1c sub $0x1c,%esp f0100a41: 8b 7d 08 mov 0x8(%ebp),%edi f0100a44: 8b 75 0c mov 0xc(%ebp),%esi const struct Stab *stabs, *stab_end; const char *stabstr, *stabstr_end; int lfile, rfile, lfun, rfun, lline, rline; // Initialize *info info->eip_file = ""; f0100a47: c7 06 7c 1d 10 f0 movl $0xf0101d7c,(%esi) info->eip_line = 0; f0100a4d: c7 46 04 00 00 00 00 movl $0x0,0x4(%esi) info->eip_fn_name = ""; f0100a54: c7 46 08 7c 1d 10 f0 movl $0xf0101d7c,0x8(%esi) info->eip_fn_namelen = 9; f0100a5b: c7 46 0c 09 00 00 00 movl $0x9,0xc(%esi) info->eip_fn_addr = addr; f0100a62: 89 7e 10 mov %edi,0x10(%esi) info->eip_fn_narg = 0; f0100a65: c7 46 14 00 00 00 00 movl $0x0,0x14(%esi) // Find the relevant set of stabs if (addr >= ULIM) { f0100a6c: 81 ff ff ff 7f ef cmp $0xef7fffff,%edi f0100a72: 0f 86 db 00 00 00 jbe f0100b53 // Can't search for user-level addresses yet! panic("User address"); } // String table validity checks if (stabstr_end <= stabstr || stabstr_end[-1] != 0) f0100a78: b8 d7 7b 10 f0 mov $0xf0107bd7,%eax f0100a7d: 3d 2d 62 10 f0 cmp $0xf010622d,%eax f0100a82: 0f 86 5e 01 00 00 jbe f0100be6 f0100a88: 80 3d d6 7b 10 f0 00 cmpb $0x0,0xf0107bd6 f0100a8f: 0f 85 58 01 00 00 jne f0100bed // 'eip'. First, we find the basic source file containing 'eip'. // Then, we look in that source file for the function. Then we look // for the line number. // Search the entire set of stabs for the source file (type N_SO). lfile = 0; f0100a95: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) rfile = (stab_end - stabs) - 1; f0100a9c: b8 2c 62 10 f0 mov $0xf010622c,%eax f0100aa1: 2d b4 1f 10 f0 sub $0xf0101fb4,%eax f0100aa6: c1 f8 02 sar $0x2,%eax f0100aa9: 69 c0 ab aa aa aa imul $0xaaaaaaab,%eax,%eax f0100aaf: 83 e8 01 sub $0x1,%eax f0100ab2: 89 45 e0 mov %eax,-0x20(%ebp) stab_binsearch(stabs, &lfile, &rfile, N_SO, addr); f0100ab5: 83 ec 08 sub $0x8,%esp f0100ab8: 57 push %edi f0100ab9: 6a 64 push $0x64 f0100abb: 8d 4d e0 lea -0x20(%ebp),%ecx f0100abe: 8d 55 e4 lea -0x1c(%ebp),%edx f0100ac1: b8 b4 1f 10 f0 mov $0xf0101fb4,%eax f0100ac6: e8 74 fe ff ff call f010093f if (lfile == 0) f0100acb: 8b 45 e4 mov -0x1c(%ebp),%eax f0100ace: 83 c4 10 add $0x10,%esp f0100ad1: 85 c0 test %eax,%eax f0100ad3: 0f 84 1b 01 00 00 je f0100bf4 return -1; // Search within that file's stabs for the function definition // (N_FUN). lfun = lfile; f0100ad9: 89 45 dc mov %eax,-0x24(%ebp) rfun = rfile; f0100adc: 8b 45 e0 mov -0x20(%ebp),%eax f0100adf: 89 45 d8 mov %eax,-0x28(%ebp) stab_binsearch(stabs, &lfun, &rfun, N_FUN, addr); f0100ae2: 83 ec 08 sub $0x8,%esp f0100ae5: 57 push %edi f0100ae6: 6a 24 push $0x24 f0100ae8: 8d 4d d8 lea -0x28(%ebp),%ecx f0100aeb: 8d 55 dc lea -0x24(%ebp),%edx f0100aee: b8 b4 1f 10 f0 mov $0xf0101fb4,%eax f0100af3: e8 47 fe ff ff call f010093f if (lfun <= rfun) { f0100af8: 8b 5d dc mov -0x24(%ebp),%ebx f0100afb: 83 c4 10 add $0x10,%esp f0100afe: 3b 5d d8 cmp -0x28(%ebp),%ebx f0100b01: 7f 64 jg f0100b67 // stabs[lfun] points to the function name // in the string table, but check bounds just in case. if (stabs[lfun].n_strx < stabstr_end - stabstr) f0100b03: 8d 04 5b lea (%ebx,%ebx,2),%eax f0100b06: c1 e0 02 shl $0x2,%eax f0100b09: 8d 90 b4 1f 10 f0 lea -0xfefe04c(%eax),%edx f0100b0f: 8b 88 b4 1f 10 f0 mov -0xfefe04c(%eax),%ecx f0100b15: b8 d7 7b 10 f0 mov $0xf0107bd7,%eax f0100b1a: 2d 2d 62 10 f0 sub $0xf010622d,%eax f0100b1f: 39 c1 cmp %eax,%ecx f0100b21: 73 09 jae f0100b2c info->eip_fn_name = stabstr + stabs[lfun].n_strx; f0100b23: 81 c1 2d 62 10 f0 add $0xf010622d,%ecx f0100b29: 89 4e 08 mov %ecx,0x8(%esi) info->eip_fn_addr = stabs[lfun].n_value; f0100b2c: 8b 42 08 mov 0x8(%edx),%eax f0100b2f: 89 46 10 mov %eax,0x10(%esi) info->eip_fn_addr = addr; lline = lfile; rline = rfile; } // Ignore stuff after the colon. info->eip_fn_namelen = strfind(info->eip_fn_name, ':') - info->eip_fn_name; f0100b32: 83 ec 08 sub $0x8,%esp f0100b35: 6a 3a push $0x3a f0100b37: ff 76 08 pushl 0x8(%esi) f0100b3a: e8 bc 08 00 00 call f01013fb f0100b3f: 2b 46 08 sub 0x8(%esi),%eax f0100b42: 89 46 0c mov %eax,0xc(%esi) // Search backwards from the line number for the relevant filename // stab. // We can't just use the "lfile" stab because inlined functions // can interpolate code from a different file! // Such included source files use the N_SOL stab type. while (lline >= lfile f0100b45: 8b 4d e4 mov -0x1c(%ebp),%ecx f0100b48: 8d 04 5b lea (%ebx,%ebx,2),%eax f0100b4b: c1 e0 02 shl $0x2,%eax f0100b4e: 83 c4 10 add $0x10,%esp f0100b51: eb 22 jmp f0100b75 panic("User address"); f0100b53: 83 ec 04 sub $0x4,%esp f0100b56: 68 86 1d 10 f0 push $0xf0101d86 f0100b5b: 6a 7f push $0x7f f0100b5d: 68 93 1d 10 f0 push $0xf0101d93 f0100b62: e8 87 f5 ff ff call f01000ee <_panic> info->eip_fn_addr = addr; f0100b67: 89 7e 10 mov %edi,0x10(%esi) lline = lfile; f0100b6a: 8b 5d e4 mov -0x1c(%ebp),%ebx f0100b6d: eb c3 jmp f0100b32 && stabs[lline].n_type != N_SOL && (stabs[lline].n_type != N_SO || !stabs[lline].n_value)) lline--; f0100b6f: 83 eb 01 sub $0x1,%ebx f0100b72: 83 e8 0c sub $0xc,%eax while (lline >= lfile f0100b75: 39 d9 cmp %ebx,%ecx f0100b77: 7f 3a jg f0100bb3 && stabs[lline].n_type != N_SOL f0100b79: 0f b6 90 b8 1f 10 f0 movzbl -0xfefe048(%eax),%edx f0100b80: 80 fa 84 cmp $0x84,%dl f0100b83: 74 0e je f0100b93 && (stabs[lline].n_type != N_SO || !stabs[lline].n_value)) f0100b85: 80 fa 64 cmp $0x64,%dl f0100b88: 75 e5 jne f0100b6f f0100b8a: 83 b8 bc 1f 10 f0 00 cmpl $0x0,-0xfefe044(%eax) f0100b91: 74 dc je f0100b6f if (lline >= lfile && stabs[lline].n_strx < stabstr_end - stabstr) f0100b93: 8d 04 5b lea (%ebx,%ebx,2),%eax f0100b96: 8b 14 85 b4 1f 10 f0 mov -0xfefe04c(,%eax,4),%edx f0100b9d: b8 d7 7b 10 f0 mov $0xf0107bd7,%eax f0100ba2: 2d 2d 62 10 f0 sub $0xf010622d,%eax f0100ba7: 39 c2 cmp %eax,%edx f0100ba9: 73 08 jae f0100bb3 info->eip_file = stabstr + stabs[lline].n_strx; f0100bab: 81 c2 2d 62 10 f0 add $0xf010622d,%edx f0100bb1: 89 16 mov %edx,(%esi) // Set eip_fn_narg to the number of arguments taken by the function, // or 0 if there was no containing function. if (lfun < rfun) f0100bb3: 8b 45 dc mov -0x24(%ebp),%eax f0100bb6: 8b 4d d8 mov -0x28(%ebp),%ecx for (lline = lfun + 1; lline < rfun && stabs[lline].n_type == N_PSYM; lline++) info->eip_fn_narg++; return 0; f0100bb9: ba 00 00 00 00 mov $0x0,%edx if (lfun < rfun) f0100bbe: 39 c8 cmp %ecx,%eax f0100bc0: 7d 3e jge f0100c00 for (lline = lfun + 1; f0100bc2: 83 c0 01 add $0x1,%eax f0100bc5: eb 07 jmp f0100bce info->eip_fn_narg++; f0100bc7: 83 46 14 01 addl $0x1,0x14(%esi) lline++) f0100bcb: 83 c0 01 add $0x1,%eax for (lline = lfun + 1; f0100bce: 39 c1 cmp %eax,%ecx f0100bd0: 74 29 je f0100bfb lline < rfun && stabs[lline].n_type == N_PSYM; f0100bd2: 8d 14 40 lea (%eax,%eax,2),%edx f0100bd5: 80 3c 95 b8 1f 10 f0 cmpb $0xa0,-0xfefe048(,%edx,4) f0100bdc: a0 f0100bdd: 74 e8 je f0100bc7 return 0; f0100bdf: ba 00 00 00 00 mov $0x0,%edx f0100be4: eb 1a jmp f0100c00 return -1; f0100be6: ba ff ff ff ff mov $0xffffffff,%edx f0100beb: eb 13 jmp f0100c00 f0100bed: ba ff ff ff ff mov $0xffffffff,%edx f0100bf2: eb 0c jmp f0100c00 return -1; f0100bf4: ba ff ff ff ff mov $0xffffffff,%edx f0100bf9: eb 05 jmp f0100c00 return 0; f0100bfb: ba 00 00 00 00 mov $0x0,%edx } f0100c00: 89 d0 mov %edx,%eax f0100c02: 8d 65 f4 lea -0xc(%ebp),%esp f0100c05: 5b pop %ebx f0100c06: 5e pop %esi f0100c07: 5f pop %edi f0100c08: 5d pop %ebp f0100c09: c3 ret f0100c0a : * using specified putch function and associated pointer putdat. */ static void printnum(void (*putch)(int, void*), void *putdat, unsigned long long num, unsigned base, int width, int padc) { f0100c0a: 55 push %ebp f0100c0b: 89 e5 mov %esp,%ebp f0100c0d: 57 push %edi f0100c0e: 56 push %esi f0100c0f: 53 push %ebx f0100c10: 83 ec 1c sub $0x1c,%esp f0100c13: 89 c7 mov %eax,%edi f0100c15: 89 d6 mov %edx,%esi f0100c17: 8b 45 08 mov 0x8(%ebp),%eax f0100c1a: 8b 55 0c mov 0xc(%ebp),%edx f0100c1d: 89 d1 mov %edx,%ecx f0100c1f: 89 c2 mov %eax,%edx f0100c21: 89 45 d8 mov %eax,-0x28(%ebp) f0100c24: 89 4d dc mov %ecx,-0x24(%ebp) f0100c27: 8b 45 10 mov 0x10(%ebp),%eax f0100c2a: 8b 5d 14 mov 0x14(%ebp),%ebx // first recursively print all preceding (more significant) digits if (num >= base) { f0100c2d: 89 45 e0 mov %eax,-0x20(%ebp) f0100c30: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) f0100c37: 39 c2 cmp %eax,%edx f0100c39: 1b 4d e4 sbb -0x1c(%ebp),%ecx f0100c3c: 72 3e jb f0100c7c printnum(putch, putdat, num / base, base, width - 1, padc); f0100c3e: 83 ec 0c sub $0xc,%esp f0100c41: ff 75 18 pushl 0x18(%ebp) f0100c44: 83 eb 01 sub $0x1,%ebx f0100c47: 53 push %ebx f0100c48: 50 push %eax f0100c49: 83 ec 08 sub $0x8,%esp f0100c4c: ff 75 e4 pushl -0x1c(%ebp) f0100c4f: ff 75 e0 pushl -0x20(%ebp) f0100c52: ff 75 dc pushl -0x24(%ebp) f0100c55: ff 75 d8 pushl -0x28(%ebp) f0100c58: e8 d3 09 00 00 call f0101630 <__udivdi3> f0100c5d: 83 c4 18 add $0x18,%esp f0100c60: 52 push %edx f0100c61: 50 push %eax f0100c62: 89 f2 mov %esi,%edx f0100c64: 89 f8 mov %edi,%eax f0100c66: e8 9f ff ff ff call f0100c0a f0100c6b: 83 c4 20 add $0x20,%esp f0100c6e: eb 13 jmp f0100c83 } else { // print any needed pad characters before first digit while (--width > 0) putch(padc, putdat); f0100c70: 83 ec 08 sub $0x8,%esp f0100c73: 56 push %esi f0100c74: ff 75 18 pushl 0x18(%ebp) f0100c77: ff d7 call *%edi f0100c79: 83 c4 10 add $0x10,%esp while (--width > 0) f0100c7c: 83 eb 01 sub $0x1,%ebx f0100c7f: 85 db test %ebx,%ebx f0100c81: 7f ed jg f0100c70 } // then print this (the least significant) digit putch("0123456789abcdef"[num % base], putdat); f0100c83: 83 ec 08 sub $0x8,%esp f0100c86: 56 push %esi f0100c87: 83 ec 04 sub $0x4,%esp f0100c8a: ff 75 e4 pushl -0x1c(%ebp) f0100c8d: ff 75 e0 pushl -0x20(%ebp) f0100c90: ff 75 dc pushl -0x24(%ebp) f0100c93: ff 75 d8 pushl -0x28(%ebp) f0100c96: e8 a5 0a 00 00 call f0101740 <__umoddi3> f0100c9b: 83 c4 14 add $0x14,%esp f0100c9e: 0f be 80 a1 1d 10 f0 movsbl -0xfefe25f(%eax),%eax f0100ca5: 50 push %eax f0100ca6: ff d7 call *%edi } f0100ca8: 83 c4 10 add $0x10,%esp f0100cab: 8d 65 f4 lea -0xc(%ebp),%esp f0100cae: 5b pop %ebx f0100caf: 5e pop %esi f0100cb0: 5f pop %edi f0100cb1: 5d pop %ebp f0100cb2: c3 ret f0100cb3 : int cnt; }; static void sprintputch(int ch, struct sprintbuf *b) { f0100cb3: f3 0f 1e fb endbr32 f0100cb7: 55 push %ebp f0100cb8: 89 e5 mov %esp,%ebp f0100cba: 8b 45 0c mov 0xc(%ebp),%eax b->cnt++; f0100cbd: 83 40 08 01 addl $0x1,0x8(%eax) if (b->buf < b->ebuf) f0100cc1: 8b 10 mov (%eax),%edx f0100cc3: 3b 50 04 cmp 0x4(%eax),%edx f0100cc6: 73 0a jae f0100cd2 *b->buf++ = ch; f0100cc8: 8d 4a 01 lea 0x1(%edx),%ecx f0100ccb: 89 08 mov %ecx,(%eax) f0100ccd: 8b 45 08 mov 0x8(%ebp),%eax f0100cd0: 88 02 mov %al,(%edx) } f0100cd2: 5d pop %ebp f0100cd3: c3 ret f0100cd4 : { f0100cd4: f3 0f 1e fb endbr32 f0100cd8: 55 push %ebp f0100cd9: 89 e5 mov %esp,%ebp f0100cdb: 83 ec 08 sub $0x8,%esp va_start(ap, fmt); f0100cde: 8d 45 14 lea 0x14(%ebp),%eax vprintfmt(putch, putdat, fmt, ap); f0100ce1: 50 push %eax f0100ce2: ff 75 10 pushl 0x10(%ebp) f0100ce5: ff 75 0c pushl 0xc(%ebp) f0100ce8: ff 75 08 pushl 0x8(%ebp) f0100ceb: e8 05 00 00 00 call f0100cf5 } f0100cf0: 83 c4 10 add $0x10,%esp f0100cf3: c9 leave f0100cf4: c3 ret f0100cf5 : { f0100cf5: f3 0f 1e fb endbr32 f0100cf9: 55 push %ebp f0100cfa: 89 e5 mov %esp,%ebp f0100cfc: 57 push %edi f0100cfd: 56 push %esi f0100cfe: 53 push %ebx f0100cff: 83 ec 3c sub $0x3c,%esp f0100d02: 8b 75 08 mov 0x8(%ebp),%esi f0100d05: 8b 5d 0c mov 0xc(%ebp),%ebx f0100d08: 8b 7d 10 mov 0x10(%ebp),%edi f0100d0b: e9 5d 03 00 00 jmp f010106d padc = ' '; f0100d10: c6 45 d3 20 movb $0x20,-0x2d(%ebp) altflag = 0; f0100d14: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) precision = -1; f0100d1b: c7 45 d8 ff ff ff ff movl $0xffffffff,-0x28(%ebp) width = -1; f0100d22: c7 45 d4 ff ff ff ff movl $0xffffffff,-0x2c(%ebp) lflag = 0; f0100d29: b9 00 00 00 00 mov $0x0,%ecx switch (ch = *(unsigned char *) fmt++) { f0100d2e: 8d 47 01 lea 0x1(%edi),%eax f0100d31: 89 45 e4 mov %eax,-0x1c(%ebp) f0100d34: 0f b6 17 movzbl (%edi),%edx f0100d37: 8d 42 dd lea -0x23(%edx),%eax f0100d3a: 3c 55 cmp $0x55,%al f0100d3c: 0f 87 ae 03 00 00 ja f01010f0 f0100d42: 0f b6 c0 movzbl %al,%eax f0100d45: 3e ff 24 85 30 1e 10 notrack jmp *-0xfefe1d0(,%eax,4) f0100d4c: f0 f0100d4d: 8b 7d e4 mov -0x1c(%ebp),%edi padc = '-'; f0100d50: c6 45 d3 2d movb $0x2d,-0x2d(%ebp) f0100d54: eb d8 jmp f0100d2e switch (ch = *(unsigned char *) fmt++) { f0100d56: 8b 7d e4 mov -0x1c(%ebp),%edi f0100d59: c6 45 d3 30 movb $0x30,-0x2d(%ebp) f0100d5d: eb cf jmp f0100d2e f0100d5f: 0f b6 d2 movzbl %dl,%edx f0100d62: 8b 7d e4 mov -0x1c(%ebp),%edi for (precision = 0; ; ++fmt) { f0100d65: b8 00 00 00 00 mov $0x0,%eax f0100d6a: 89 4d e4 mov %ecx,-0x1c(%ebp) precision = precision * 10 + ch - '0'; f0100d6d: 8d 04 80 lea (%eax,%eax,4),%eax f0100d70: 8d 44 42 d0 lea -0x30(%edx,%eax,2),%eax ch = *fmt; f0100d74: 0f be 17 movsbl (%edi),%edx if (ch < '0' || ch > '9') f0100d77: 8d 4a d0 lea -0x30(%edx),%ecx f0100d7a: 83 f9 09 cmp $0x9,%ecx f0100d7d: 77 55 ja f0100dd4 for (precision = 0; ; ++fmt) { f0100d7f: 83 c7 01 add $0x1,%edi precision = precision * 10 + ch - '0'; f0100d82: eb e9 jmp f0100d6d precision = va_arg(ap, int); f0100d84: 8b 45 14 mov 0x14(%ebp),%eax f0100d87: 8b 00 mov (%eax),%eax f0100d89: 89 45 d8 mov %eax,-0x28(%ebp) f0100d8c: 8b 45 14 mov 0x14(%ebp),%eax f0100d8f: 8d 40 04 lea 0x4(%eax),%eax f0100d92: 89 45 14 mov %eax,0x14(%ebp) switch (ch = *(unsigned char *) fmt++) { f0100d95: 8b 7d e4 mov -0x1c(%ebp),%edi if (width < 0) f0100d98: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp) f0100d9c: 79 90 jns f0100d2e width = precision, precision = -1; f0100d9e: 8b 45 d8 mov -0x28(%ebp),%eax f0100da1: 89 45 d4 mov %eax,-0x2c(%ebp) f0100da4: c7 45 d8 ff ff ff ff movl $0xffffffff,-0x28(%ebp) f0100dab: eb 81 jmp f0100d2e f0100dad: 8b 45 d4 mov -0x2c(%ebp),%eax f0100db0: 85 c0 test %eax,%eax f0100db2: ba 00 00 00 00 mov $0x0,%edx f0100db7: 0f 49 d0 cmovns %eax,%edx f0100dba: 89 55 d4 mov %edx,-0x2c(%ebp) switch (ch = *(unsigned char *) fmt++) { f0100dbd: 8b 7d e4 mov -0x1c(%ebp),%edi goto reswitch; f0100dc0: e9 69 ff ff ff jmp f0100d2e switch (ch = *(unsigned char *) fmt++) { f0100dc5: 8b 7d e4 mov -0x1c(%ebp),%edi altflag = 1; f0100dc8: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp) goto reswitch; f0100dcf: e9 5a ff ff ff jmp f0100d2e f0100dd4: 8b 4d e4 mov -0x1c(%ebp),%ecx f0100dd7: 89 45 d8 mov %eax,-0x28(%ebp) f0100dda: eb bc jmp f0100d98 lflag++; f0100ddc: 83 c1 01 add $0x1,%ecx switch (ch = *(unsigned char *) fmt++) { f0100ddf: 8b 7d e4 mov -0x1c(%ebp),%edi goto reswitch; f0100de2: e9 47 ff ff ff jmp f0100d2e putch(va_arg(ap, int), putdat); f0100de7: 8b 45 14 mov 0x14(%ebp),%eax f0100dea: 8d 78 04 lea 0x4(%eax),%edi f0100ded: 83 ec 08 sub $0x8,%esp f0100df0: 53 push %ebx f0100df1: ff 30 pushl (%eax) f0100df3: ff d6 call *%esi break; f0100df5: 83 c4 10 add $0x10,%esp putch(va_arg(ap, int), putdat); f0100df8: 89 7d 14 mov %edi,0x14(%ebp) break; f0100dfb: e9 6a 02 00 00 jmp f010106a err = va_arg(ap, int); f0100e00: 8b 45 14 mov 0x14(%ebp),%eax f0100e03: 8d 78 04 lea 0x4(%eax),%edi f0100e06: 8b 00 mov (%eax),%eax f0100e08: 99 cltd f0100e09: 31 d0 xor %edx,%eax f0100e0b: 29 d0 sub %edx,%eax if (err >= MAXERROR || (p = error_string[err]) == NULL) f0100e0d: 83 f8 06 cmp $0x6,%eax f0100e10: 7f 23 jg f0100e35 f0100e12: 8b 14 85 88 1f 10 f0 mov -0xfefe078(,%eax,4),%edx f0100e19: 85 d2 test %edx,%edx f0100e1b: 74 18 je f0100e35 printfmt(putch, putdat, "%s", p); f0100e1d: 52 push %edx f0100e1e: 68 c2 1d 10 f0 push $0xf0101dc2 f0100e23: 53 push %ebx f0100e24: 56 push %esi f0100e25: e8 aa fe ff ff call f0100cd4 f0100e2a: 83 c4 10 add $0x10,%esp err = va_arg(ap, int); f0100e2d: 89 7d 14 mov %edi,0x14(%ebp) f0100e30: e9 35 02 00 00 jmp f010106a printfmt(putch, putdat, "error %d", err); f0100e35: 50 push %eax f0100e36: 68 b9 1d 10 f0 push $0xf0101db9 f0100e3b: 53 push %ebx f0100e3c: 56 push %esi f0100e3d: e8 92 fe ff ff call f0100cd4 f0100e42: 83 c4 10 add $0x10,%esp err = va_arg(ap, int); f0100e45: 89 7d 14 mov %edi,0x14(%ebp) printfmt(putch, putdat, "error %d", err); f0100e48: e9 1d 02 00 00 jmp f010106a if ((p = va_arg(ap, char *)) == NULL) f0100e4d: 8b 45 14 mov 0x14(%ebp),%eax f0100e50: 83 c0 04 add $0x4,%eax f0100e53: 89 45 c8 mov %eax,-0x38(%ebp) f0100e56: 8b 45 14 mov 0x14(%ebp),%eax f0100e59: 8b 10 mov (%eax),%edx p = "(null)"; f0100e5b: 85 d2 test %edx,%edx f0100e5d: b8 b2 1d 10 f0 mov $0xf0101db2,%eax f0100e62: 0f 45 c2 cmovne %edx,%eax f0100e65: 89 45 cc mov %eax,-0x34(%ebp) if (width > 0 && padc != '-') f0100e68: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp) f0100e6c: 7e 06 jle f0100e74 f0100e6e: 80 7d d3 2d cmpb $0x2d,-0x2d(%ebp) f0100e72: 75 0d jne f0100e81 for (width -= strnlen(p, precision); width > 0; width--) f0100e74: 8b 45 cc mov -0x34(%ebp),%eax f0100e77: 89 c7 mov %eax,%edi f0100e79: 03 45 d4 add -0x2c(%ebp),%eax f0100e7c: 89 45 d4 mov %eax,-0x2c(%ebp) f0100e7f: eb 55 jmp f0100ed6 f0100e81: 83 ec 08 sub $0x8,%esp f0100e84: ff 75 d8 pushl -0x28(%ebp) f0100e87: ff 75 cc pushl -0x34(%ebp) f0100e8a: e8 fb 03 00 00 call f010128a f0100e8f: 8b 55 d4 mov -0x2c(%ebp),%edx f0100e92: 29 c2 sub %eax,%edx f0100e94: 89 55 c4 mov %edx,-0x3c(%ebp) f0100e97: 83 c4 10 add $0x10,%esp f0100e9a: 89 d7 mov %edx,%edi putch(padc, putdat); f0100e9c: 0f be 45 d3 movsbl -0x2d(%ebp),%eax f0100ea0: 89 45 d4 mov %eax,-0x2c(%ebp) for (width -= strnlen(p, precision); width > 0; width--) f0100ea3: 85 ff test %edi,%edi f0100ea5: 7e 11 jle f0100eb8 putch(padc, putdat); f0100ea7: 83 ec 08 sub $0x8,%esp f0100eaa: 53 push %ebx f0100eab: ff 75 d4 pushl -0x2c(%ebp) f0100eae: ff d6 call *%esi for (width -= strnlen(p, precision); width > 0; width--) f0100eb0: 83 ef 01 sub $0x1,%edi f0100eb3: 83 c4 10 add $0x10,%esp f0100eb6: eb eb jmp f0100ea3 f0100eb8: 8b 55 c4 mov -0x3c(%ebp),%edx f0100ebb: 85 d2 test %edx,%edx f0100ebd: b8 00 00 00 00 mov $0x0,%eax f0100ec2: 0f 49 c2 cmovns %edx,%eax f0100ec5: 29 c2 sub %eax,%edx f0100ec7: 89 55 d4 mov %edx,-0x2c(%ebp) f0100eca: eb a8 jmp f0100e74 putch(ch, putdat); f0100ecc: 83 ec 08 sub $0x8,%esp f0100ecf: 53 push %ebx f0100ed0: 52 push %edx f0100ed1: ff d6 call *%esi f0100ed3: 83 c4 10 add $0x10,%esp f0100ed6: 8b 4d d4 mov -0x2c(%ebp),%ecx f0100ed9: 29 f9 sub %edi,%ecx for (; (ch = *p++) != '\0' && (precision < 0 || --precision >= 0); width--) f0100edb: 83 c7 01 add $0x1,%edi f0100ede: 0f b6 47 ff movzbl -0x1(%edi),%eax f0100ee2: 0f be d0 movsbl %al,%edx f0100ee5: 85 d2 test %edx,%edx f0100ee7: 74 4b je f0100f34 f0100ee9: 83 7d d8 00 cmpl $0x0,-0x28(%ebp) f0100eed: 78 06 js f0100ef5 f0100eef: 83 6d d8 01 subl $0x1,-0x28(%ebp) f0100ef3: 78 1e js f0100f13 if (altflag && (ch < ' ' || ch > '~')) f0100ef5: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) f0100ef9: 74 d1 je f0100ecc f0100efb: 0f be c0 movsbl %al,%eax f0100efe: 83 e8 20 sub $0x20,%eax f0100f01: 83 f8 5e cmp $0x5e,%eax f0100f04: 76 c6 jbe f0100ecc putch('?', putdat); f0100f06: 83 ec 08 sub $0x8,%esp f0100f09: 53 push %ebx f0100f0a: 6a 3f push $0x3f f0100f0c: ff d6 call *%esi f0100f0e: 83 c4 10 add $0x10,%esp f0100f11: eb c3 jmp f0100ed6 f0100f13: 89 cf mov %ecx,%edi f0100f15: eb 0e jmp f0100f25 putch(' ', putdat); f0100f17: 83 ec 08 sub $0x8,%esp f0100f1a: 53 push %ebx f0100f1b: 6a 20 push $0x20 f0100f1d: ff d6 call *%esi for (; width > 0; width--) f0100f1f: 83 ef 01 sub $0x1,%edi f0100f22: 83 c4 10 add $0x10,%esp f0100f25: 85 ff test %edi,%edi f0100f27: 7f ee jg f0100f17 if ((p = va_arg(ap, char *)) == NULL) f0100f29: 8b 45 c8 mov -0x38(%ebp),%eax f0100f2c: 89 45 14 mov %eax,0x14(%ebp) f0100f2f: e9 36 01 00 00 jmp f010106a f0100f34: 89 cf mov %ecx,%edi f0100f36: eb ed jmp f0100f25 if (lflag >= 2) f0100f38: 83 f9 01 cmp $0x1,%ecx f0100f3b: 7f 1f jg f0100f5c else if (lflag) f0100f3d: 85 c9 test %ecx,%ecx f0100f3f: 74 67 je f0100fa8 return va_arg(*ap, long); f0100f41: 8b 45 14 mov 0x14(%ebp),%eax f0100f44: 8b 00 mov (%eax),%eax f0100f46: 89 45 d8 mov %eax,-0x28(%ebp) f0100f49: 89 c1 mov %eax,%ecx f0100f4b: c1 f9 1f sar $0x1f,%ecx f0100f4e: 89 4d dc mov %ecx,-0x24(%ebp) f0100f51: 8b 45 14 mov 0x14(%ebp),%eax f0100f54: 8d 40 04 lea 0x4(%eax),%eax f0100f57: 89 45 14 mov %eax,0x14(%ebp) f0100f5a: eb 17 jmp f0100f73 return va_arg(*ap, long long); f0100f5c: 8b 45 14 mov 0x14(%ebp),%eax f0100f5f: 8b 50 04 mov 0x4(%eax),%edx f0100f62: 8b 00 mov (%eax),%eax f0100f64: 89 45 d8 mov %eax,-0x28(%ebp) f0100f67: 89 55 dc mov %edx,-0x24(%ebp) f0100f6a: 8b 45 14 mov 0x14(%ebp),%eax f0100f6d: 8d 40 08 lea 0x8(%eax),%eax f0100f70: 89 45 14 mov %eax,0x14(%ebp) if ((long long) num < 0) { f0100f73: 8b 55 d8 mov -0x28(%ebp),%edx f0100f76: 8b 4d dc mov -0x24(%ebp),%ecx base = 10; f0100f79: b8 0a 00 00 00 mov $0xa,%eax if ((long long) num < 0) { f0100f7e: 85 c9 test %ecx,%ecx f0100f80: 0f 89 ca 00 00 00 jns f0101050 putch('-', putdat); f0100f86: 83 ec 08 sub $0x8,%esp f0100f89: 53 push %ebx f0100f8a: 6a 2d push $0x2d f0100f8c: ff d6 call *%esi num = -(long long) num; f0100f8e: 8b 55 d8 mov -0x28(%ebp),%edx f0100f91: 8b 4d dc mov -0x24(%ebp),%ecx f0100f94: f7 da neg %edx f0100f96: 83 d1 00 adc $0x0,%ecx f0100f99: f7 d9 neg %ecx f0100f9b: 83 c4 10 add $0x10,%esp base = 10; f0100f9e: b8 0a 00 00 00 mov $0xa,%eax f0100fa3: e9 a8 00 00 00 jmp f0101050 return va_arg(*ap, int); f0100fa8: 8b 45 14 mov 0x14(%ebp),%eax f0100fab: 8b 00 mov (%eax),%eax f0100fad: 89 45 d8 mov %eax,-0x28(%ebp) f0100fb0: 99 cltd f0100fb1: 89 55 dc mov %edx,-0x24(%ebp) f0100fb4: 8b 45 14 mov 0x14(%ebp),%eax f0100fb7: 8d 40 04 lea 0x4(%eax),%eax f0100fba: 89 45 14 mov %eax,0x14(%ebp) f0100fbd: eb b4 jmp f0100f73 if (lflag >= 2) f0100fbf: 83 f9 01 cmp $0x1,%ecx f0100fc2: 7f 1b jg f0100fdf else if (lflag) f0100fc4: 85 c9 test %ecx,%ecx f0100fc6: 74 2c je f0100ff4 return va_arg(*ap, unsigned long); f0100fc8: 8b 45 14 mov 0x14(%ebp),%eax f0100fcb: 8b 10 mov (%eax),%edx f0100fcd: b9 00 00 00 00 mov $0x0,%ecx f0100fd2: 8d 40 04 lea 0x4(%eax),%eax f0100fd5: 89 45 14 mov %eax,0x14(%ebp) base = 10; f0100fd8: b8 0a 00 00 00 mov $0xa,%eax return va_arg(*ap, unsigned long); f0100fdd: eb 71 jmp f0101050 return va_arg(*ap, unsigned long long); f0100fdf: 8b 45 14 mov 0x14(%ebp),%eax f0100fe2: 8b 10 mov (%eax),%edx f0100fe4: 8b 48 04 mov 0x4(%eax),%ecx f0100fe7: 8d 40 08 lea 0x8(%eax),%eax f0100fea: 89 45 14 mov %eax,0x14(%ebp) base = 10; f0100fed: b8 0a 00 00 00 mov $0xa,%eax return va_arg(*ap, unsigned long long); f0100ff2: eb 5c jmp f0101050 return va_arg(*ap, unsigned int); f0100ff4: 8b 45 14 mov 0x14(%ebp),%eax f0100ff7: 8b 10 mov (%eax),%edx f0100ff9: b9 00 00 00 00 mov $0x0,%ecx f0100ffe: 8d 40 04 lea 0x4(%eax),%eax f0101001: 89 45 14 mov %eax,0x14(%ebp) base = 10; f0101004: b8 0a 00 00 00 mov $0xa,%eax return va_arg(*ap, unsigned int); f0101009: eb 45 jmp f0101050 putch('X', putdat); f010100b: 83 ec 08 sub $0x8,%esp f010100e: 53 push %ebx f010100f: 6a 58 push $0x58 f0101011: ff d6 call *%esi putch('X', putdat); f0101013: 83 c4 08 add $0x8,%esp f0101016: 53 push %ebx f0101017: 6a 58 push $0x58 f0101019: ff d6 call *%esi putch('X', putdat); f010101b: 83 c4 08 add $0x8,%esp f010101e: 53 push %ebx f010101f: 6a 58 push $0x58 f0101021: ff d6 call *%esi break; f0101023: 83 c4 10 add $0x10,%esp f0101026: eb 42 jmp f010106a putch('0', putdat); f0101028: 83 ec 08 sub $0x8,%esp f010102b: 53 push %ebx f010102c: 6a 30 push $0x30 f010102e: ff d6 call *%esi putch('x', putdat); f0101030: 83 c4 08 add $0x8,%esp f0101033: 53 push %ebx f0101034: 6a 78 push $0x78 f0101036: ff d6 call *%esi num = (unsigned long long) f0101038: 8b 45 14 mov 0x14(%ebp),%eax f010103b: 8b 10 mov (%eax),%edx f010103d: b9 00 00 00 00 mov $0x0,%ecx goto number; f0101042: 83 c4 10 add $0x10,%esp (uintptr_t) va_arg(ap, void *); f0101045: 8d 40 04 lea 0x4(%eax),%eax f0101048: 89 45 14 mov %eax,0x14(%ebp) base = 16; f010104b: b8 10 00 00 00 mov $0x10,%eax printnum(putch, putdat, num, base, width, padc); f0101050: 83 ec 0c sub $0xc,%esp f0101053: 0f be 7d d3 movsbl -0x2d(%ebp),%edi f0101057: 57 push %edi f0101058: ff 75 d4 pushl -0x2c(%ebp) f010105b: 50 push %eax f010105c: 51 push %ecx f010105d: 52 push %edx f010105e: 89 da mov %ebx,%edx f0101060: 89 f0 mov %esi,%eax f0101062: e8 a3 fb ff ff call f0100c0a break; f0101067: 83 c4 20 add $0x20,%esp if ((p = va_arg(ap, char *)) == NULL) f010106a: 8b 7d e4 mov -0x1c(%ebp),%edi while ((ch = *(unsigned char *) fmt++) != '%') { f010106d: 83 c7 01 add $0x1,%edi f0101070: 0f b6 47 ff movzbl -0x1(%edi),%eax f0101074: 83 f8 25 cmp $0x25,%eax f0101077: 0f 84 93 fc ff ff je f0100d10 if (ch == '\0') f010107d: 85 c0 test %eax,%eax f010107f: 0f 84 8b 00 00 00 je f0101110 putch(ch, putdat); f0101085: 83 ec 08 sub $0x8,%esp f0101088: 53 push %ebx f0101089: 50 push %eax f010108a: ff d6 call *%esi f010108c: 83 c4 10 add $0x10,%esp f010108f: eb dc jmp f010106d if (lflag >= 2) f0101091: 83 f9 01 cmp $0x1,%ecx f0101094: 7f 1b jg f01010b1 else if (lflag) f0101096: 85 c9 test %ecx,%ecx f0101098: 74 2c je f01010c6 return va_arg(*ap, unsigned long); f010109a: 8b 45 14 mov 0x14(%ebp),%eax f010109d: 8b 10 mov (%eax),%edx f010109f: b9 00 00 00 00 mov $0x0,%ecx f01010a4: 8d 40 04 lea 0x4(%eax),%eax f01010a7: 89 45 14 mov %eax,0x14(%ebp) base = 16; f01010aa: b8 10 00 00 00 mov $0x10,%eax return va_arg(*ap, unsigned long); f01010af: eb 9f jmp f0101050 return va_arg(*ap, unsigned long long); f01010b1: 8b 45 14 mov 0x14(%ebp),%eax f01010b4: 8b 10 mov (%eax),%edx f01010b6: 8b 48 04 mov 0x4(%eax),%ecx f01010b9: 8d 40 08 lea 0x8(%eax),%eax f01010bc: 89 45 14 mov %eax,0x14(%ebp) base = 16; f01010bf: b8 10 00 00 00 mov $0x10,%eax return va_arg(*ap, unsigned long long); f01010c4: eb 8a jmp f0101050 return va_arg(*ap, unsigned int); f01010c6: 8b 45 14 mov 0x14(%ebp),%eax f01010c9: 8b 10 mov (%eax),%edx f01010cb: b9 00 00 00 00 mov $0x0,%ecx f01010d0: 8d 40 04 lea 0x4(%eax),%eax f01010d3: 89 45 14 mov %eax,0x14(%ebp) base = 16; f01010d6: b8 10 00 00 00 mov $0x10,%eax return va_arg(*ap, unsigned int); f01010db: e9 70 ff ff ff jmp f0101050 putch(ch, putdat); f01010e0: 83 ec 08 sub $0x8,%esp f01010e3: 53 push %ebx f01010e4: 6a 25 push $0x25 f01010e6: ff d6 call *%esi break; f01010e8: 83 c4 10 add $0x10,%esp f01010eb: e9 7a ff ff ff jmp f010106a putch('%', putdat); f01010f0: 83 ec 08 sub $0x8,%esp f01010f3: 53 push %ebx f01010f4: 6a 25 push $0x25 f01010f6: ff d6 call *%esi for (fmt--; fmt[-1] != '%'; fmt--) f01010f8: 83 c4 10 add $0x10,%esp f01010fb: 89 f8 mov %edi,%eax f01010fd: 80 78 ff 25 cmpb $0x25,-0x1(%eax) f0101101: 74 05 je f0101108 f0101103: 83 e8 01 sub $0x1,%eax f0101106: eb f5 jmp f01010fd f0101108: 89 45 e4 mov %eax,-0x1c(%ebp) f010110b: e9 5a ff ff ff jmp f010106a } f0101110: 8d 65 f4 lea -0xc(%ebp),%esp f0101113: 5b pop %ebx f0101114: 5e pop %esi f0101115: 5f pop %edi f0101116: 5d pop %ebp f0101117: c3 ret f0101118 : int vsnprintf(char *buf, int n, const char *fmt, va_list ap) { f0101118: f3 0f 1e fb endbr32 f010111c: 55 push %ebp f010111d: 89 e5 mov %esp,%ebp f010111f: 83 ec 18 sub $0x18,%esp f0101122: 8b 45 08 mov 0x8(%ebp),%eax f0101125: 8b 55 0c mov 0xc(%ebp),%edx struct sprintbuf b = {buf, buf+n-1, 0}; f0101128: 89 45 ec mov %eax,-0x14(%ebp) f010112b: 8d 4c 10 ff lea -0x1(%eax,%edx,1),%ecx f010112f: 89 4d f0 mov %ecx,-0x10(%ebp) f0101132: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) if (buf == NULL || n < 1) f0101139: 85 c0 test %eax,%eax f010113b: 74 26 je f0101163 f010113d: 85 d2 test %edx,%edx f010113f: 7e 22 jle f0101163 return -E_INVAL; // print the string to the buffer vprintfmt((void*)sprintputch, &b, fmt, ap); f0101141: ff 75 14 pushl 0x14(%ebp) f0101144: ff 75 10 pushl 0x10(%ebp) f0101147: 8d 45 ec lea -0x14(%ebp),%eax f010114a: 50 push %eax f010114b: 68 b3 0c 10 f0 push $0xf0100cb3 f0101150: e8 a0 fb ff ff call f0100cf5 // null terminate the buffer *b.buf = '\0'; f0101155: 8b 45 ec mov -0x14(%ebp),%eax f0101158: c6 00 00 movb $0x0,(%eax) return b.cnt; f010115b: 8b 45 f4 mov -0xc(%ebp),%eax f010115e: 83 c4 10 add $0x10,%esp } f0101161: c9 leave f0101162: c3 ret return -E_INVAL; f0101163: b8 fd ff ff ff mov $0xfffffffd,%eax f0101168: eb f7 jmp f0101161 f010116a : int snprintf(char *buf, int n, const char *fmt, ...) { f010116a: f3 0f 1e fb endbr32 f010116e: 55 push %ebp f010116f: 89 e5 mov %esp,%ebp f0101171: 83 ec 08 sub $0x8,%esp va_list ap; int rc; va_start(ap, fmt); f0101174: 8d 45 14 lea 0x14(%ebp),%eax rc = vsnprintf(buf, n, fmt, ap); f0101177: 50 push %eax f0101178: ff 75 10 pushl 0x10(%ebp) f010117b: ff 75 0c pushl 0xc(%ebp) f010117e: ff 75 08 pushl 0x8(%ebp) f0101181: e8 92 ff ff ff call f0101118 va_end(ap); return rc; } f0101186: c9 leave f0101187: c3 ret f0101188 : #define BUFLEN 1024 static char buf[BUFLEN]; char * readline(const char *prompt) { f0101188: f3 0f 1e fb endbr32 f010118c: 55 push %ebp f010118d: 89 e5 mov %esp,%ebp f010118f: 57 push %edi f0101190: 56 push %esi f0101191: 53 push %ebx f0101192: 83 ec 0c sub $0xc,%esp f0101195: 8b 45 08 mov 0x8(%ebp),%eax int i, c, echoing; if (prompt != NULL) f0101198: 85 c0 test %eax,%eax f010119a: 74 11 je f01011ad cprintf("%s", prompt); f010119c: 83 ec 08 sub $0x8,%esp f010119f: 50 push %eax f01011a0: 68 c2 1d 10 f0 push $0xf0101dc2 f01011a5: e8 7d f7 ff ff call f0100927 f01011aa: 83 c4 10 add $0x10,%esp i = 0; echoing = iscons(0); f01011ad: 83 ec 0c sub $0xc,%esp f01011b0: 6a 00 push $0x0 f01011b2: e8 f1 f4 ff ff call f01006a8 f01011b7: 89 c7 mov %eax,%edi f01011b9: 83 c4 10 add $0x10,%esp i = 0; f01011bc: be 00 00 00 00 mov $0x0,%esi f01011c1: eb 4b jmp f010120e while (1) { c = getchar(); if (c < 0) { cprintf("read error: %e\n", c); f01011c3: 83 ec 08 sub $0x8,%esp f01011c6: 50 push %eax f01011c7: 68 a4 1f 10 f0 push $0xf0101fa4 f01011cc: e8 56 f7 ff ff call f0100927 return NULL; f01011d1: 83 c4 10 add $0x10,%esp f01011d4: b8 00 00 00 00 mov $0x0,%eax cputchar('\n'); buf[i] = 0; return buf; } } } f01011d9: 8d 65 f4 lea -0xc(%ebp),%esp f01011dc: 5b pop %ebx f01011dd: 5e pop %esi f01011de: 5f pop %edi f01011df: 5d pop %ebp f01011e0: c3 ret if (echoing) f01011e1: 85 ff test %edi,%edi f01011e3: 75 05 jne f01011ea i--; f01011e5: 83 ee 01 sub $0x1,%esi f01011e8: eb 24 jmp f010120e cputchar('\b'); f01011ea: 83 ec 0c sub $0xc,%esp f01011ed: 6a 08 push $0x8 f01011ef: e8 8b f4 ff ff call f010067f f01011f4: 83 c4 10 add $0x10,%esp f01011f7: eb ec jmp f01011e5 cputchar(c); f01011f9: 83 ec 0c sub $0xc,%esp f01011fc: 53 push %ebx f01011fd: e8 7d f4 ff ff call f010067f f0101202: 83 c4 10 add $0x10,%esp buf[i++] = c; f0101205: 88 9e 40 25 11 f0 mov %bl,-0xfeedac0(%esi) f010120b: 8d 76 01 lea 0x1(%esi),%esi c = getchar(); f010120e: e8 80 f4 ff ff call f0100693 f0101213: 89 c3 mov %eax,%ebx if (c < 0) { f0101215: 85 c0 test %eax,%eax f0101217: 78 aa js f01011c3 } else if ((c == '\b' || c == '\x7f') && i > 0) { f0101219: 83 f8 08 cmp $0x8,%eax f010121c: 0f 94 c2 sete %dl f010121f: 83 f8 7f cmp $0x7f,%eax f0101222: 0f 94 c0 sete %al f0101225: 08 c2 or %al,%dl f0101227: 74 04 je f010122d f0101229: 85 f6 test %esi,%esi f010122b: 7f b4 jg f01011e1 } else if (c >= ' ' && i < BUFLEN-1) { f010122d: 83 fb 1f cmp $0x1f,%ebx f0101230: 7e 0e jle f0101240 f0101232: 81 fe fe 03 00 00 cmp $0x3fe,%esi f0101238: 7f 06 jg f0101240 if (echoing) f010123a: 85 ff test %edi,%edi f010123c: 74 c7 je f0101205 f010123e: eb b9 jmp f01011f9 } else if (c == '\n' || c == '\r') { f0101240: 83 fb 0a cmp $0xa,%ebx f0101243: 74 05 je f010124a f0101245: 83 fb 0d cmp $0xd,%ebx f0101248: 75 c4 jne f010120e if (echoing) f010124a: 85 ff test %edi,%edi f010124c: 75 11 jne f010125f buf[i] = 0; f010124e: c6 86 40 25 11 f0 00 movb $0x0,-0xfeedac0(%esi) return buf; f0101255: b8 40 25 11 f0 mov $0xf0112540,%eax f010125a: e9 7a ff ff ff jmp f01011d9 cputchar('\n'); f010125f: 83 ec 0c sub $0xc,%esp f0101262: 6a 0a push $0xa f0101264: e8 16 f4 ff ff call f010067f f0101269: 83 c4 10 add $0x10,%esp f010126c: eb e0 jmp f010124e f010126e : // Primespipe runs 3x faster this way. #define ASM 1 int strlen(const char *s) { f010126e: f3 0f 1e fb endbr32 f0101272: 55 push %ebp f0101273: 89 e5 mov %esp,%ebp f0101275: 8b 55 08 mov 0x8(%ebp),%edx int n; for (n = 0; *s != '\0'; s++) f0101278: b8 00 00 00 00 mov $0x0,%eax f010127d: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) f0101281: 74 05 je f0101288 n++; f0101283: 83 c0 01 add $0x1,%eax f0101286: eb f5 jmp f010127d return n; } f0101288: 5d pop %ebp f0101289: c3 ret f010128a : int strnlen(const char *s, size_t size) { f010128a: f3 0f 1e fb endbr32 f010128e: 55 push %ebp f010128f: 89 e5 mov %esp,%ebp f0101291: 8b 4d 08 mov 0x8(%ebp),%ecx f0101294: 8b 55 0c mov 0xc(%ebp),%edx int n; for (n = 0; size > 0 && *s != '\0'; s++, size--) f0101297: b8 00 00 00 00 mov $0x0,%eax f010129c: 39 d0 cmp %edx,%eax f010129e: 74 0d je f01012ad f01012a0: 80 3c 01 00 cmpb $0x0,(%ecx,%eax,1) f01012a4: 74 05 je f01012ab n++; f01012a6: 83 c0 01 add $0x1,%eax f01012a9: eb f1 jmp f010129c f01012ab: 89 c2 mov %eax,%edx return n; } f01012ad: 89 d0 mov %edx,%eax f01012af: 5d pop %ebp f01012b0: c3 ret f01012b1 : char * strcpy(char *dst, const char *src) { f01012b1: f3 0f 1e fb endbr32 f01012b5: 55 push %ebp f01012b6: 89 e5 mov %esp,%ebp f01012b8: 53 push %ebx f01012b9: 8b 4d 08 mov 0x8(%ebp),%ecx f01012bc: 8b 5d 0c mov 0xc(%ebp),%ebx char *ret; ret = dst; while ((*dst++ = *src++) != '\0') f01012bf: b8 00 00 00 00 mov $0x0,%eax f01012c4: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx f01012c8: 88 14 01 mov %dl,(%ecx,%eax,1) f01012cb: 83 c0 01 add $0x1,%eax f01012ce: 84 d2 test %dl,%dl f01012d0: 75 f2 jne f01012c4 /* do nothing */; return ret; } f01012d2: 89 c8 mov %ecx,%eax f01012d4: 5b pop %ebx f01012d5: 5d pop %ebp f01012d6: c3 ret f01012d7 : char * strcat(char *dst, const char *src) { f01012d7: f3 0f 1e fb endbr32 f01012db: 55 push %ebp f01012dc: 89 e5 mov %esp,%ebp f01012de: 53 push %ebx f01012df: 83 ec 10 sub $0x10,%esp f01012e2: 8b 5d 08 mov 0x8(%ebp),%ebx int len = strlen(dst); f01012e5: 53 push %ebx f01012e6: e8 83 ff ff ff call f010126e f01012eb: 83 c4 08 add $0x8,%esp strcpy(dst + len, src); f01012ee: ff 75 0c pushl 0xc(%ebp) f01012f1: 01 d8 add %ebx,%eax f01012f3: 50 push %eax f01012f4: e8 b8 ff ff ff call f01012b1 return dst; } f01012f9: 89 d8 mov %ebx,%eax f01012fb: 8b 5d fc mov -0x4(%ebp),%ebx f01012fe: c9 leave f01012ff: c3 ret f0101300 : char * strncpy(char *dst, const char *src, size_t size) { f0101300: f3 0f 1e fb endbr32 f0101304: 55 push %ebp f0101305: 89 e5 mov %esp,%ebp f0101307: 56 push %esi f0101308: 53 push %ebx f0101309: 8b 75 08 mov 0x8(%ebp),%esi f010130c: 8b 55 0c mov 0xc(%ebp),%edx f010130f: 89 f3 mov %esi,%ebx f0101311: 03 5d 10 add 0x10(%ebp),%ebx size_t i; char *ret; ret = dst; for (i = 0; i < size; i++) { f0101314: 89 f0 mov %esi,%eax f0101316: 39 d8 cmp %ebx,%eax f0101318: 74 11 je f010132b *dst++ = *src; f010131a: 83 c0 01 add $0x1,%eax f010131d: 0f b6 0a movzbl (%edx),%ecx f0101320: 88 48 ff mov %cl,-0x1(%eax) // If strlen(src) < size, null-pad 'dst' out to 'size' chars if (*src != '\0') src++; f0101323: 80 f9 01 cmp $0x1,%cl f0101326: 83 da ff sbb $0xffffffff,%edx f0101329: eb eb jmp f0101316 } return ret; } f010132b: 89 f0 mov %esi,%eax f010132d: 5b pop %ebx f010132e: 5e pop %esi f010132f: 5d pop %ebp f0101330: c3 ret f0101331 : size_t strlcpy(char *dst, const char *src, size_t size) { f0101331: f3 0f 1e fb endbr32 f0101335: 55 push %ebp f0101336: 89 e5 mov %esp,%ebp f0101338: 56 push %esi f0101339: 53 push %ebx f010133a: 8b 75 08 mov 0x8(%ebp),%esi f010133d: 8b 4d 0c mov 0xc(%ebp),%ecx f0101340: 8b 55 10 mov 0x10(%ebp),%edx f0101343: 89 f0 mov %esi,%eax char *dst_in; dst_in = dst; if (size > 0) { f0101345: 85 d2 test %edx,%edx f0101347: 74 21 je f010136a f0101349: 8d 44 16 ff lea -0x1(%esi,%edx,1),%eax f010134d: 89 f2 mov %esi,%edx while (--size > 0 && *src != '\0') f010134f: 39 c2 cmp %eax,%edx f0101351: 74 14 je f0101367 f0101353: 0f b6 19 movzbl (%ecx),%ebx f0101356: 84 db test %bl,%bl f0101358: 74 0b je f0101365 *dst++ = *src++; f010135a: 83 c1 01 add $0x1,%ecx f010135d: 83 c2 01 add $0x1,%edx f0101360: 88 5a ff mov %bl,-0x1(%edx) f0101363: eb ea jmp f010134f f0101365: 89 d0 mov %edx,%eax *dst = '\0'; f0101367: c6 00 00 movb $0x0,(%eax) } return dst - dst_in; f010136a: 29 f0 sub %esi,%eax } f010136c: 5b pop %ebx f010136d: 5e pop %esi f010136e: 5d pop %ebp f010136f: c3 ret f0101370 : int strcmp(const char *p, const char *q) { f0101370: f3 0f 1e fb endbr32 f0101374: 55 push %ebp f0101375: 89 e5 mov %esp,%ebp f0101377: 8b 4d 08 mov 0x8(%ebp),%ecx f010137a: 8b 55 0c mov 0xc(%ebp),%edx while (*p && *p == *q) f010137d: 0f b6 01 movzbl (%ecx),%eax f0101380: 84 c0 test %al,%al f0101382: 74 0c je f0101390 f0101384: 3a 02 cmp (%edx),%al f0101386: 75 08 jne f0101390 p++, q++; f0101388: 83 c1 01 add $0x1,%ecx f010138b: 83 c2 01 add $0x1,%edx f010138e: eb ed jmp f010137d return (int) ((unsigned char) *p - (unsigned char) *q); f0101390: 0f b6 c0 movzbl %al,%eax f0101393: 0f b6 12 movzbl (%edx),%edx f0101396: 29 d0 sub %edx,%eax } f0101398: 5d pop %ebp f0101399: c3 ret f010139a : int strncmp(const char *p, const char *q, size_t n) { f010139a: f3 0f 1e fb endbr32 f010139e: 55 push %ebp f010139f: 89 e5 mov %esp,%ebp f01013a1: 53 push %ebx f01013a2: 8b 45 08 mov 0x8(%ebp),%eax f01013a5: 8b 55 0c mov 0xc(%ebp),%edx f01013a8: 89 c3 mov %eax,%ebx f01013aa: 03 5d 10 add 0x10(%ebp),%ebx while (n > 0 && *p && *p == *q) f01013ad: eb 06 jmp f01013b5 n--, p++, q++; f01013af: 83 c0 01 add $0x1,%eax f01013b2: 83 c2 01 add $0x1,%edx while (n > 0 && *p && *p == *q) f01013b5: 39 d8 cmp %ebx,%eax f01013b7: 74 16 je f01013cf f01013b9: 0f b6 08 movzbl (%eax),%ecx f01013bc: 84 c9 test %cl,%cl f01013be: 74 04 je f01013c4 f01013c0: 3a 0a cmp (%edx),%cl f01013c2: 74 eb je f01013af if (n == 0) return 0; else return (int) ((unsigned char) *p - (unsigned char) *q); f01013c4: 0f b6 00 movzbl (%eax),%eax f01013c7: 0f b6 12 movzbl (%edx),%edx f01013ca: 29 d0 sub %edx,%eax } f01013cc: 5b pop %ebx f01013cd: 5d pop %ebp f01013ce: c3 ret return 0; f01013cf: b8 00 00 00 00 mov $0x0,%eax f01013d4: eb f6 jmp f01013cc f01013d6 : // Return a pointer to the first occurrence of 'c' in 's', // or a null pointer if the string has no 'c'. char * strchr(const char *s, char c) { f01013d6: f3 0f 1e fb endbr32 f01013da: 55 push %ebp f01013db: 89 e5 mov %esp,%ebp f01013dd: 8b 45 08 mov 0x8(%ebp),%eax f01013e0: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx for (; *s; s++) f01013e4: 0f b6 10 movzbl (%eax),%edx f01013e7: 84 d2 test %dl,%dl f01013e9: 74 09 je f01013f4 if (*s == c) f01013eb: 38 ca cmp %cl,%dl f01013ed: 74 0a je f01013f9 for (; *s; s++) f01013ef: 83 c0 01 add $0x1,%eax f01013f2: eb f0 jmp f01013e4 return (char *) s; return 0; f01013f4: b8 00 00 00 00 mov $0x0,%eax } f01013f9: 5d pop %ebp f01013fa: c3 ret f01013fb : // Return a pointer to the first occurrence of 'c' in 's', // or a pointer to the string-ending null character if the string has no 'c'. char * strfind(const char *s, char c) { f01013fb: f3 0f 1e fb endbr32 f01013ff: 55 push %ebp f0101400: 89 e5 mov %esp,%ebp f0101402: 8b 45 08 mov 0x8(%ebp),%eax f0101405: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx for (; *s; s++) f0101409: 0f b6 10 movzbl (%eax),%edx if (*s == c) f010140c: 38 ca cmp %cl,%dl f010140e: 74 09 je f0101419 f0101410: 84 d2 test %dl,%dl f0101412: 74 05 je f0101419 for (; *s; s++) f0101414: 83 c0 01 add $0x1,%eax f0101417: eb f0 jmp f0101409 break; return (char *) s; } f0101419: 5d pop %ebp f010141a: c3 ret f010141b : #if ASM void * memset(void *v, int c, size_t n) { f010141b: f3 0f 1e fb endbr32 f010141f: 55 push %ebp f0101420: 89 e5 mov %esp,%ebp f0101422: 57 push %edi f0101423: 56 push %esi f0101424: 53 push %ebx f0101425: 8b 7d 08 mov 0x8(%ebp),%edi f0101428: 8b 4d 10 mov 0x10(%ebp),%ecx char *p; if (n == 0) f010142b: 85 c9 test %ecx,%ecx f010142d: 74 31 je f0101460 return v; if ((int)v%4 == 0 && n%4 == 0) { f010142f: 89 f8 mov %edi,%eax f0101431: 09 c8 or %ecx,%eax f0101433: a8 03 test $0x3,%al f0101435: 75 23 jne f010145a c &= 0xFF; f0101437: 0f b6 55 0c movzbl 0xc(%ebp),%edx c = (c<<24)|(c<<16)|(c<<8)|c; f010143b: 89 d3 mov %edx,%ebx f010143d: c1 e3 08 shl $0x8,%ebx f0101440: 89 d0 mov %edx,%eax f0101442: c1 e0 18 shl $0x18,%eax f0101445: 89 d6 mov %edx,%esi f0101447: c1 e6 10 shl $0x10,%esi f010144a: 09 f0 or %esi,%eax f010144c: 09 c2 or %eax,%edx f010144e: 09 da or %ebx,%edx asm volatile("cld; rep stosl\n" :: "D" (v), "a" (c), "c" (n/4) f0101450: c1 e9 02 shr $0x2,%ecx asm volatile("cld; rep stosl\n" f0101453: 89 d0 mov %edx,%eax f0101455: fc cld f0101456: f3 ab rep stos %eax,%es:(%edi) f0101458: eb 06 jmp f0101460 : "cc", "memory"); } else asm volatile("cld; rep stosb\n" f010145a: 8b 45 0c mov 0xc(%ebp),%eax f010145d: fc cld f010145e: f3 aa rep stos %al,%es:(%edi) :: "D" (v), "a" (c), "c" (n) : "cc", "memory"); return v; } f0101460: 89 f8 mov %edi,%eax f0101462: 5b pop %ebx f0101463: 5e pop %esi f0101464: 5f pop %edi f0101465: 5d pop %ebp f0101466: c3 ret f0101467 : void * memmove(void *dst, const void *src, size_t n) { f0101467: f3 0f 1e fb endbr32 f010146b: 55 push %ebp f010146c: 89 e5 mov %esp,%ebp f010146e: 57 push %edi f010146f: 56 push %esi f0101470: 8b 45 08 mov 0x8(%ebp),%eax f0101473: 8b 75 0c mov 0xc(%ebp),%esi f0101476: 8b 4d 10 mov 0x10(%ebp),%ecx const char *s; char *d; s = src; d = dst; if (s < d && s + n > d) { f0101479: 39 c6 cmp %eax,%esi f010147b: 73 32 jae f01014af f010147d: 8d 14 0e lea (%esi,%ecx,1),%edx f0101480: 39 c2 cmp %eax,%edx f0101482: 76 2b jbe f01014af s += n; d += n; f0101484: 8d 3c 08 lea (%eax,%ecx,1),%edi if ((int)s%4 == 0 && (int)d%4 == 0 && n%4 == 0) f0101487: 89 fe mov %edi,%esi f0101489: 09 ce or %ecx,%esi f010148b: 09 d6 or %edx,%esi f010148d: f7 c6 03 00 00 00 test $0x3,%esi f0101493: 75 0e jne f01014a3 asm volatile("std; rep movsl\n" :: "D" (d-4), "S" (s-4), "c" (n/4) : "cc", "memory"); f0101495: 83 ef 04 sub $0x4,%edi f0101498: 8d 72 fc lea -0x4(%edx),%esi f010149b: c1 e9 02 shr $0x2,%ecx asm volatile("std; rep movsl\n" f010149e: fd std f010149f: f3 a5 rep movsl %ds:(%esi),%es:(%edi) f01014a1: eb 09 jmp f01014ac else asm volatile("std; rep movsb\n" :: "D" (d-1), "S" (s-1), "c" (n) : "cc", "memory"); f01014a3: 83 ef 01 sub $0x1,%edi f01014a6: 8d 72 ff lea -0x1(%edx),%esi asm volatile("std; rep movsb\n" f01014a9: fd std f01014aa: f3 a4 rep movsb %ds:(%esi),%es:(%edi) // Some versions of GCC rely on DF being clear asm volatile("cld" ::: "cc"); f01014ac: fc cld f01014ad: eb 1a jmp f01014c9 } else { if ((int)s%4 == 0 && (int)d%4 == 0 && n%4 == 0) f01014af: 89 c2 mov %eax,%edx f01014b1: 09 ca or %ecx,%edx f01014b3: 09 f2 or %esi,%edx f01014b5: f6 c2 03 test $0x3,%dl f01014b8: 75 0a jne f01014c4 asm volatile("cld; rep movsl\n" :: "D" (d), "S" (s), "c" (n/4) : "cc", "memory"); f01014ba: c1 e9 02 shr $0x2,%ecx asm volatile("cld; rep movsl\n" f01014bd: 89 c7 mov %eax,%edi f01014bf: fc cld f01014c0: f3 a5 rep movsl %ds:(%esi),%es:(%edi) f01014c2: eb 05 jmp f01014c9 else asm volatile("cld; rep movsb\n" f01014c4: 89 c7 mov %eax,%edi f01014c6: fc cld f01014c7: f3 a4 rep movsb %ds:(%esi),%es:(%edi) :: "D" (d), "S" (s), "c" (n) : "cc", "memory"); } return dst; } f01014c9: 5e pop %esi f01014ca: 5f pop %edi f01014cb: 5d pop %ebp f01014cc: c3 ret f01014cd : } #endif void * memcpy(void *dst, const void *src, size_t n) { f01014cd: f3 0f 1e fb endbr32 f01014d1: 55 push %ebp f01014d2: 89 e5 mov %esp,%ebp f01014d4: 83 ec 0c sub $0xc,%esp return memmove(dst, src, n); f01014d7: ff 75 10 pushl 0x10(%ebp) f01014da: ff 75 0c pushl 0xc(%ebp) f01014dd: ff 75 08 pushl 0x8(%ebp) f01014e0: e8 82 ff ff ff call f0101467 } f01014e5: c9 leave f01014e6: c3 ret f01014e7 : int memcmp(const void *v1, const void *v2, size_t n) { f01014e7: f3 0f 1e fb endbr32 f01014eb: 55 push %ebp f01014ec: 89 e5 mov %esp,%ebp f01014ee: 56 push %esi f01014ef: 53 push %ebx f01014f0: 8b 45 08 mov 0x8(%ebp),%eax f01014f3: 8b 55 0c mov 0xc(%ebp),%edx f01014f6: 89 c6 mov %eax,%esi f01014f8: 03 75 10 add 0x10(%ebp),%esi const uint8_t *s1 = (const uint8_t *) v1; const uint8_t *s2 = (const uint8_t *) v2; while (n-- > 0) { f01014fb: 39 f0 cmp %esi,%eax f01014fd: 74 1c je f010151b if (*s1 != *s2) f01014ff: 0f b6 08 movzbl (%eax),%ecx f0101502: 0f b6 1a movzbl (%edx),%ebx f0101505: 38 d9 cmp %bl,%cl f0101507: 75 08 jne f0101511 return (int) *s1 - (int) *s2; s1++, s2++; f0101509: 83 c0 01 add $0x1,%eax f010150c: 83 c2 01 add $0x1,%edx f010150f: eb ea jmp f01014fb return (int) *s1 - (int) *s2; f0101511: 0f b6 c1 movzbl %cl,%eax f0101514: 0f b6 db movzbl %bl,%ebx f0101517: 29 d8 sub %ebx,%eax f0101519: eb 05 jmp f0101520 } return 0; f010151b: b8 00 00 00 00 mov $0x0,%eax } f0101520: 5b pop %ebx f0101521: 5e pop %esi f0101522: 5d pop %ebp f0101523: c3 ret f0101524 : void * memfind(const void *s, int c, size_t n) { f0101524: f3 0f 1e fb endbr32 f0101528: 55 push %ebp f0101529: 89 e5 mov %esp,%ebp f010152b: 8b 45 08 mov 0x8(%ebp),%eax f010152e: 8b 4d 0c mov 0xc(%ebp),%ecx const void *ends = (const char *) s + n; f0101531: 89 c2 mov %eax,%edx f0101533: 03 55 10 add 0x10(%ebp),%edx for (; s < ends; s++) f0101536: 39 d0 cmp %edx,%eax f0101538: 73 09 jae f0101543 if (*(const unsigned char *) s == (unsigned char) c) f010153a: 38 08 cmp %cl,(%eax) f010153c: 74 05 je f0101543 for (; s < ends; s++) f010153e: 83 c0 01 add $0x1,%eax f0101541: eb f3 jmp f0101536 break; return (void *) s; } f0101543: 5d pop %ebp f0101544: c3 ret f0101545 : long strtol(const char *s, char **endptr, int base) { f0101545: f3 0f 1e fb endbr32 f0101549: 55 push %ebp f010154a: 89 e5 mov %esp,%ebp f010154c: 57 push %edi f010154d: 56 push %esi f010154e: 53 push %ebx f010154f: 8b 4d 08 mov 0x8(%ebp),%ecx f0101552: 8b 5d 10 mov 0x10(%ebp),%ebx int neg = 0; long val = 0; // gobble initial whitespace while (*s == ' ' || *s == '\t') f0101555: eb 03 jmp f010155a s++; f0101557: 83 c1 01 add $0x1,%ecx while (*s == ' ' || *s == '\t') f010155a: 0f b6 01 movzbl (%ecx),%eax f010155d: 3c 20 cmp $0x20,%al f010155f: 74 f6 je f0101557 f0101561: 3c 09 cmp $0x9,%al f0101563: 74 f2 je f0101557 // plus/minus sign if (*s == '+') f0101565: 3c 2b cmp $0x2b,%al f0101567: 74 2a je f0101593 int neg = 0; f0101569: bf 00 00 00 00 mov $0x0,%edi s++; else if (*s == '-') f010156e: 3c 2d cmp $0x2d,%al f0101570: 74 2b je f010159d s++, neg = 1; // hex or octal base prefix if ((base == 0 || base == 16) && (s[0] == '0' && s[1] == 'x')) f0101572: f7 c3 ef ff ff ff test $0xffffffef,%ebx f0101578: 75 0f jne f0101589 f010157a: 80 39 30 cmpb $0x30,(%ecx) f010157d: 74 28 je f01015a7 s += 2, base = 16; else if (base == 0 && s[0] == '0') s++, base = 8; else if (base == 0) base = 10; f010157f: 85 db test %ebx,%ebx f0101581: b8 0a 00 00 00 mov $0xa,%eax f0101586: 0f 44 d8 cmove %eax,%ebx f0101589: b8 00 00 00 00 mov $0x0,%eax f010158e: 89 5d 10 mov %ebx,0x10(%ebp) f0101591: eb 46 jmp f01015d9 s++; f0101593: 83 c1 01 add $0x1,%ecx int neg = 0; f0101596: bf 00 00 00 00 mov $0x0,%edi f010159b: eb d5 jmp f0101572 s++, neg = 1; f010159d: 83 c1 01 add $0x1,%ecx f01015a0: bf 01 00 00 00 mov $0x1,%edi f01015a5: eb cb jmp f0101572 if ((base == 0 || base == 16) && (s[0] == '0' && s[1] == 'x')) f01015a7: 80 79 01 78 cmpb $0x78,0x1(%ecx) f01015ab: 74 0e je f01015bb else if (base == 0 && s[0] == '0') f01015ad: 85 db test %ebx,%ebx f01015af: 75 d8 jne f0101589 s++, base = 8; f01015b1: 83 c1 01 add $0x1,%ecx f01015b4: bb 08 00 00 00 mov $0x8,%ebx f01015b9: eb ce jmp f0101589 s += 2, base = 16; f01015bb: 83 c1 02 add $0x2,%ecx f01015be: bb 10 00 00 00 mov $0x10,%ebx f01015c3: eb c4 jmp f0101589 // digits while (1) { int dig; if (*s >= '0' && *s <= '9') dig = *s - '0'; f01015c5: 0f be d2 movsbl %dl,%edx f01015c8: 83 ea 30 sub $0x30,%edx dig = *s - 'a' + 10; else if (*s >= 'A' && *s <= 'Z') dig = *s - 'A' + 10; else break; if (dig >= base) f01015cb: 3b 55 10 cmp 0x10(%ebp),%edx f01015ce: 7d 3a jge f010160a break; s++, val = (val * base) + dig; f01015d0: 83 c1 01 add $0x1,%ecx f01015d3: 0f af 45 10 imul 0x10(%ebp),%eax f01015d7: 01 d0 add %edx,%eax if (*s >= '0' && *s <= '9') f01015d9: 0f b6 11 movzbl (%ecx),%edx f01015dc: 8d 72 d0 lea -0x30(%edx),%esi f01015df: 89 f3 mov %esi,%ebx f01015e1: 80 fb 09 cmp $0x9,%bl f01015e4: 76 df jbe f01015c5 else if (*s >= 'a' && *s <= 'z') f01015e6: 8d 72 9f lea -0x61(%edx),%esi f01015e9: 89 f3 mov %esi,%ebx f01015eb: 80 fb 19 cmp $0x19,%bl f01015ee: 77 08 ja f01015f8 dig = *s - 'a' + 10; f01015f0: 0f be d2 movsbl %dl,%edx f01015f3: 83 ea 57 sub $0x57,%edx f01015f6: eb d3 jmp f01015cb else if (*s >= 'A' && *s <= 'Z') f01015f8: 8d 72 bf lea -0x41(%edx),%esi f01015fb: 89 f3 mov %esi,%ebx f01015fd: 80 fb 19 cmp $0x19,%bl f0101600: 77 08 ja f010160a dig = *s - 'A' + 10; f0101602: 0f be d2 movsbl %dl,%edx f0101605: 83 ea 37 sub $0x37,%edx f0101608: eb c1 jmp f01015cb // we don't properly detect overflow! } if (endptr) f010160a: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) f010160e: 74 05 je f0101615 *endptr = (char *) s; f0101610: 8b 75 0c mov 0xc(%ebp),%esi f0101613: 89 0e mov %ecx,(%esi) return (neg ? -val : val); f0101615: 89 c2 mov %eax,%edx f0101617: f7 da neg %edx f0101619: 85 ff test %edi,%edi f010161b: 0f 45 c2 cmovne %edx,%eax } f010161e: 5b pop %ebx f010161f: 5e pop %esi f0101620: 5f pop %edi f0101621: 5d pop %ebp f0101622: c3 ret f0101623: 66 90 xchg %ax,%ax f0101625: 66 90 xchg %ax,%ax f0101627: 66 90 xchg %ax,%ax f0101629: 66 90 xchg %ax,%ax f010162b: 66 90 xchg %ax,%ax f010162d: 66 90 xchg %ax,%ax f010162f: 90 nop f0101630 <__udivdi3>: f0101630: f3 0f 1e fb endbr32 f0101634: 55 push %ebp f0101635: 57 push %edi f0101636: 56 push %esi f0101637: 53 push %ebx f0101638: 83 ec 1c sub $0x1c,%esp f010163b: 8b 54 24 3c mov 0x3c(%esp),%edx f010163f: 8b 6c 24 30 mov 0x30(%esp),%ebp f0101643: 8b 74 24 34 mov 0x34(%esp),%esi f0101647: 8b 5c 24 38 mov 0x38(%esp),%ebx f010164b: 85 d2 test %edx,%edx f010164d: 75 19 jne f0101668 <__udivdi3+0x38> f010164f: 39 f3 cmp %esi,%ebx f0101651: 76 4d jbe f01016a0 <__udivdi3+0x70> f0101653: 31 ff xor %edi,%edi f0101655: 89 e8 mov %ebp,%eax f0101657: 89 f2 mov %esi,%edx f0101659: f7 f3 div %ebx f010165b: 89 fa mov %edi,%edx f010165d: 83 c4 1c add $0x1c,%esp f0101660: 5b pop %ebx f0101661: 5e pop %esi f0101662: 5f pop %edi f0101663: 5d pop %ebp f0101664: c3 ret f0101665: 8d 76 00 lea 0x0(%esi),%esi f0101668: 39 f2 cmp %esi,%edx f010166a: 76 14 jbe f0101680 <__udivdi3+0x50> f010166c: 31 ff xor %edi,%edi f010166e: 31 c0 xor %eax,%eax f0101670: 89 fa mov %edi,%edx f0101672: 83 c4 1c add $0x1c,%esp f0101675: 5b pop %ebx f0101676: 5e pop %esi f0101677: 5f pop %edi f0101678: 5d pop %ebp f0101679: c3 ret f010167a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi f0101680: 0f bd fa bsr %edx,%edi f0101683: 83 f7 1f xor $0x1f,%edi f0101686: 75 48 jne f01016d0 <__udivdi3+0xa0> f0101688: 39 f2 cmp %esi,%edx f010168a: 72 06 jb f0101692 <__udivdi3+0x62> f010168c: 31 c0 xor %eax,%eax f010168e: 39 eb cmp %ebp,%ebx f0101690: 77 de ja f0101670 <__udivdi3+0x40> f0101692: b8 01 00 00 00 mov $0x1,%eax f0101697: eb d7 jmp f0101670 <__udivdi3+0x40> f0101699: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi f01016a0: 89 d9 mov %ebx,%ecx f01016a2: 85 db test %ebx,%ebx f01016a4: 75 0b jne f01016b1 <__udivdi3+0x81> f01016a6: b8 01 00 00 00 mov $0x1,%eax f01016ab: 31 d2 xor %edx,%edx f01016ad: f7 f3 div %ebx f01016af: 89 c1 mov %eax,%ecx f01016b1: 31 d2 xor %edx,%edx f01016b3: 89 f0 mov %esi,%eax f01016b5: f7 f1 div %ecx f01016b7: 89 c6 mov %eax,%esi f01016b9: 89 e8 mov %ebp,%eax f01016bb: 89 f7 mov %esi,%edi f01016bd: f7 f1 div %ecx f01016bf: 89 fa mov %edi,%edx f01016c1: 83 c4 1c add $0x1c,%esp f01016c4: 5b pop %ebx f01016c5: 5e pop %esi f01016c6: 5f pop %edi f01016c7: 5d pop %ebp f01016c8: c3 ret f01016c9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi f01016d0: 89 f9 mov %edi,%ecx f01016d2: b8 20 00 00 00 mov $0x20,%eax f01016d7: 29 f8 sub %edi,%eax f01016d9: d3 e2 shl %cl,%edx f01016db: 89 54 24 08 mov %edx,0x8(%esp) f01016df: 89 c1 mov %eax,%ecx f01016e1: 89 da mov %ebx,%edx f01016e3: d3 ea shr %cl,%edx f01016e5: 8b 4c 24 08 mov 0x8(%esp),%ecx f01016e9: 09 d1 or %edx,%ecx f01016eb: 89 f2 mov %esi,%edx f01016ed: 89 4c 24 08 mov %ecx,0x8(%esp) f01016f1: 89 f9 mov %edi,%ecx f01016f3: d3 e3 shl %cl,%ebx f01016f5: 89 c1 mov %eax,%ecx f01016f7: d3 ea shr %cl,%edx f01016f9: 89 f9 mov %edi,%ecx f01016fb: 89 5c 24 0c mov %ebx,0xc(%esp) f01016ff: 89 eb mov %ebp,%ebx f0101701: d3 e6 shl %cl,%esi f0101703: 89 c1 mov %eax,%ecx f0101705: d3 eb shr %cl,%ebx f0101707: 09 de or %ebx,%esi f0101709: 89 f0 mov %esi,%eax f010170b: f7 74 24 08 divl 0x8(%esp) f010170f: 89 d6 mov %edx,%esi f0101711: 89 c3 mov %eax,%ebx f0101713: f7 64 24 0c mull 0xc(%esp) f0101717: 39 d6 cmp %edx,%esi f0101719: 72 15 jb f0101730 <__udivdi3+0x100> f010171b: 89 f9 mov %edi,%ecx f010171d: d3 e5 shl %cl,%ebp f010171f: 39 c5 cmp %eax,%ebp f0101721: 73 04 jae f0101727 <__udivdi3+0xf7> f0101723: 39 d6 cmp %edx,%esi f0101725: 74 09 je f0101730 <__udivdi3+0x100> f0101727: 89 d8 mov %ebx,%eax f0101729: 31 ff xor %edi,%edi f010172b: e9 40 ff ff ff jmp f0101670 <__udivdi3+0x40> f0101730: 8d 43 ff lea -0x1(%ebx),%eax f0101733: 31 ff xor %edi,%edi f0101735: e9 36 ff ff ff jmp f0101670 <__udivdi3+0x40> f010173a: 66 90 xchg %ax,%ax f010173c: 66 90 xchg %ax,%ax f010173e: 66 90 xchg %ax,%ax f0101740 <__umoddi3>: f0101740: f3 0f 1e fb endbr32 f0101744: 55 push %ebp f0101745: 57 push %edi f0101746: 56 push %esi f0101747: 53 push %ebx f0101748: 83 ec 1c sub $0x1c,%esp f010174b: 8b 44 24 3c mov 0x3c(%esp),%eax f010174f: 8b 74 24 30 mov 0x30(%esp),%esi f0101753: 8b 5c 24 34 mov 0x34(%esp),%ebx f0101757: 8b 7c 24 38 mov 0x38(%esp),%edi f010175b: 85 c0 test %eax,%eax f010175d: 75 19 jne f0101778 <__umoddi3+0x38> f010175f: 39 df cmp %ebx,%edi f0101761: 76 5d jbe f01017c0 <__umoddi3+0x80> f0101763: 89 f0 mov %esi,%eax f0101765: 89 da mov %ebx,%edx f0101767: f7 f7 div %edi f0101769: 89 d0 mov %edx,%eax f010176b: 31 d2 xor %edx,%edx f010176d: 83 c4 1c add $0x1c,%esp f0101770: 5b pop %ebx f0101771: 5e pop %esi f0101772: 5f pop %edi f0101773: 5d pop %ebp f0101774: c3 ret f0101775: 8d 76 00 lea 0x0(%esi),%esi f0101778: 89 f2 mov %esi,%edx f010177a: 39 d8 cmp %ebx,%eax f010177c: 76 12 jbe f0101790 <__umoddi3+0x50> f010177e: 89 f0 mov %esi,%eax f0101780: 89 da mov %ebx,%edx f0101782: 83 c4 1c add $0x1c,%esp f0101785: 5b pop %ebx f0101786: 5e pop %esi f0101787: 5f pop %edi f0101788: 5d pop %ebp f0101789: c3 ret f010178a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi f0101790: 0f bd e8 bsr %eax,%ebp f0101793: 83 f5 1f xor $0x1f,%ebp f0101796: 75 50 jne f01017e8 <__umoddi3+0xa8> f0101798: 39 d8 cmp %ebx,%eax f010179a: 0f 82 e0 00 00 00 jb f0101880 <__umoddi3+0x140> f01017a0: 89 d9 mov %ebx,%ecx f01017a2: 39 f7 cmp %esi,%edi f01017a4: 0f 86 d6 00 00 00 jbe f0101880 <__umoddi3+0x140> f01017aa: 89 d0 mov %edx,%eax f01017ac: 89 ca mov %ecx,%edx f01017ae: 83 c4 1c add $0x1c,%esp f01017b1: 5b pop %ebx f01017b2: 5e pop %esi f01017b3: 5f pop %edi f01017b4: 5d pop %ebp f01017b5: c3 ret f01017b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi f01017bd: 8d 76 00 lea 0x0(%esi),%esi f01017c0: 89 fd mov %edi,%ebp f01017c2: 85 ff test %edi,%edi f01017c4: 75 0b jne f01017d1 <__umoddi3+0x91> f01017c6: b8 01 00 00 00 mov $0x1,%eax f01017cb: 31 d2 xor %edx,%edx f01017cd: f7 f7 div %edi f01017cf: 89 c5 mov %eax,%ebp f01017d1: 89 d8 mov %ebx,%eax f01017d3: 31 d2 xor %edx,%edx f01017d5: f7 f5 div %ebp f01017d7: 89 f0 mov %esi,%eax f01017d9: f7 f5 div %ebp f01017db: 89 d0 mov %edx,%eax f01017dd: 31 d2 xor %edx,%edx f01017df: eb 8c jmp f010176d <__umoddi3+0x2d> f01017e1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi f01017e8: 89 e9 mov %ebp,%ecx f01017ea: ba 20 00 00 00 mov $0x20,%edx f01017ef: 29 ea sub %ebp,%edx f01017f1: d3 e0 shl %cl,%eax f01017f3: 89 44 24 08 mov %eax,0x8(%esp) f01017f7: 89 d1 mov %edx,%ecx f01017f9: 89 f8 mov %edi,%eax f01017fb: d3 e8 shr %cl,%eax f01017fd: 8b 4c 24 08 mov 0x8(%esp),%ecx f0101801: 89 54 24 04 mov %edx,0x4(%esp) f0101805: 8b 54 24 04 mov 0x4(%esp),%edx f0101809: 09 c1 or %eax,%ecx f010180b: 89 d8 mov %ebx,%eax f010180d: 89 4c 24 08 mov %ecx,0x8(%esp) f0101811: 89 e9 mov %ebp,%ecx f0101813: d3 e7 shl %cl,%edi f0101815: 89 d1 mov %edx,%ecx f0101817: d3 e8 shr %cl,%eax f0101819: 89 e9 mov %ebp,%ecx f010181b: 89 7c 24 0c mov %edi,0xc(%esp) f010181f: d3 e3 shl %cl,%ebx f0101821: 89 c7 mov %eax,%edi f0101823: 89 d1 mov %edx,%ecx f0101825: 89 f0 mov %esi,%eax f0101827: d3 e8 shr %cl,%eax f0101829: 89 e9 mov %ebp,%ecx f010182b: 89 fa mov %edi,%edx f010182d: d3 e6 shl %cl,%esi f010182f: 09 d8 or %ebx,%eax f0101831: f7 74 24 08 divl 0x8(%esp) f0101835: 89 d1 mov %edx,%ecx f0101837: 89 f3 mov %esi,%ebx f0101839: f7 64 24 0c mull 0xc(%esp) f010183d: 89 c6 mov %eax,%esi f010183f: 89 d7 mov %edx,%edi f0101841: 39 d1 cmp %edx,%ecx f0101843: 72 06 jb f010184b <__umoddi3+0x10b> f0101845: 75 10 jne f0101857 <__umoddi3+0x117> f0101847: 39 c3 cmp %eax,%ebx f0101849: 73 0c jae f0101857 <__umoddi3+0x117> f010184b: 2b 44 24 0c sub 0xc(%esp),%eax f010184f: 1b 54 24 08 sbb 0x8(%esp),%edx f0101853: 89 d7 mov %edx,%edi f0101855: 89 c6 mov %eax,%esi f0101857: 89 ca mov %ecx,%edx f0101859: 0f b6 4c 24 04 movzbl 0x4(%esp),%ecx f010185e: 29 f3 sub %esi,%ebx f0101860: 19 fa sbb %edi,%edx f0101862: 89 d0 mov %edx,%eax f0101864: d3 e0 shl %cl,%eax f0101866: 89 e9 mov %ebp,%ecx f0101868: d3 eb shr %cl,%ebx f010186a: d3 ea shr %cl,%edx f010186c: 09 d8 or %ebx,%eax f010186e: 83 c4 1c add $0x1c,%esp f0101871: 5b pop %ebx f0101872: 5e pop %esi f0101873: 5f pop %edi f0101874: 5d pop %ebp f0101875: c3 ret f0101876: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi f010187d: 8d 76 00 lea 0x0(%esi),%esi f0101880: 29 fe sub %edi,%esi f0101882: 19 c3 sbb %eax,%ebx f0101884: 89 f2 mov %esi,%edx f0101886: 89 d9 mov %ebx,%ecx f0101888: e9 1d ff ff ff jmp f01017aa <__umoddi3+0x6a>