| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
We want slice-equal? for length-prefixed strings, not null-terminated "kernel"
strings.
|
| |
|
|
|
|
|
| |
In the process of building slice primitives I found an out-of-bounds access
in write-byte.
|
|
|
|
|
|
| |
In the process of building next-token I finally added some support for a
debugging situation I've found myself in a couple of times: wondering "what
changed this memory location"?
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
Fix CI.
a) Update canonical binaries.
b) Fix an out-of-bounds access in `clear-stream`. This also required supporting
a new instruction in `subx run` to load an imm8 into rm8.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The lines within '{}' can now be turned into a macro like `E_X = deref(E_X)`,
parameterizing the register being modified.
Assumes the input is in a register but also saved elsewhere, so it's safe
to clobber and replace with the result.
Compare commit 4894. Used to take 9 instructions, 8 of them making loads/stores.
Now it's 6 instructions, 4 of them loads/stores (the one non-local load
is unchanged, of course). Key is to not consume more registers so we don't
have to push/pop them.
|
| |
|
|
|
|
| |
I've agonized over this for a week; high time I saved a snapshot.
|
|
|
|
|
|
|
|
|
|
|
| |
Finally really fix the CI failure of commit 4894.
This is a remainder to forget my knowledge of stack addresses in the SubX
VM when writing SubX programs. Otherwise my programs will work in the VM
but not natively. The only assumptions a SubX program should make about
its segment addresses are what's encoded in the ELF binary. Thanks to
https://en.wikipedia.org/wiki/Address_space_layout_randomization, it can't
know anything else.
|
|
|
|
| |
Fix CI.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Done with kinda-safe pointers.
In a real compiler the fast path of 'lookup' would ideally get inlined.
Excluding procedure-call overhead, the current implementation consumes 2
registers besides the input, and requires 9 instructions (2 push, 2 load,
compare, jump, increment, 2 pop). That's large enough that inlining may
become a trade-off. Even if we somehow magically had the registers already
loaded and available, we'd still need 4 instructions (1 pointer dereference,
compare, jump and increment). The price of safety.
|
| |
|
| |
|
|
|
|
| |
We only can't use rm32=5 when mod=0. Totally fine when it's mod=1.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
More mnemonic register usage in write-stream.
|
|
|
|
| |
Our first buffer overflow!
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
I'm imagining 3 core stages total:
1. convert text hex bytes -> binary (✓)
2. pack and reorder operands
3. compute label addresses
(Not including extras like error-checking.)
|
| |
|
|
|
|
| |
Fix CI.
|
| |
|
| |
|
|
|
|
|
|
|
| |
Bugfix in scenarios where scan-next-byte needs to abort.
I'm starting to have trouble keeping strings, streams and buffered-files
straight.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Clean up a few things:
a) Call scan-next-byte in hex.subx with the right number of args. Turns
out tests continue to work fine if they never use the other args.
b) Tear down a test for 'stop' in the right order. Not important since we
have no EBP to restore. But can still be misleading.
c) Have 'check-ints-equal' return nothing. Handy for it to not mess up
EAX. I never use the result anyway, and the name also is imperative suggesting
callers won't expect a return value.
|
| |
|
| |
|
|
|
|
| |
Making progress on hex1 (http://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html)
|
|
|
|
| |
New helper: print an error message, then a numeric byte, then abort.
|
|
|
|
| |
New helper: printing a string to a buffered file.
|
|
|
|
| |
Better to use EDI as a mnemonic for 'destination'.
|
|
|
|
| |
Let's standardize to use opcode 39 rather than 3b by default.
|
|
|
|
| |
Fix CI since 4827.
|
| |
|
|
|
|
|
|
| |
Let's start adding ':end' labels in all functions, just because it helps
us visualize where function calls end in traces, thanks to the '--map'
commandline argument.
|
|
|
|
|
| |
This is likely a sub-optimal interface, but I'm trying not to agonize.
The whole point of Mu is to permit radical changes at any point in time.
|
|
|
|
|
|
|
|
|
| |
I was 'returning' a phantom value from 'write' when the underlying '_write'
returns nothing.
In general, returning counts of bytes written is not so useful for error
checking when my primitives abstract away from that. We'll come back to
error signalling later.
|
| |
|
|
|
|
|
|
|
| |
Fix CI.
It's kind of a hassle (and wasteful) that I need to redefine 'main' in
every single layer.
|
| |
|