827dd4a7fe
One less error that's only in the bootstrap phase. On the other hand, for simplicity I got rid of the ability to override the Entry label. One less special case, but we're also going further from the ability to run subsets of layers. We haven't really been exercising it for a long time, though (commit 7842, March 2021 when we made baremetal the default).
54 lines
2.6 KiB
Plaintext
54 lines
2.6 KiB
Plaintext
# _write: write to a file descriptor (fd)
|
|
|
|
== 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: # just exit; can't test _write just yet
|
|
#? bb/copy-to-ebx 0/imm32
|
|
#? e8/call syscall_exit/disp32
|
|
|
|
_write: # fd: int, s: (addr array byte)
|
|
# . prologue
|
|
55/push-ebp
|
|
89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp
|
|
# . save registers
|
|
50/push-eax
|
|
51/push-ecx
|
|
52/push-edx
|
|
53/push-ebx
|
|
# syscall_write(fd, (data) s+4, (size) *s)
|
|
# . ebx = fd
|
|
8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 3/r32/ebx 8/disp8 . # copy *(ebp+8) to ebx
|
|
# . var data/ecx: (addr byte) = s+4
|
|
8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 0xc/disp8 . # copy *(ebp+12) to ecx
|
|
81 0/subop/add 3/mod/direct 1/rm32/ecx . . . . . 4/imm32 # add to ecx
|
|
# . var size/edx: int = *s
|
|
8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 2/r32/edx 0xc/disp8 . # copy *(ebp+12) to edx
|
|
8b/copy 0/mod/indirect 2/rm32/edx . . . 2/r32/edx . . # copy *edx to edx
|
|
# . syscall
|
|
e8/call syscall_write/disp32
|
|
# if (eax < 0) abort
|
|
3d/compare-eax-with 0/imm32
|
|
0f 8c/jump-if-< $_write:abort/disp32
|
|
$_write:end:
|
|
# . restore registers
|
|
5b/pop-to-ebx
|
|
5a/pop-to-edx
|
|
59/pop-to-ecx
|
|
58/pop-to-eax
|
|
# . epilogue
|
|
89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp
|
|
5d/pop-to-ebp
|
|
c3/return
|
|
|
|
$_write:abort:
|
|
# can't write a message here for risk of an infinite loop, so we'll use a special exit code instead
|
|
# . syscall_exit(255)
|
|
bb/copy-to-ebx 0xff/imm32
|
|
e8/call syscall_exit/disp32
|
|
# never gets here
|
|
|
|
# . . vim:nowrap:textwidth=0
|