asm1

Download: asm1.zip

Instructions

  1. Create a blank project based on any Nios II system.

  2. Copy asm1.s and nios_macros.m into the project directory.

  3. Make the project. You will probably have to copy the nios_macros.m into the Debug sub-folder.

  4. Run the program as debug, step through the program instruction by instruction.

  5. Run the shell program asm1.sh from within the IDE command shell. You must type:
         ./asm1.sh
    

Contents

Source
Shell script
Size summary
Sections
Symbols
Disassembler output
Data section

Source: asm1.s

.include "./nios_macros.m"

.data 

.asciz "University of Dayton"

table:
.word  21, 37, 18, 14, 42, 11, 19


.text

.global main
.type main, @function


main:
    movi    r2,10       # a = 10
    movi    r3,14       # b = 14
    sub    r4,r3,r2     # c = b - a
    movi    r6,11       # e = 11
    movi    r7,6        # f = 6
                /* Generate: g = (b + c) - (e + f) */
    add    r8,r3,r4     # g = (b+c)
    add    r9,r7,r8     # tmp = (e+f)
    sub    r8,r8,r9     # g = g - tmp
    addi    r9,r8,3     # h = g + 3
                /* do some logic operations */
    and    r4,r2,r3     # c = a & b
    or    r5,r2,r3      # d = a | b
    nor    r6,r2,r3     # e = ~(a | b)
    xor    r7,r2,r3     # f = a ^ b
    andi    r8,r2,0x3f  # g = a & 0x3f
end:
    br    end        /* wait here once the program has completed */

.end

Shell script

#!/bin/sh
nios2-elf-size blank_project_1.elf > asm1.size.txt
nios2-elf-objdump -dS blank_project_1.elf > asm1.disassemble.txt
nios2-elf-objdump -h blank_project_1.elf > asm1.headers.txt
nios2-elf-objcopy -S -O binary blank_project_1.elf asm1.bin
nios2-elf-nm blank_project_1.elf > asm1.symbols.txt
od -Ax -j0x824 -txz asm1.bin > asm1.od.txt

Size

   text       data        bss        dec        hex    filename
   2084        308          4       2396        95c    blank_project_1.elf

Sections


blank_project_1.elf:     file format elf32-littlenios2

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .entry        00000020  00000000  00000000  00000074  2**5
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .exceptions   00000000  00000020  00000020  000009cc  2**0
                  CONTENTS
  2 .text         000007e4  00000020  00000020  00000094  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  3 .rodata       00000020  00000804  00000804  00000878  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .rwdata       00000134  00000824  00000824  00000898  2**2
                  CONTENTS, ALLOC, LOAD, DATA, SMALL_DATA
  5 .bss          00000004  00000958  00000958  000009cc  2**2
                  ALLOC, SMALL_DATA
  6 .onchip_memory_0 00000000  0000095c  0000095c  000009cc  2**0
                  CONTENTS
  7 .comment      00000331  00000000  00000000  000009cc  2**0
                  CONTENTS, READONLY
  8 .debug_aranges 00000228  00000000  00000000  00000d00  2**3
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_pubnames 00000303  00000000  00000000  00000f28  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_info   0000367d  00000000  00000000  0000122b  2**0
                  CONTENTS, READONLY, DEBUGGING
 11 .debug_abbrev 00001078  00000000  00000000  000048a8  2**0
                  CONTENTS, READONLY, DEBUGGING
 12 .debug_line   0000350f  00000000  00000000  00005920  2**0
                  CONTENTS, READONLY, DEBUGGING
 13 .debug_frame  000002ac  00000000  00000000  00008e30  2**2
                  CONTENTS, READONLY, DEBUGGING
 14 .debug_str    00000cff  00000000  00000000  000090dc  2**0
                  CONTENTS, READONLY, DEBUGGING
 15 .debug_alt_sim_info 00000030  00000000  00000000  00009ddc  2**2
                  CONTENTS, READONLY, DEBUGGING
 16 .debug_ranges 00000030  00000030  00000030  00009e0c  2**0
                  CONTENTS, READONLY, DEBUGGING

Symbols

00000804 A __CTOR_END__
00000804 A __CTOR_LIST__
00008000 A __alt_data_end
00000000 A __alt_mem_onchip_memory_0
00008000 A __alt_stack_pointer
0000095c A __bss_end
00000958 A __bss_start
         w __errno
00000000 T __reset
00000230 T _do_ctors
00000958 A _edata
0000095c A _end
000007f4 T _exit
00008930 A _gp
00000954 G _impure_ptr
00000001 a _nios2_macros_
00000020 T _start
00000938 G alt_argc
00000934 G alt_argv
00000100 T alt_avalon_jtag_uart_read
0000017c T alt_avalon_jtag_uart_write
00000940 G alt_dev_list
000001bc T alt_dev_llist_insert
000008b4 G alt_dev_null
000001b4 t alt_dev_null_write
00000930 G alt_envp
00000950 G alt_errno
00000884 G alt_fd_list
00000524 T alt_find_dev
000005b0 T alt_find_file
00000948 G alt_fs_list
00000678 T alt_get_fd
000002f0 T alt_io_redirect
000000a0 T alt_main
0000093c G alt_max_fd
00000278 t alt_open_fd
00000500 T alt_release_fd
000000e8 T alt_sys_init
0000095c A end
0000009c t end
00000958 B errno
000007f4 T exit
000008dc g impure_data
00000858 g jtag_uart_0
00000064 T main
00000798 T memcmp
00000384 T open
000007d4 T strlen
00000839 g table

Disassembler output


blank_project_1.elf:     file format elf32-littlenios2

Disassembly of section .entry:

00000000 <__reset>:
     */
#if NIOS2_ICACHE_SIZE > 0x8000
    movhi r2, %hi(NIOS2_ICACHE_SIZE)
#else 
    movui r2, NIOS2_ICACHE_SIZE
   0:    00840014     movui    r2,4096
#endif

0:
    initi r2
   4:    1001483a     initi    r2
    addi r2, r2, -NIOS2_ICACHE_LINE_SIZE
   8:    10bff804     addi    r2,r2,-32
    bgt r2, zero, 0b
   c:    00bffd16     blt    zero,r2,4 <_nios2_macros_+0x3>
1:

    /*
     * The following block of debug information tells the simulator not to
     * run the loop above, but to perform its actions using faster internal
     * code.
     */
    .pushsection .debug_alt_sim_info
    .int 1, 1, 0b, 1b
    .popsection
#endif /* NIOS2_ICACHE_SIZE > 0 */
    /* 
     * Having initialised the cache, call the entry point for the .text
     * section.
     */
#endif /* ALT_SIM_OPTIMIZE */

    movhi r1, %hiadj(_start)
  10:    00400034     movhi    at,0
    addi r1, r1, %lo(_start)
  14:    08400804     addi    at,at,32

    jmp r1
  18:    0800683a     jmp    at
  1c:    00000000     call    0 <__alt_mem_onchip_memory_0>
