Commit Graph

11 Commits

Author SHA1 Message Date
Kartik Agaram
544fbdc6e2 4686 2018-10-12 23:15:34 -07:00
Kartik Agaram
88b478087e 4685 2018-10-12 23:13:15 -07:00
Kartik Agaram
ca00f6b97c 4634 2018-10-01 11:09:07 -07:00
Kartik Agaram
7d4e351a0d 4503
Include LEA (load effective address) in the SubX subset of x86 ISA.
2018-09-22 23:19:39 -07:00
Kartik Agaram
d47f3a8278 4584 - discrepancy between SubX and native x86
One of the more painful things I had to debug with machine code. Tricks
I used can be seen in ex10.subx:
- printing argv[1] in various places
- printing a single 'X' in various places to count how many times we get
  to different instructions
- exiting with the current value of EAX in various places

I repeatedly went down the wrong trail in several ways:
- forgetting that the problem lay in native runs, and accidentally switching
  to subx runs during debugging.
- forgetting to pass commandline args, because ex10 doesn't check its argv
- writing the wrong comment for an instruction, and then miscalculating
  the set of registers that need to be saved.
- forgetting that syscalls clobber EAX.

Debugging native runs is hard, because you have to write non-trivial code
to instrument the binary, and instrumentation can itself be buggy.

When we finally tracked it down, I recognized the problem immediately.
I'd meant to confirm the behavior of opcode 8a against bare metal, and
then forgot.
In any case, opcode 8a was inconsistent with 88. Sloppy.
2018-09-21 22:25:00 -07:00
Kartik Agaram
45967d2106 4578 - subx: implement inc/dec operations 2018-09-21 16:03:31 -07:00
Kartik Agaram
0a7b03727a 4547 2018-09-16 22:02:31 -07:00
Kartik Agaram
1a62e61df4 4538 2018-09-07 22:20:29 -07:00
Kartik Agaram
e07a3f2886 4537
Streamline the factorial function; we don't need to save a stack variable
into a register before operating on it. All instructions can take a stack
variable directly.

In the process we found two bugs:

a) Opcode f7 was not implemented correctly. It was internally consistent
but I'd never validated it against a natively running program. Turns out
it encodes multiple instructions, not just 'not'.

b) The way we look up imm32 operands was sometimes reading them before
disp8/disp32 operands.
2018-09-07 22:19:13 -07:00
Kartik Agaram
f1b3d7b967 4527 - reading commandline arguments
The new example ex9 doesn't yet work natively.

In the process I've emulated the kernel's role in providing args, implemented
a couple of instructions acting on 8-bit operands (useful for ASCII string
operations), and begun the start of the standard library (ascii_length
is the same as strlen).

At the level of SubX we're just only going to support ASCII.
2018-08-30 01:15:45 -07:00
Kartik Agaram
a066ad7ed7 4469 2018-08-03 23:42:37 -07:00