60 lines
2.2 KiB
Plaintext
60 lines
2.2 KiB
Plaintext
# Repeatedly read 32-bit numbers from /dev/random, print them to stdout.
|
|
#
|
|
# To run:
|
|
# $ bootstrap/bootstrap translate [01]*.subx random.subx -o random
|
|
# $ bootstrap/bootstrap run random
|
|
|
|
== code 0x09000000
|
|
# instruction effective address register displacement immediate
|
|
# . op subop mod rm32 base index scale r32
|
|
# . 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes
|
|
|
|
Entry:
|
|
# stream/esi = syscall(open, "/dev/null", O_RDONLY, 0) # we can't use 'fd' because it looks like a hex byte
|
|
bb/copy-to-ebx Filename/imm32
|
|
b9/copy-to-ecx 0/imm32/rdonly
|
|
ba/copy-to-edx 0x180/imm32/fixed-perms
|
|
e8/call syscall_open/disp32
|
|
# . stream = eax
|
|
89/copy 3/mod/direct 6/rm32/esi . . . 0/r32/eax . . # copy eax to esi
|
|
|
|
$loop:
|
|
|
|
# syscall(read, Stream, N, 4)
|
|
89/copy 3/mod/direct 3/rm32/ebx . . . 6/r32/esi . . # copy esi to ebx
|
|
b9/copy-to-ecx N/imm32
|
|
ba/copy-to-edx 4/imm32/size
|
|
e8/call syscall_read/disp32
|
|
|
|
# write-int32-hex-buffered(Stdout, *N)
|
|
# . . push args
|
|
ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . N/disp32 # push *N
|
|
68/push Stdout/imm32
|
|
# . . call
|
|
e8/call write-int32-hex-buffered/disp32
|
|
|
|
# write-buffered(Stdout, Newline)
|
|
# . . push args
|
|
68/push Newline/imm32
|
|
68/push Stdout/imm32
|
|
# . . call
|
|
e8/call write-buffered/disp32
|
|
# . . discard args
|
|
81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp
|
|
|
|
eb/jump $loop/disp8
|
|
|
|
# syscall(exit, 0)
|
|
bb/copy-to-ebx 0/imm32
|
|
e8/call syscall_exit/disp32
|
|
|
|
== data 0x0a000000
|
|
|
|
N:
|
|
0/imm32
|
|
Filename:
|
|
2f 64 65 76 2f 72 61 6e 64 6f 6d 00
|
|
# / d e v / r a n d o m null
|
|
|
|
# . . vim:nowrap:textwidth=0
|