mirror of https://github.com/nmlgc/ReC98.git
[Research] Discover a workaround to word-align code segments from Turbo C++
Turns out that this is one of the effects of the -WX option ("Create DPMI application")… along with generally messing up code generation. Nothing we can't work around though, luckily! Finally getting to cross that off the list of reasons that prevent decompilation. Part of P0137, funded by [Anonymous].
This commit is contained in:
parent
1244bd74e7
commit
0f75a77dee
|
@ -244,7 +244,11 @@ C++, Open Watcom, and Visual C++, which will ease future third-party ports.
|
||||||
|
|
||||||
* Use `#pragma option -zC` and `#pragma option -zP` to rename code segments
|
* Use `#pragma option -zC` and `#pragma option -zP` to rename code segments
|
||||||
and their groups, not `#pragma codeseg`. Might look uglier, but has the
|
and their groups, not `#pragma codeseg`. Might look uglier, but has the
|
||||||
advantage of not generating an empty segment with the default name.
|
advantage of not generating an empty segment with the default name and the
|
||||||
|
default padding. This is particularly relevant [if the `-WX` option is used
|
||||||
|
to enforce word-aligned code segments][3]: That empty default segment would
|
||||||
|
otherwise also (unnecessarily) enforce word alignment for the segment that
|
||||||
|
ends up following the empty default one.
|
||||||
|
|
||||||
* These options can only be used "at the beginning" of a translation unit –
|
* These options can only be used "at the beginning" of a translation unit –
|
||||||
before the first non-preprocessor and non-comment C language token. Any
|
before the first non-preprocessor and non-comment C language token. Any
|
||||||
|
@ -323,3 +327,4 @@ Currently, we know about the following [references]:
|
||||||
[mzdiff]: https://github.com/nmlgc/mzdiff
|
[mzdiff]: https://github.com/nmlgc/mzdiff
|
||||||
[1]: Research/Borland%20C++%20decompilation.md#c
|
[1]: Research/Borland%20C++%20decompilation.md#c
|
||||||
[2]: https://github.com/nmlgc/ReC98/invitations
|
[2]: https://github.com/nmlgc/ReC98/invitations
|
||||||
|
[3]: Research/Borland%20C++%20decompilation.md#padding-bytes-in-code-segments
|
||||||
|
|
|
@ -368,18 +368,26 @@ static_storage db 2, 0, 6
|
||||||
@_STCON_$qv endp
|
@_STCON_$qv endp
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Padding bytes in code segments
|
## Padding bytes in code segments
|
||||||
|
|
||||||
- `0x00` is only emitted to word-align `switch` jump tables with `-a2`.
|
* Usually, padding `0x00` bytes are only emitted to word-align `switch` jump
|
||||||
Anywhere else, it indicates the start or end of a word-aligned `SEGMENT`
|
tables with `-a2`. Anywhere else, it typically indicates the start or end of
|
||||||
compiled from assembly. Borland C++ never adds padding between functions or
|
a word-aligned `SEGMENT` compiled from assembly. There are two potential
|
||||||
segments.
|
workarounds though:
|
||||||
|
|
||||||
**Certainty**: Would love to find a proper compiler or linker setting for
|
* The `-WX` option (Create DPMI application) *will* enforce word alignment
|
||||||
this, but it doesn't seem to exist. The `#pragma codestring \x00` workaround
|
for the code segment, at the cost of slightly different code generation in
|
||||||
doesn't respect different alignment requirements of surrounding translation
|
certain places. Since it also adds an additional `INC BP` instruction
|
||||||
units, after all.
|
before `PUSH BP`, and an additional `DEC BP` instruction after `POP BP`,
|
||||||
|
this option can only really be used in translation units with disabled
|
||||||
|
stack frames (`-k-`).
|
||||||
|
|
||||||
|
* `#pragma codestring \x00` unconditionally emits a `0x00` byte. However,
|
||||||
|
this won't respect different alignment requirements of surrounding
|
||||||
|
translation units.
|
||||||
|
|
||||||
|
**Certainty**: Reverse-engineering `TCC.EXE` confirmed that these are the
|
||||||
|
only ways.
|
||||||
|
|
||||||
## C++
|
## C++
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
extern _hflip_lut:byte:256
|
extern _hflip_lut:byte:256
|
||||||
|
|
||||||
; The original function layouts unfortunately require this one to be placed at
|
; Would have been decompilable into a mess.
|
||||||
; a word-aligned address, which can't be achieved from Turbo C++ alone :( Oh
|
|
||||||
; well, its decompilation would have been a mess anyway.
|
|
||||||
SHARED segment word public 'CODE' use16
|
SHARED segment word public 'CODE' use16
|
||||||
assume cs:SHARED
|
assume cs:SHARED
|
||||||
include th03/formats/hfliplut.asm
|
include th03/formats/hfliplut.asm
|
||||||
|
|
Loading…
Reference in New Issue