mirror of https://github.com/nmlgc/ReC98.git
18 lines
774 B
Markdown
18 lines
774 B
Markdown
|
## Limits of decompilability
|
|||
|
|
|||
|
### `MOV BX, SP`-style functions, no stack frame
|
|||
|
|
|||
|
These almost certainly weren't compiled from C. By disabling stack frames
|
|||
|
using `#pragma option -k-`, it *might* be possible to still get the exact same
|
|||
|
code out of Turbo C++ – even though it will most certainly look horrible, and
|
|||
|
barely more readable than assembly (or even less so), with tons of inline ASM
|
|||
|
and register pseudovariables. However, it's futile to even try if the function
|
|||
|
contains one of the following:
|
|||
|
|
|||
|
* A reference to the `DI` register. In that case, Turbo C++ always inserts a
|
|||
|
`PUSH DI` at the beginning (before the `MOV BX, SP`), and a `POP DI` before
|
|||
|
returning.
|
|||
|
|
|||
|
**Certainty:** Confirmed through reverse-engineering `TCC.EXE`, no way
|
|||
|
around it.
|