blob: 70eaffa24e339106ec41b521682da2aad0cb494a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# Repeatedly read 32-bit numbers from /dev/random, print them to stdout.
#
# To run:
# $ ./bootstrap translate init.linux 0*.subx apps/random.subx -o apps/random
# $ ./bootstrap run apps/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
b8/copy-to-eax 5/imm32/open
cd/syscall 0x80/imm8
# . 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
b8/copy-to-eax 3/imm32/read
cd/syscall 0x80/imm8
# print-int32-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 print-int32-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
b8/copy-to-eax 1/imm32/exit
cd/syscall 0x80/imm8
== 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
|