mu/306files.subx

64 lines
1.7 KiB
Plaintext

== code
open: # filename: (addr array byte), write?: boolean, out: (addr handle buffered-file)
# hard-coded parameter: file-buffer-size of created buffered-file
# . prologue
55/push-ebp
89/<- %ebp 4/r32/esp
# . save registers
50/push-eax
51/push-ecx
52/push-edx
53/push-ebx
56/push-esi
57/push-edi
# ecx = filename
8b/-> *(ebp+8) 1/r32/ecx
# var size/edx: int = filename->length + 1 for the trailing null character
8b/-> *ecx 2/r32/edx
42/increment-edx
# var s/esi: (stream size)
29/subtract-from %esp 2/r32/edx
52/push-edx # size
68/push 0/imm32/read
68/push 0/imm32/write
89/<- %esi 4/r32/esp
# copy filename and a final null character
(clear-stream %esi)
(write %esi %ecx)
# spill edx
52/push-edx
# var fd/ecx: fd = open(filename)
8d/copy-address *(esi+0xc) 3/r32/ebx
8b/-> *(ebp+0xc) 1/r32/ecx/flags
ba/copy-to-edx 0x180/imm32/permissions
e8/call syscall_open/disp32
89/<- %ecx 0/r32/eax
# restore edx
5a/pop-to-edx
# allocate a buffered-file
(allocate Heap 0x1010 *(ebp+0x10)) # file-buffer-size + 16 for other fields
# var out-addr/edi: (addr buffered-file)
8b/-> *(ebp+0x10) 7/r32/edi
(lookup *edi *(edi+4)) # => eax
89/<- %edi 0/r32/eax
# out-addr->size = 4KB
c7 0/subop/copy *(edi+0xc) 0x1000/imm32/file-buffer-size # Stream-size + 4 for fd
# out-addr->fd = fd
89/<- *edi 1/r32/ecx
$open:end:
# . reclaim locals
01/add-to %esp 2/r32/edx
81 0/subop/add %esp 0xc/imm32
# . restore registers
5f/pop-to-edi
5e/pop-to-esi
5b/pop-to-ebx
5a/pop-to-edx
59/pop-to-ecx
58/pop-to-eax
# . epilogue
89/<- %esp 5/r32/ebp
5d/pop-to-ebp
c3/return