about summary refs log tree commit diff stats
path: root/linux/ex7.subx
blob: ad1a50b64571aaa5ebd6769f1e901c807c982230 (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# Example showing file syscalls.
#
# Create a file, open it for writing, write a character to it, close it, open
# it for reading, read a character from it, close it, delete it, and return
# the character read.
#
# To run:
#   $ bootstrap/bootstrap translate ex7.subx -o ex7
#   $ bootstrap/bootstrap run ex7
# Expected result:
#   $ echo $?
#   97

== code
#   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:
    # creat(Filename)
    bb/copy-to-ebx  Filename/imm32
    b9/copy-to-ecx  0x180/imm32/fixed-perms
    e8/call  syscall_creat/disp32

    # stream = open(Filename, O_WRONLY, 0)  # we can't use 'fd' because it looks like a hex byte
    bb/copy-to-ebx  Filename/imm32
    b9/copy-to-ecx  1/imm32/wronly
    ba/copy-to-edx  0x180/imm32/fixed-perms
    e8/call  syscall_open/disp32
    # save stream
    bb/copy-to-ebx  Stream/imm32
    89/copy                         0/mod/indirect  3/rm32/ebx    .           .             .           0/r32/eax   .               .                 # copy eax to *ebx

    # write(Stream, "a", 1)
    # . load stream
    bb/copy-to-ebx  Stream/imm32
    8b/copy                         0/mod/indirect  3/rm32/ebx    .           .             .           3/r32/ebx   .               .                 # copy *ebx to ebx
    # .
    b9/copy-to-ecx  A/imm32
    ba/copy-to-edx  1/imm32/size
    e8/call  syscall_write/disp32

    # close(Stream)
    # . load stream
    bb/copy-to-ebx  Stream/imm32
    8b/copy                         0/mod/indirect  3/rm32/ebx    .           .             .           3/r32/ebx   .               .                 # copy *ebx to ebx
    # .
    e8/call  syscall_close/disp32

    # stream = open(Filename, O_RDONLY, 0)
    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
    # . save Stream
    bb/copy-to-ebx  Stream/imm32
    89/copy                         0/mod/indirect  3/rm32/ebx    .           .             .           0/r32/eax   .               .                 # copy eax to *ebx

    # read(Stream, B, 1)
    # . load stream
    bb/copy-to-ebx  Stream/imm32
    8b/copy                         0/mod/indirect  3/rm32/ebx    .           .             .           3/r32/ebx   .               .                 # copy *ebx to ebx
    # .
    b9/copy-to-ecx  B/imm32
    ba/copy-to-edx  1/imm32/size
    e8/call  syscall_read/disp32

    # close(Stream)
    # . load stream
    bb/copy-to-ebx  Stream/imm32
    8b/copy                         0/mod/indirect  3/rm32/ebx    .           .             .           3/r32/ebx   .               .                 # copy *ebx to ebx
    #
    e8/call  syscall_close/disp32

    # unlink(filename)
    bb/copy-to-ebx  Filename/imm32
    e8/call  syscall_unlink/disp32

    # exit(b)
    # . load b
    bb/copy-to-ebx  B/imm32
    8b/copy                         0/mod/indirect  3/rm32/ebx    .           .             .           3/r32/ebx   .               .                 # copy *ebx to ebx
    #
    e8/call  syscall_exit/disp32

== data

Stream:
    0/imm32
A:
    61/imm32/A
B:
    0/imm32
Filename:
    2e 66 6f 6f 00 00 00 00
#   .  f  o  o  null

# . . vim:nowrap:textwidth=0
n> tab_width = 0 def draw(self): if self.need_redraw or \ self.env.cf != self.old_cf or\ str(self.env.keybuffer) != str(self.old_keybuffer) or\ self.wid != self.old_wid: self.need_redraw = False self.old_wid = self.wid self.old_cf = self.env.cf self._calc_bar() self._print_result(self.result) if self.wid > 2: self.color('in_titlebar', 'throbber') self.win.addnstr(self.y, self.wid - 2 - self.tab_width, self.throbber, 1) def click(self, event): """Handle a MouseEvent""" direction = event.mouse_wheel_direction() if direction: self.fm.tab_move(direction) self.need_redraw = True return True if not event.pressed(1) or not self.result: return False pos = self.wid - 3 for tabname in reversed(self.fm._get_tab_list()): pos -= len(str(tabname)) + 1 if event.x > pos: self.fm.tab_open(tabname) self.need_redraw = True return True pos = 0 for i, part in enumerate(self.result): pos += len(part.string) if event.x < pos: if i < 2: self.fm.enter_dir("~") elif i == 2: self.fm.enter_dir("/") else: try: self.fm.env.enter_dir(self.env.pathway[(i-3)/2]) except: pass return True return False def _calc_bar(self): bar = Bar('in_titlebar') self._get_left_part(bar) self._get_right_part(bar) try: bar.shrink_by_cutting(self.wid) except ValueError: bar.shrink_by_removing(self.wid) self.result = bar.combine() def _get_left_part(self, bar): if self.env.username == 'root': clr = 'bad' else: clr = 'good' bar.add(self.env.username, 'hostname', clr, fixedsize=True) bar.add('@', 'hostname', clr, fixedsize=True) bar.add(self.env.hostname, 'hostname', clr, fixedsize=True) for path in self.env.pathway: if path.islink: clr = 'link' else: clr = 'directory' bar.add(path.basename, clr) bar.add('/', clr, fixedsize=True) if self.env.cf is not None: bar.add(self.env.cf.basename, 'file', fixedsize=True) def _get_right_part(self, bar): kb = str(self.env.keybuffer) self.old_keybuffer = kb bar.addright(kb, 'keybuffer', fixedsize=True) bar.addright(' ', 'space', fixedsize=True) self.tab_width = 0 if len(self.fm.tabs) > 1: for tabname in self.fm._get_tab_list(): self.tab_width += len(str(tabname)) + 1 clr = 'good' if tabname == self.fm.current_tab else 'bad' bar.addright(' '+str(tabname), 'tab', clr, fixedsize=True) def _print_result(self, result): import _curses self.win.move(0, 0) for part in result: self.color(*part.lst) self.addstr(part.string) self.color_reset()