Disassembly of section .text:

00000020 <_start>:

    .size __reset, . - __reset

#endif

    /*
     * Start of the .text section, and also the code entry point when
     * the code is executed by a loader rather than directly from reset.
     */

    .section .text
    .align 2
    .globl _start
    .type _start, @function

_start:
/*
*   If ALT_SIM_OPTIMIZE is defined this code WILL NOT RUN ON HARDWARE
*   This defined removes the initialisation of the instruction
*   and data caches at run time. It is assumed that this is done by the 
*   simulation model 
*/
#ifndef ALT_SIM_OPTIMIZE
    /*
     * After initializing the instruction cache, we must initialize the data
     * cache.
     */

#if NIOS2_DCACHE_SIZE > 0

    /* 
     * The assumption here is that the data cache size is always
     * a power of two.
     */
#if NIOS2_DCACHE_SIZE > 0x8000
    movhi r2, %hi(NIOS2_DCACHE_SIZE)
#else
    movui r2, NIOS2_DCACHE_SIZE
  20:    00820014     movui    r2,2048
#endif

0:
    initd 0(r2)
  24:    10000033     initd    0(r2)
    addi r2, r2, -NIOS2_DCACHE_LINE_SIZE
  28:    10bfff04     addi    r2,r2,-4
    bgt r2, zero, 0b
  2c:    00bffd16     blt    zero,r2,24 <_start+0x4>
1:

    /*
     * The following block of debug information tells the simulator not to
     * run the loop above, but to perform its actions using faster internal
     * code.
     */
    .pushsection .debug_alt_sim_info
    .int 2, 1, 0b, 1b
    .popsection



#endif /* NIOS2_DCACHE_SIZE > 0 */
#endif /* ALT_SIM_OPTIMIZE */

    /* 
     * Now that the caches have been cleaned, set up the stack pointer. 
     * The value provided by the linker is assumed to be correctly aligned. 
     */

    /* ALT_LOG - see altera_hal/HAL/inc/sys/alt_log_printf.h */
    ALT_LOG_PUTS(alt_log_msg_cache)

    ALT_LOG_PUTS(alt_log_msg_stackpointer)
    
    movhi sp, %hiadj(__alt_stack_pointer)
  30:    06c00074     movhi    sp,1
    addi sp, sp, %lo(__alt_stack_pointer)
  34:    dee00004     addi    sp,sp,-32768

    /* set up the global pointer. */

    movhi gp, %hiadj(_gp)
  38:    06800074     movhi    gp,1
    addi gp, gp, %lo(_gp)
  3c:    d6a24c04     addi    gp,gp,-30416

#ifndef ALT_SIM_OPTIMIZE

    /*
     * Clear bss.
     *
     * This uses the symbols: __bss_start and __bss_end, which are defined 
     * by the linker script. They mark the begining and the end of the bss 
     * region. The linker script guarantees that these values are word 
     * aligned. 
     */

    /* ALT_LOG - see altera_hal/HAL/inc/sys/alt_log_printf.h */
    ALT_LOG_PUTS(alt_log_msg_bss)

    movhi r2, %hiadj(__bss_start)
  40:    00800034     movhi    r2,0
    addi r2, r2, %lo(__bss_start)
  44:    10825604     addi    r2,r2,2392

    movhi r3, %hiadj(__bss_end)
  48:    00c00034     movhi    r3,0
    addi r3, r3, %lo(__bss_end)
  4c:    18c25704     addi    r3,r3,2396

    beq r2, r3, 1f 
  50:    10c00326     beq    r2,r3,60 <_start+0x40>

0:
    stw zero, (r2)
  54:    10000015     stw    zero,0(r2)
    addi r2, r2, 4
  58:    10800104     addi    r2,r2,4
    bltu r2, r3, 0b
  5c:    10fffd36     bltu    r2,r3,54 <_start+0x34>

1:

    /*
     * The following block of debug information tells the simulator not to
     * run the loop above, but to perform its actions using faster internal
     * code.
     */
    .pushsection .debug_alt_sim_info
    .int 3, 1, 0b, 1b
    .popsection

#endif /* ALT_SIM_OPTIMIZE */

    /* 
     * When running from flash. Load the data sections to RAM, if there
     * are any sections to load.
     *
     * If the user has selected stack checking then we need to set up a safe
     * value in the stack limit register so that the relocation functions
     * don't think the stack has overflowed (the contents of the rwdata
     * section aren't defined until alt_load has been called).
     */

#ifdef ALT_NO_BOOTLOADER
#if ALT_LOAD_SECTIONS

#ifdef ALT_STACK_CHECK


    mov   et, zero

#endif

    call alt_load

#endif /* ALT_LOAD_SECTIONS */
#endif /* ALT_NO_BOOTLOADER */ 

#ifdef ALT_STACK_CHECK

    /*
     * Set up the stack limit (if required).  The linker has set up the
     * copy of the variable which is in memory.
     */

    ldw   et, %gprel(alt_stack_limit_value)(gp)

#endif

    /* ALT_LOG - see altera_hal/HAL/inc/sys/alt_log_printf.h */
    ALT_LOG_PUTS(alt_log_msg_alt_main)
         
    /* call the C entry point.  */
    call alt_main
  60:    00000a00     call    a0 <alt_main>

00000064 <main>:
  64:    00800284     movi    r2,10
  68:    00c00384     movi    r3,14
  6c:    1889c83a     sub    r4,r3,r2
  70:    018002c4     movi    r6,11
  74:    01c00184     movi    r7,6
  78:    1911883a     add    r8,r3,r4
  7c:    3a13883a     add    r9,r7,r8
  80:    4251c83a     sub    r8,r8,r9
  84:    424000c4     addi    r9,r8,3
  88:    10c8703a     and    r4,r2,r3
  8c:    10cab03a     or    r5,r2,r3
  90:    10cc303a     nor    r6,r2,r3
  94:    10cef03a     xor    r7,r2,r3
  98:    12000fcc     andi    r8,r2,63

0000009c <end>:
  9c:    003fff06     br    9c <end>

000000a0 <alt_main>:
 * the users application, i.e. main().
 */

