Q:

Returning a byte from /dev/random in assembly

I'm trying to open /dev/random, read one byte from it and exit with it as status... in x86 assembly.
This seems to return random numbers, but I'm not sure it does what I think it does.
# Where do we get our random numbers from
.data
    random: .ascii "/dev/random\0"

# Program goes here
.text
    .global _start
    _start:

    # Get /dev/random fd
    movl $5, %eax      # sys_open (originally $0 by accident)
    movl $random, %ebx # Filename string
    movl $0, %ecx      # O_RDONLY flag
    int $0x80

    # Read one byte onto stack
    movl %eax, %ebx    # The result of sys_open
    movl $3, %eax      # sys_read
    subl $1, %esp      # Make stack space
    movl %esp, %ecx    # Make stack our buffer
    movl $1, %edx      # size_t bytes? only 1
    int $0x80

    # Exit with a random result
    movl %esp, %ebx    # random result as exit status
    movl $1, %eax      # sys_exit
    int $0x80

When I run it through strace I get the following back:
execve("./random", ["./random"], [/* 44 vars */]) = 0
fstat(0, NULL)                          = 3
close(0)                                = -1 EFAULT (Bad address)
write(0, NULL, 1 <unfinished ...>
+++ exited with 12 +++

Notice lack of open() and read()! Also, where did exit() go?
What am I doing wrong?

A:

Ok. Thanks everyone.
minuteman3 suggested use of pop. While it didn't directly solve my issue it led me to another involving use of 32 bit code on a 64 bit machine. Few assembler flags later everything works. Here's the final code for anyone interested:
# Where do we get our random numbers from
.code32
.data
    random: .ascii "/dev/random\0"

# Program goes here
.text
    .global _start
    _start:

    # Get our random number
    movl $5, %eax      # sys_open
    movl $random, %ebx # Filename string
    movl $0, %ecx      # O_RDONLY flag
    int $0x80

    # Read one random number
    movl %eax, %ebx    # The result of sys_open
    movl $3, %eax      # sys_read
    pushl $0           # Make space on stack and clear it
    movl %esp, %ecx    # The stack is our buffer
    movl $1, %edx      # size_t bytes?
    int $0x80

    # Exit with a random result
    popl %ebx          # Get the number back
    movl $1, %eax      # sys_exit
    int $0x80

compiled with
as random.s --32 -W -g -o random.o && ld random.o -o random -melf_i386

