(12.02.2017, 17:30)gaor schrieb: Ich könnte jetzt das Datensegment über die datseg.cpp füllen. Der Code ist hier: http://pastebin.com/sSgNjd13 Es fehlen nur noch etwa 270 Zeilen - das wäre schnell durchgecheckt. Aber der BCC beschwert sich:
Code:Error datseg.cpp 1595: Group overflowed maximum size: DGROUP
Jemand eine Ahnung, was man dagegen macht?
Der Fehler kommt wenn dein Segment > 64k ist
laut https://github.com/Henne/Bright-Eyes/blo...e/datseg.h
ist das Datensegment (0xf7af - 0x936 - 2) = 0xEE77 = 61047 Bytes - also noch unter 64k
ich würde aber (wenn nicht 100% klar ist wo was liegt) vorsichtig vorgehen:
1. einen Struct mit den ds-Variablen definieren - und mit static_assert/offsetof dauerhaft Offset und komplette Größe prüfen
2. gehörig auf das Alignment achten (könnte sich bei BCC zu gcc usw. unterscheiden - was tödlich wäre)
siehe #pragma pack(1) (https://msdn.microsoft.com/de-de/library/2e70t5y1.aspx)
Code:
#pragma pack(push,1)
struct ds_structur
{
char dummy1[4];
char g_str_borland_cpp[43]; // ds:0x0004
char g_str_divide_error[45]; // ds:0x002f
//...
char dummy_filler[61047-94];
};
#pragma pack(pop)
//wenn gcc oder VS2010
static_assert(sizeof(ds_structur) == 61047, "wrong ds size");
//...
static_assert(offsetof(ds_structur, g_str_borland_cpp) == 0x0004);
static_assert(offsetof(ds_structur, g_str_divide_error) == 0x002f);
//...
3. die ds-Variable auf den Struct-casten - und damit arbeiten - dann bleiben die Initalwerte erstmal wo sie sind
...
4. eine weitere instanz von ds_structur erzeugen - die members einzeln fuellen und pruefen ob das
dem Inhalt von ds entspricht - dauerhaft
Code:
ds_structur fuell_test;
assert(sizeof(ds) == sizeof(fuell_test));
::memset(fuell_test.dummy1, 0, sizeof(fuell_test.dummy1));
const char fix1[] = "Borland C++ - Copyright 1991 Borland Intl.";
::memcpy(fuell_test.g_str_borland_cpp, fix1, sizeof(fix1)-1);
const char fix2[] = "Divide error\r\nAbnormal program termination\r\n";
fuell_test.g_str_divide_error, fix2, sizeof(fix2)-1);
//...
assert(::memcmp(fuell_test, ds, sizeof(fuell_test)) == 0);
und wenn alles passt kannst du die char ds[...] durch ds_structur ds; ersetzen
am einfachsten ist es wohl wenn du eine Liste der Variablen, Typen und Offsets hast dann kannst du dir
den ganzen Code mit Python oder sonstwas einfach generieren