void alt_main (void)
{
  a0:    deffff04     addi    sp,sp,-4
  a4:    dfc00015     stw    ra,0(sp)

static ALT_INLINE void ALT_ALWAYS_INLINE 
       alt_irq_init (const void* base)
{
  NIOS2_WRITE_IENABLE (0);
  a8:    000170fa     wrctl    ienable,zero
  NIOS2_WRITE_STATUS (NIOS2_STATUS_PIE_MSK);
  ac:    00800044     movi    r2,1
  b0:    1001703a     wrctl    status,r2

  /* ALT LOG - please see HAL/sys/alt_log_printf.h for details */
  ALT_LOG_PRINT_BOOT("[alt_main.c] Entering alt_main, calling alt_irq_init.\r\n");
  /* Initialise the interrupt controller. */
  alt_irq_init (ALT_IRQ_BASE);

  /* Initialise the operating system */
  ALT_LOG_PRINT_BOOT("[alt_main.c] Done alt_irq_init, calling alt_os_init.\r\n");
  ALT_OS_INIT();

  /*
   * Initialise the semaphore used to control access to the file descriptor
   * list.
   */

  ALT_LOG_PRINT_BOOT("[alt_main.c] Done OS Init, calling alt_sem_create.\r\n");
  ALT_SEM_CREATE (&alt_fd_list_lock, 1);

  /* Initialise the device drivers/software components. */
  ALT_LOG_PRINT_BOOT("[alt_main.c] Calling alt_sys_init.\r\n");
  alt_sys_init ();
  b4:    00000e80     call    e8 <alt_sys_init>

  /*
   * Redirect stdout etc. to the apropriate devices now that the devices have
   * been initialised. This is only done if the user has requested that the
   * channels been directed away from /dev/null - which is how the channels
   * are configured by default. Making the call to alt_io_redirect conditional
   * allows this function to be excluded from optomised executables when it
   * is unecessary.
   */

  ALT_LOG_PRINT_BOOT("[alt_main.c] Done alt_sys_init.  Redirecting IO.\r\n");
  if (strcmp (ALT_STDOUT, "/dev/null") ||
      strcmp (ALT_STDIN, "/dev/null") ||
      strcmp (ALT_STDERR, "/dev/null"))
  {
    alt_io_redirect (ALT_STDOUT, ALT_STDIN, ALT_STDERR);
  b8:    01000034     movhi    r4,0
  bc:    21020104     addi    r4,r4,2052
  c0:    200b883a     mov    r5,r4
  c4:    200d883a     mov    r6,r4
  c8:    00002f00     call    2f0 <alt_io_redirect>
  }

  /* Call the C++ constructors */

  ALT_LOG_PRINT_BOOT("[alt_main.c] Calling C++ constructors.\r\n");
  _do_ctors ();
  cc:    00002300     call    230 <_do_ctors>

  /*
   * Set the C++ destructors to be called at system shutdown. This is only done
   * if a clean exit has been requested (i.e. the exit() function has not been
   * redefined as _exit()). This is in the interest of reducing code footprint,
   * in that the atexit() overhead is removed when it's not needed.
   */

#ifndef ALT_NO_CLEAN_EXIT
  atexit (_do_dtors);
#endif

  /*
   * Finally, call main(). The return code is then passed to a subsequent
   * call to exit().
   */

  ALT_LOG_PRINT_BOOT("[alt_main.c] Calling main.\r\n");
  exit (main (alt_argc, alt_argv, alt_envp));
  d0:    d1200217     ldw    r4,-32760(gp)
  d4:    d1600117     ldw    r5,-32764(gp)
  d8:    d1a00017     ldw    r6,-32768(gp)
  dc:    00000640     call    64 <main>
  e0:    1009883a     mov    r4,r2
  e4:    00007f40     call    7f4 <_exit>

000000e8 <alt_sys_init>:
extern int alt_fs_reg  (alt_dev* dev); 

static ALT_INLINE int alt_dev_reg (alt_dev* dev)
{
  extern alt_llist alt_dev_list;
  e8:    01000034     movhi    r4,0
  ec:    21021604     addi    r4,r4,2136
  f0:    d1600404     addi    r5,gp,-32752
  f4:    02000034     movhi    r8,0
  f8:    42006f04     addi    r8,r8,444
  fc:    4000683a     jmp    r8

00000100 <alt_avalon_jtag_uart_read>:
 */

int alt_avalon_jtag_uart_read(alt_fd* fd, char * buffer, int space)
{
  alt_avalon_jtag_uart_dev * dev = (alt_avalon_jtag_uart_dev*) fd->dev; 
 100:    20800017     ldw    r2,0(r4)
  unsigned int base = dev->base;

  char * ptr = buffer;
  char * end = buffer + space;
 104:    298f883a     add    r7,r5,r6
 108:    2807883a     mov    r3,r5
 10c:    12000a17     ldw    r8,40(r2)

  while (ptr < end)
  {
    unsigned int data = IORD_ALTERA_AVALON_JTAG_UART_DATA(base);

    if (data & ALTERA_AVALON_JTAG_UART_DATA_RVALID_MSK)
      *ptr++ = (data & ALTERA_AVALON_JTAG_UART_DATA_DATA_MSK) >> ALTERA_AVALON_JTAG_UART_DATA_DATA_OFST;
    else if (ptr != buffer)
      break;
    else if(fd->fd_flags & O_NONBLOCK)
      break;   
 110:    29c0072e     bgeu    r5,r7,130 <alt_avalon_jtag_uart_read+0x30>
 114:    41800037     ldwio    r6,0(r8)
 118:    3004d3fa     srli    r2,r6,15
 11c:    1080004c     andi    r2,r2,1
 120:    10000726     beq    r2,zero,140 <alt_avalon_jtag_uart_read+0x40>
 124:    19800005     stb    r6,0(r3)
 128:    18c00044     addi    r3,r3,1
 12c:    19fff936     bltu    r3,r7,114 <alt_avalon_jtag_uart_read+0x14>
    
  }

  if (ptr != buffer)
 130:    19400b26     beq    r3,r5,160 <alt_avalon_jtag_uart_read+0x60>
    return ptr - buffer;
 134:    1947c83a     sub    r3,r3,r5
  else if (fd->fd_flags & O_NONBLOCK)
    return -EWOULDBLOCK;
  else
    return -EIO;
}
 138:    1805883a     mov    r2,r3
 13c:    f800283a     ret
 140:    197ffc1e     bne    r3,r5,134 <alt_avalon_jtag_uart_read+0x34>
 144:    20800217     ldw    r2,8(r4)
 148:    1004d3ba     srli    r2,r2,14
 14c:    1080004c     andi    r2,r2,1
 150:    1005003a     cmpeq    r2,r2,zero
 154:    103ff626     beq    r2,zero,130 <alt_avalon_jtag_uart_read+0x30>
 158:    19ffee36     bltu    r3,r7,114 <alt_avalon_jtag_uart_read+0x14>
 15c:    003ff406     br    130 <alt_avalon_jtag_uart_read+0x30>
 160:    20800217     ldw    r2,8(r4)
 164:    00fffd44     movi    r3,-11
 168:    1004d3ba     srli    r2,r2,14
 16c:    1080004c     andi    r2,r2,1
 170:    103ff11e     bne    r2,zero,138 <alt_avalon_jtag_uart_read+0x38>
 174:    00fffec4     movi    r3,-5
 178:    003fef06     br    138 <alt_avalon_jtag_uart_read+0x38>

0000017c <alt_avalon_jtag_uart_write>:

/* Write routine.  The small version blocks when there is no space to write
 * into, so it's performance will be very bad if you are writing more than
 * one FIFOs worth of data.  But you said you didn't want to use interrupts :-)
 */

int alt_avalon_jtag_uart_write(alt_fd* fd, const char * ptr, int count)
{
  alt_avalon_jtag_uart_dev * dev = (alt_avalon_jtag_uart_dev*) fd->dev; 
 17c:    20800017     ldw    r2,0(r4)
  unsigned int base = dev->base;

  const char * end = ptr + count;
 180:    2989883a     add    r4,r5,r6
 184:    11c00a17     ldw    r7,40(r2)

  while (ptr < end)
    if ((IORD_ALTERA_AVALON_JTAG_UART_CONTROL(base) & ALTERA_AVALON_JTAG_UART_CONTROL_WSPACE_MSK) != 0)
      IOWR_ALTERA_AVALON_JTAG_UART_DATA(base, *ptr++);
 188:    2900082e     bgeu    r5,r4,1ac <alt_avalon_jtag_uart_write+0x30>
 18c:    38c00104     addi    r3,r7,4
 190:    18800037     ldwio    r2,0(r3)
 194:    10bfffec     andhi    r2,r2,65535
 198:    10000326     beq    r2,zero,1a8 <alt_avalon_jtag_uart_write+0x2c>
 19c:    28800007     ldb    r2,0(r5)
 1a0:    38800035     stwio    r2,0(r7)
 1a4:    29400044     addi    r5,r5,1
 1a8:    293ff936     bltu    r5,r4,190 <alt_avalon_jtag_uart_write+0x14>

  return count;
}
 1ac:    3005883a     mov    r2,r6
 1b0:    f800283a     ret

000001b4 <alt_dev_null_write>:

static int alt_dev_null_write (alt_fd* fd, const char* ptr, int len)
{
  return len;
}
 1b4:    3005883a     mov    r2,r6
 1b8:    f800283a     ret

000001bc <alt_dev_llist_insert>:
 *
 */

int alt_dev_llist_insert (alt_dev_llist* dev, alt_llist* list)
{
 1bc:    deffff04     addi    sp,sp,-4
 1c0:    dfc00015     stw    ra,0(sp)
  /*
   * check that the device exists, and that it has a valid name.
   */

  if (!dev || !dev->name)
 1c4:    20000326     beq    r4,zero,1d4 <alt_dev_llist_insert+0x18>
 1c8:    20800217     ldw    r2,8(r4)
  {
    ALT_ERRNO = EINVAL;
    return -EINVAL;
  }
  
  /*
   * register the device.
   */
  
  alt_llist_insert(list, &dev->llist);

  return 0;  
 1cc:    000d883a     mov    r6,zero
 1d0:    10000a1e     bne    r2,zero,1fc <alt_dev_llist_insert+0x40>
extern int errno;

static ALT_INLINE int* alt_get_errno(void)
{
  return ((alt_errno) ? alt_errno() : &errno);
 1d4:    d0a00817     ldw    r2,-32736(gp)
 1d8:    d0e00a04     addi    r3,gp,-32728
 1dc:    1000111e     bne    r2,zero,224 <alt_dev_llist_insert+0x68>
 1e0:    01bffa84     movi    r6,-22

extern int errno;

static ALT_INLINE int* alt_get_errno(void)
{
 1e4:    00800584     movi    r2,22
 1e8:    18800015     stw    r2,0(r3)
}
 1ec:    3005883a     mov    r2,r6
 1f0:    dfc00017     ldw    ra,0(sp)
 1f4:    dec00104     addi    sp,sp,4
 1f8:    f800283a     ret
static ALT_INLINE void ALT_ALWAYS_INLINE alt_llist_insert(alt_llist* list, 
                alt_llist* entry)
{
  entry->previous = list;
  entry->next     = list->next;
 1fc:    28c00017     ldw    r3,0(r5)
 200:    21400115     stw    r5,4(r4)
 204:    20c00015     stw    r3,0(r4)

  list->next->previous = entry;
 208:    28800017     ldw    r2,0(r5)
  list->next           = entry;
 20c:    29000015     stw    r4,0(r5)
 210:    11000115     stw    r4,4(r2)
 214:    3005883a     mov    r2,r6
 218:    dfc00017     ldw    ra,0(sp)
 21c:    dec00104     addi    sp,sp,4
 220:    f800283a     ret
extern int errno;

static ALT_INLINE int* alt_get_errno(void)
{
  return ((alt_errno) ? alt_errno() : &errno);
 224:    103ee83a     callr    r2
 228:    1007883a     mov    r3,r2
 22c:    003fec06     br    1e0 <alt_dev_llist_insert+0x24>

00000230 <_do_ctors>:
 * Run the C++ static constructors.
 */

void _do_ctors(void)
{
 230:    defffd04     addi    sp,sp,-12
 234:    dc000115     stw    r16,4(sp)
 238:    dc400015     stw    r17,0(sp)
  constructor* ctor;

  for (ctor = &__CTOR_END__[-1]; ctor >= __CTOR_LIST__; ctor--)
 23c:    04000034     movhi    r16,0
 240:    84020004     addi    r16,r16,2048
 244:    04400034     movhi    r17,0
 248:    8c420104     addi    r17,r17,2052
 24c:    dfc00215     stw    ra,8(sp)
 250:    84400436     bltu    r16,r17,264 <_do_ctors+0x34>
        (*ctor) (); 
 254:    80800017     ldw    r2,0(r16)
 258:    843fff04     addi    r16,r16,-4
 25c:    103ee83a     callr    r2
 260:    847ffc2e     bgeu    r16,r17,254 <_do_ctors+0x24>
 264:    dfc00217     ldw    ra,8(sp)
 268:    dc000117     ldw    r16,4(sp)
 26c:    dc400017     ldw    r17,0(sp)
 270:    dec00304     addi    sp,sp,12
 274:    f800283a     ret

00000278 <alt_open_fd>:
 * remains unchanged.
 */

static void alt_open_fd(alt_fd* fd, const char* name, int flags, int mode)
{
 278:    defffe04     addi    sp,sp,-8
 27c:    dc000015     stw    r16,0(sp)
 280:    2021883a     mov    r16,r4
  int old;

  old = open (name, flags, mode);
 284:    2809883a     mov    r4,r5
 288:    300b883a     mov    r5,r6
 28c:    380d883a     mov    r6,r7
 290:    dfc00115     stw    ra,4(sp)
 294:    00003840     call    384 <open>

  if (old >= 0)
  {
    fd->dev      = alt_fd_list[old].dev;
 298:    11400324     muli    r5,r2,12
 29c:    00c00034     movhi    r3,0
 2a0:    18c22104     addi    r3,r3,2180
    fd->priv     = alt_fd_list[old].priv;
    fd->fd_flags = alt_fd_list[old].fd_flags;

    alt_release_fd (old);
 2a4:    1009883a     mov    r4,r2
 2a8:    28cb883a     add    r5,r5,r3
 2ac:    10000c16     blt    r2,zero,2e0 <alt_open_fd+0x68>
 2b0:    28800217     ldw    r2,8(r5)
 2b4:    28c00017     ldw    r3,0(r5)
 2b8:    29400117     ldw    r5,4(r5)
 2bc:    02000034     movhi    r8,0
 2c0:    42014004     addi    r8,r8,1280
 2c4:    80800215     stw    r2,8(r16)
 2c8:    80c00015     stw    r3,0(r16)
 2cc:    81400115     stw    r5,4(r16)
  }
} 
 2d0:    dfc00117     ldw    ra,4(sp)
 2d4:    dc000017     ldw    r16,0(sp)
 2d8:    dec00204     addi    sp,sp,8
 2dc:    4000683a     jmp    r8
 2e0:    dfc00117     ldw    ra,4(sp)
 2e4:    dc000017     ldw    r16,0(sp)
 2e8:    dec00204     addi    sp,sp,8
 2ec:    f800283a     ret

000002f0 <alt_io_redirect>:

/*
 * alt_io_redirect() is called once the device/filesystem lists have been 
 * initialised, but before main(). Its function is to redirect standard in,
 * standard out and standard error so that they point to the devices selected by
 * the user (as defined in system.h).
 *
 * Prior to the call to this function, io is directed towards /dev/null. If
 * i/o can not be redirected to the requested device, for example if the device 
 * does not exist, then it remains directed at /dev/null. 
 */
 
void alt_io_redirect(const char* stdout_dev, 
                     const char* stdin_dev, 
                     const char* stderr_dev)
{
 2f0:    defffa04     addi    sp,sp,-24
 2f4:    dc000415     stw    r16,16(sp)
 2f8:    dc800215     stw    r18,8(sp)
  /* Redirect the channels */

  alt_open_fd (&alt_fd_list[STDOUT_FILENO], stdout_dev, O_WRONLY, 0777);
 2fc:    04000034     movhi    r16,0
 300:    84022404     addi    r16,r16,2192
 304:    04807fc4     movi    r18,511
 308:    dd800015     stw    r22,0(sp)
 30c:    05800044     movi    r22,1
 310:    dc400315     stw    r17,12(sp)
 314:    dd000115     stw    r20,4(sp)
 318:    3023883a     mov    r17,r6
 31c:    2829883a     mov    r20,r5
 320:    b00d883a     mov    r6,r22
 324:    200b883a     mov    r5,r4
 328:    900f883a     mov    r7,r18
 32c:    8009883a     mov    r4,r16
 330:    dfc00515     stw    ra,20(sp)
 334:    00002780     call    278 <alt_open_fd>
  alt_open_fd (&alt_fd_list[STDIN_FILENO], stdin_dev, O_RDONLY, 0777);
 338:    a00b883a     mov    r5,r20
 33c:    813ffd04     addi    r4,r16,-12
 340:    900f883a     mov    r7,r18
 344:    000d883a     mov    r6,zero
 348:    00002780     call    278 <alt_open_fd>
  alt_open_fd (&alt_fd_list[STDERR_FILENO], stderr_dev, O_WRONLY, 0777);
 34c:    02000034     movhi    r8,0
 350:    42009e04     addi    r8,r8,632
 354:    81000304     addi    r4,r16,12
 358:    880b883a     mov    r5,r17
 35c:    b00d883a     mov    r6,r22
 360:    900f883a     mov    r7,r18
 364:    dfc00517     ldw    ra,20(sp)
 368:    dc000417     ldw    r16,16(sp)
 36c:    dc400317     ldw    r17,12(sp)
 370:    dc800217     ldw    r18,8(sp)
 374:    dd000117     ldw    r20,4(sp)
 378:    dd800017     ldw    r22,0(sp)
 37c:    dec00604     addi    sp,sp,24
 380:    4000683a     jmp    r8

00000384 <open>:
 * ALT_OPEN is mapped onto the open() system call in alt_syscall.h
 */
 
int ALT_OPEN (const char* file, int flags, int mode)
{ 
 384:    defff804     addi    sp,sp,-32
 388:    dd000215     stw    r20,8(sp)
 38c:    2829883a     mov    r20,r5
  alt_dev* dev;
  alt_fd*  fd;
  int index  = -1;
  int status = -ENODEV;
  int isafs = 0;

  /* 
   * Check the device list, to see if a device with a matching name is 
   * registered.
   */
  
  if (!(dev = alt_find_dev (file, &alt_dev_list)))
 390:    d1600404     addi    r5,gp,-32752
 394:    dc000615     stw    r16,24(sp)
 398:    dc400515     stw    r17,20(sp)
 39c:    dc800415     stw    r18,16(sp)
 3a0:    dcc00315     stw    r19,12(sp)
 3a4:    dd400115     stw    r21,4(sp)
 3a8:    dd800015     stw    r22,0(sp)
 3ac:    dfc00715     stw    ra,28(sp)
 3b0:    302d883a     mov    r22,r6
 3b4:    202b883a     mov    r21,r4
 3b8:    00005240     call    524 <alt_find_dev>
 3bc:    1021883a     mov    r16,r2
 3c0:    04bfffc4     movi    r18,-1
 3c4:    047ffb44     movi    r17,-19
 3c8:    0027883a     mov    r19,zero
 3cc:    10003f26     beq    r2,zero,4cc <open+0x148>
  {
    /* No matching device, so try the filesystem list */

    dev   = alt_find_file (file);
    isafs = 1;
  }

  /* 
   * If a matching device or filesystem is found, allocate a file descriptor. 
   */

  if (dev)
 3d0:    80003526     beq    r16,zero,4a8 <open+0x124>
  {
    if ((index = alt_get_fd (dev)) < 0)
 3d4:    8009883a     mov    r4,r16
 3d8:    00006780     call    678 <alt_get_fd>
 3dc:    1025883a     mov    r18,r2
    {
      status = index;
 3e0:    1023883a     mov    r17,r2
 3e4:    10002f16     blt    r2,zero,4a4 <open+0x120>
    }
    else
    {
      fd = &alt_fd_list[index];
 3e8:    10800324     muli    r2,r2,12
 3ec:    02000034     movhi    r8,0
 3f0:    42022104     addi    r8,r8,2180
      fd->fd_flags = (flags & ~ALT_FD_FLAGS_MASK);
 3f4:    00d00034     movhi    r3,16384
 3f8:    18ffffc4     addi    r3,r3,-1
      
      /* If this is a device, ensure it isn't already locked */

      if (isafs || ((status = alt_file_locked (fd)) >= 0))
 3fc:    9808c03a     cmpne    r4,r19,zero
 400:    120f883a     add    r7,r2,r8
 404:    a0c4703a     and    r2,r20,r3
 408:    2000111e     bne    r4,zero,450 <open+0xcc>
 40c:    39800017     ldw    r6,0(r7)
 410:    d1600317     ldw    r5,-32756(gp)
 414:    10900034     orhi    r2,r2,16384
 418:    4007883a     mov    r3,r8
 41c:    0009883a     mov    r4,zero
 420:    38800215     stw    r2,8(r7)
 424:    00000206     br    430 <open+0xac>
 428:    18c00304     addi    r3,r3,12
 42c:    29002c36     bltu    r5,r4,4e0 <open+0x15c>
 430:    18800017     ldw    r2,0(r3)
 434:    21000044     addi    r4,r4,1
 438:    11bffb1e     bne    r2,r6,428 <open+0xa4>
 43c:    18800217     ldw    r2,8(r3)
 440:    103ff90e     bge    r2,zero,428 <open+0xa4>
 444:    19fff826     beq    r3,r7,428 <open+0xa4>
 448:    00bffcc4     movi    r2,-13
 44c:    00002506     br    4e4 <open+0x160>
 450:    38800215     stw    r2,8(r7)
      {
        /* 
         * If the device or filesystem provides an open() callback function,
         * call it now to perform any device/filesystem specific operations.
         */
    
        status = (dev->open) ? dev->open(fd, file, flags, mode): 0;
 454:    80800317     ldw    r2,12(r16)
 458:    10000c1e     bne    r2,zero,48c <open+0x108>
      }
    }
  }
  else
  {
    status = -ENODEV;
  }

  /* Allocation failed, so clean up and return an error */ 

  if (status < 0)
  {
    alt_release_fd (index);  
    ALT_ERRNO = -status;
    return -1;
  }
  
  /* return the reference upon success */

  return index;
 45c:    9007883a     mov    r3,r18
}
 460:    1805883a     mov    r2,r3
 464:    dfc00717     ldw    ra,28(sp)
 468:    dc000617     ldw    r16,24(sp)
 46c:    dc400517     ldw    r17,20(sp)
 470:    dc800417     ldw    r18,16(sp)
 474:    dcc00317     ldw    r19,12(sp)
 478:    dd000217     ldw    r20,8(sp)
 47c:    dd400117     ldw    r21,4(sp)
 480:    dd800017     ldw    r22,0(sp)
 484:    dec00804     addi    sp,sp,32
 488:    f800283a     ret
 48c:    3809883a     mov    r4,r7
 490:    a80b883a     mov    r5,r21
 494:    a00d883a     mov    r6,r20
 498:    b00f883a     mov    r7,r22
 49c:    103ee83a     callr    r2
 4a0:    1023883a     mov    r17,r2
 4a4:    883fed0e     bge    r17,zero,45c <open+0xd8>
 4a8:    9009883a     mov    r4,r18
 4ac:    00005000     call    500 <alt_release_fd>
extern int errno;

static ALT_INLINE int* alt_get_errno(void)
{
  return ((alt_errno) ? alt_errno() : &errno);
 4b0:    d0a00817     ldw    r2,-32736(gp)
 4b4:    d1200a04     addi    r4,gp,-32728
 4b8:    10000e1e     bne    r2,zero,4f4 <open+0x170>
 4bc:    0445c83a     sub    r2,zero,r17
 4c0:    00ffffc4     movi    r3,-1

extern int errno;

static ALT_INLINE int* alt_get_errno(void)
{
 4c4:    20800015     stw    r2,0(r4)
 4c8:    003fe506     br    460 <open+0xdc>
 4cc:    a809883a     mov    r4,r21
 4d0:    00005b00     call    5b0 <alt_find_file>
 4d4:    1021883a     mov    r16,r2
 4d8:    04c00044     movi    r19,1
 4dc:    003fbc06     br    3d0 <open+0x4c>
 4e0:    0005883a     mov    r2,zero
 4e4:    1023883a     mov    r17,r2
 4e8:    103fda0e     bge    r2,zero,454 <open+0xd0>
 4ec:    883fdb0e     bge    r17,zero,45c <open+0xd8>
 4f0:    003fed06     br    4a8 <open+0x124>
extern int errno;

static ALT_INLINE int* alt_get_errno(void)
{
  return ((alt_errno) ? alt_errno() : &errno);
 4f4:    103ee83a     callr    r2
 4f8:    1009883a     mov    r4,r2
 4fc:    003fef06     br    4bc <open+0x138>

00000500 <alt_release_fd>:
 */

void alt_release_fd (int fd)
{
  if (fd > 2)
 500:    00800084     movi    r2,2
  {
    alt_fd_list[fd].fd_flags = 0;
 504:    20c00324     muli    r3,r4,12
 508:    1100050e     bge    r2,r4,520 <alt_release_fd+0x20>
 50c:    00800034     movhi    r2,0
 510:    10822104     addi    r2,r2,2180
 514:    1885883a     add    r2,r3,r2
    alt_fd_list[fd].dev      = 0;
 518:    10000015     stw    zero,0(r2)
 51c:    10000215     stw    zero,8(r2)
 520:    f800283a     ret

00000524 <alt_find_dev>:
 * be found.
 */
 
alt_dev* alt_find_dev(const char* name, alt_llist* llist)
{
 524:    defffb04     addi    sp,sp,-20
 528:    dc400215     stw    r17,8(sp)
 52c:    dc800115     stw    r18,4(sp)
 530:    dcc00015     stw    r19,0(sp)
 534:    dfc00415     stw    ra,16(sp)
 538:    dc000315     stw    r16,12(sp)
  alt_dev* next = (alt_dev*) llist->next;
 53c:    2c000017     ldw    r16,0(r5)
 540:    2823883a     mov    r17,r5
 544:    2027883a     mov    r19,r4
  alt_32 len;

  len  = strlen(name) + 1;
 548:    00007d40     call    7d4 <strlen>
 54c:    14800044     addi    r18,r2,1

  /*
   * Check each list entry in turn, until a match is found, or we reach the
   * end of the list (i.e. next winds up pointing back to the list head).
   */ 

  while (next != (alt_dev*) llist)
  {

    /* 
     * memcmp() is used here rather than strcmp() in order to reduce the size
     * of the executable.
     */

    if (!memcmp (next->name, name, len))
    {
      /* match found */

      return next;
    }
    next = (alt_dev*) next->llist.next;
 550:    84400726     beq    r16,r17,570 <alt_find_dev+0x4c>
 554:    81000217     ldw    r4,8(r16)
 558:    980b883a     mov    r5,r19
 55c:    900d883a     mov    r6,r18
 560:    00007980     call    798 <memcmp>
 564:    10000a26     beq    r2,zero,590 <alt_find_dev+0x6c>
 568:    84000017     ldw    r16,0(r16)
 56c:    847ff91e     bne    r16,r17,554 <alt_find_dev+0x30>
  }
  
  /* No match found */
  
  return NULL;
 570:    0005883a     mov    r2,zero
}
 574:    dfc00417     ldw    ra,16(sp)
 578:    dc000317     ldw    r16,12(sp)
 57c:    dc400217     ldw    r17,8(sp)
 580:    dc800117     ldw    r18,4(sp)
 584:    dcc00017     ldw    r19,0(sp)
 588:    dec00504     addi    sp,sp,20
 58c:    f800283a     ret
 590:    8005883a     mov    r2,r16
 594:    dfc00417     ldw    ra,16(sp)
 598:    dc000317     ldw    r16,12(sp)
 59c:    dc400217     ldw    r17,8(sp)
 5a0:    dc800117     ldw    r18,4(sp)
 5a4:    dcc00017     ldw    r19,0(sp)
 5a8:    dec00504     addi    sp,sp,20
 5ac:    f800283a     ret

000005b0 <alt_find_file>:
 * "/myfilesystem/junk.txt" would match: "/myfilesystem", but not: "/myfile". 
 */
 
alt_dev* alt_find_file (const char* name)
{
 5b0:    defffa04     addi    sp,sp,-24
 5b4:    dc000415     stw    r16,16(sp)
  alt_dev* next = (alt_dev*) alt_fs_list.next;   
 5b8:    d4200617     ldw    r16,-32744(gp)
 5bc:    dd000015     stw    r20,0(sp)
 5c0:    d5200604     addi    r20,gp,-32744
 5c4:    dc800215     stw    r18,8(sp)
 5c8:    dfc00515     stw    ra,20(sp)
 5cc:    dc400315     stw    r17,12(sp)
 5d0:    dcc00115     stw    r19,4(sp)
 5d4:    2025883a     mov    r18,r4

  alt_32 len;
 
  /*
   * Check each list entry in turn, until a match is found, or we reach the
   * end of the list (i.e. next winds up pointing back to the list head).
   */ 
 
  while (next != (alt_dev*) &alt_fs_list)
  {
    len = strlen(next->name);
    
    if (next->name[len-1] == '/')
    {
      len -= 1;
    }

    if (((name[len] == '/') || (name[len] == '\0')) && 
        !memcmp (next->name, name, len))
    {
      /* match found */

      return next;
    }
    next = (alt_dev*) next->llist.next;
 5d8:    85001526     beq    r16,r20,630 <alt_find_file+0x80>
 5dc:    04c00bc4     movi    r19,47
 5e0:    00000806     br    604 <alt_find_file+0x54>
 5e4:    9185883a     add    r2,r18,r6
 5e8:    10800007     ldb    r2,0(r2)
 5ec:    14c00126     beq    r2,r19,5f4 <alt_find_file+0x44>
 5f0:    1000021e     bne    r2,zero,5fc <alt_find_file+0x4c>
 5f4:    00007980     call    798 <memcmp>
 5f8:    10001626     beq    r2,zero,654 <alt_find_file+0xa4>
 5fc:    84000017     ldw    r16,0(r16)
 600:    85000b26     beq    r16,r20,630 <alt_find_file+0x80>
 604:    84400217     ldw    r17,8(r16)
 608:    8809883a     mov    r4,r17
 60c:    00007d40     call    7d4 <strlen>
 610:    100d883a     mov    r6,r2
 614:    8885883a     add    r2,r17,r2
 618:    10ffffc7     ldb    r3,-1(r2)
 61c:    8809883a     mov    r4,r17
 620:    900b883a     mov    r5,r18
 624:    1cffef1e     bne    r3,r19,5e4 <alt_find_file+0x34>
 628:    31bfffc4     addi    r6,r6,-1
 62c:    003fed06     br    5e4 <alt_find_file+0x34>
  }
  
  /* No match found */
  
  return NULL;     
 630:    0005883a     mov    r2,zero
}
 634:    dfc00517     ldw    ra,20(sp)
 638:    dc000417     ldw    r16,16(sp)
 63c:    dc400317     ldw    r17,12(sp)
 640:    dc800217     ldw    r18,8(sp)
 644:    dcc00117     ldw    r19,4(sp)
 648:    dd000017     ldw    r20,0(sp)
 64c:    dec00604     addi    sp,sp,24
 650:    f800283a     ret
 654:    8005883a     mov    r2,r16
 658:    dfc00517     ldw    ra,20(sp)
 65c:    dc000417     ldw    r16,16(sp)
 660:    dc400317     ldw    r17,12(sp)
 664:    dc800217     ldw    r18,8(sp)
 668:    dcc00117     ldw    r19,4(sp)
 66c:    dd000017     ldw    r20,0(sp)
 670:    dec00604     addi    sp,sp,24
 674:    f800283a     ret

00000678 <alt_get_fd>:
 * negative value indicates failure.
 */

int alt_get_fd (alt_dev* dev)
{
 678:    d1e00317     ldw    r7,-32756(gp)
  alt_32 i;
  int rc = -EMFILE;
 67c:    023ffa04     movi    r8,-24
  
  /* 
   * Take the alt_fd_list_lock semaphore in order to avoid races when 
   * accessing the file descriptor pool.
   */
  
  ALT_SEM_PEND(alt_fd_list_lock, 0);
  
  /* 
   * Search through the list of file descriptors, and allocate the first
   * free descriptor that's found. 
   *
   * If a free descriptor is found, then the value of "alt_max_fd" is 
   * updated accordingly. "alt_max_fd" is a 'highwater mark' which 
   * indicates the highest file descriptor ever allocated. This is used to
   * improve efficency when searching the file descriptor list, and 
   * therefore reduce contention on the alt_fd_list_lock semaphore. 
   */

  for (i = 0; i < ALT_MAX_FD; i++)
 680:    000b883a     mov    r5,zero
 684:    018000c4     movi    r6,3
 688:    00c00034     movhi    r3,0
 68c:    18c22104     addi    r3,r3,2180
  {
    if (!alt_fd_list[i].dev)
 690:    18800017     ldw    r2,0(r3)
 694:    10000626     beq    r2,zero,6b0 <alt_get_fd+0x38>
 698:    29400044     addi    r5,r5,1
 69c:    18c00304     addi    r3,r3,12
 6a0:    317ffb0e     bge    r6,r5,690 <alt_get_fd+0x18>
    {
      alt_fd_list[i].dev = dev;
      if (i > alt_max_fd)
      {
        alt_max_fd = i;
      }
      rc = i;
      goto alt_get_fd_exit;
    }
  }

 alt_get_fd_exit:

  /*
   * Release the alt_fd_list_lock semaphore now that we are done with the
   * file descriptor pool.
   */

  ALT_SEM_POST(alt_fd_list_lock);

  return rc;
}
 6a4:    4005883a     mov    r2,r8
 6a8:    d1e00315     stw    r7,-32756(gp)
 6ac:    f800283a     ret
 6b0:    19000015     stw    r4,0(r3)
 6b4:    3940010e     bge    r7,r5,6bc <alt_get_fd+0x44>
 6b8:    280f883a     mov    r7,r5
 6bc:    2811883a     mov    r8,r5
 6c0:    4005883a     mov    r2,r8
 6c4:    d1e00315     stw    r7,-32756(gp)
 6c8:    f800283a     ret
 6cc:    d0a00917     ldw    r2,-32732(gp)
 6d0:    defff804     addi    sp,sp,-32
 6d4:    dd800015     stw    r22,0(sp)
 6d8:    dfc00715     stw    ra,28(sp)
 6dc:    dc000615     stw    r16,24(sp)
 6e0:    dc400515     stw    r17,20(sp)
 6e4:    dc800415     stw    r18,16(sp)
 6e8:    dcc00315     stw    r19,12(sp)
 6ec:    dd000215     stw    r20,8(sp)
 6f0:    dd400115     stw    r21,4(sp)
 6f4:    15000c17     ldw    r20,48(r2)
 6f8:    202d883a     mov    r22,r4
 6fc:    a0002426     beq    r20,zero,790 <alt_get_fd+0x118>
 700:    a0800117     ldw    r2,4(r20)
 704:    a5402204     addi    r21,r20,136
 708:    0027883a     mov    r19,zero
 70c:    143fffc4     addi    r16,r2,-1
 710:    8006803a     cmplt    r3,r16,zero
 714:    1800021e     bne    r3,zero,720 <alt_get_fd+0xa8>
 718:    00800044     movi    r2,1
 71c:    1426983a     sll    r19,r2,r16
 720:    1800191e     bne    r3,zero,788 <alt_get_fd+0x110>
 724:    800490ba     slli    r2,r16,2
 728:    1025883a     mov    r18,r2
 72c:    1505883a     add    r2,r2,r20
 730:    14400204     addi    r17,r2,8
 734:    00000806     br    758 <alt_get_fd+0xe0>
 738:    88800017     ldw    r2,0(r17)
 73c:    29400017     ldw    r5,0(r5)
 740:    843fffc4     addi    r16,r16,-1
 744:    94bfff04     addi    r18,r18,-4
 748:    103ee83a     callr    r2
 74c:    8c7fff04     addi    r17,r17,-4
 750:    9827d07a     srai    r19,r19,1
 754:    80000c16     blt    r16,zero,788 <alt_get_fd+0x110>
 758:    a8802017     ldw    r2,128(r21)
 75c:    954b883a     add    r5,r18,r21
 760:    b009883a     mov    r4,r22
 764:    14c4703a     and    r2,r2,r19
 768:    103ff31e     bne    r2,zero,738 <alt_get_fd+0xc0>
 76c:    88800017     ldw    r2,0(r17)
 770:    843fffc4     addi    r16,r16,-1
 774:    94bfff04     addi    r18,r18,-4
 778:    103ee83a     callr    r2
 77c:    8c7fff04     addi    r17,r17,-4
 780:    9827d07a     srai    r19,r19,1
 784:    803ff40e     bge    r16,zero,758 <alt_get_fd+0xe0>
 788:    a5000017     ldw    r20,0(r20)
 78c:    a03fdc1e     bne    r20,zero,700 <alt_get_fd+0x88>
 790:    b009883a     mov    r4,r22
 794:    00007f40     call    7f4 <_exit>

00000798 <memcmp>:
 798:    31bfffc4     addi    r6,r6,-1
 79c:    00bfffc4     movi    r2,-1
 7a0:    30800826     beq    r6,r2,7c4 <memcmp+0x2c>
 7a4:    100f883a     mov    r7,r2
 7a8:    20c00003     ldbu    r3,0(r4)
 7ac:    28800003     ldbu    r2,0(r5)
 7b0:    31bfffc4     addi    r6,r6,-1
 7b4:    21000044     addi    r4,r4,1
 7b8:    29400044     addi    r5,r5,1
 7bc:    1880031e     bne    r3,r2,7cc <memcmp+0x34>
 7c0:    31fff91e     bne    r6,r7,7a8 <memcmp+0x10>
 7c4:    0005883a     mov    r2,zero
 7c8:    f800283a     ret
 7cc:    1885c83a     sub    r2,r3,r2
 7d0:    f800283a     ret

000007d4 <strlen>:
 7d4:    20800007     ldb    r2,0(r4)
 7d8:    2007883a     mov    r3,r4
 7dc:    10000326     beq    r2,zero,7ec <strlen+0x18>
 7e0:    21000044     addi    r4,r4,1
 7e4:    20800007     ldb    r2,0(r4)
 7e8:    103ffd1e     bne    r2,zero,7e0 <strlen+0xc>
 7ec:    20c5c83a     sub    r2,r4,r3
 7f0:    f800283a     ret

000007f4 <_exit>:
  __asm__ volatile ("break 2" : : "D02"(r2), "D03"(r3) ALT_GMON_DATA );

#else

  __asm__ volatile ("wrctl ctl6, %0" : : "r"(1), "D02"(r2) );
 7f4:    00c00044     movi    r3,1
 7f8:    2005883a     mov    r2,r4
 7fc:    180171ba     wrctl    ctl6,r3
 800:    003fff06     br    800 <_exit+0xc>

Data Section Contents

000824 76696e55 69737265 6f207974 61442066  >University of Da<
000834 6e6f7479 00000000 00000015 00000025  >yton........%...<
000844 00000012 0000000e 0000002a 0000000b  >........*.......<
000854 00000013 00000000 00000000 00000804  >................<
000864 00000000 00000000 00000100 0000017c  >............|...<
000874 00000000 00000000 00000000 00008830  >............0...<
000884 000008b4 00000000 00000000 000008b4  >................<
000894 00000000 00000000 000008b4 00000000  >................<
0008a4 00000000 00000000 00000000 00000000  >................<
0008b4 00000940 00000940 00000818 00000000  >@...@...........<
0008c4 00000000 00000000 000001b4 00000000  >................<
0008d4 00000000 00000000 00000910 00000918  >................<
0008e4 00000920 00000000 00000000 00000000  > ...............<
0008f4 00000000 00000000 00000000 00000000  >................<
000904 00000000 00000000 00000000 00000004  >................<
000914 00000000 0001000a 00000000 0002000a  >................<
000924 00000000 00000000 00000000 00000000  >................<
000934 00000000 00000000 ffffffff 000008b4  >................<
000944 000008b4 00000948 00000948 00000000  >....H...H.......<
000954 000008dc                             >....<
000958


Maintained by John Loomis, last updated Tue Jul 10 16:10:53 2007