Also, ein Programm, das für flat segmente compiliert wurde, kann nicht mit non-flat segmenten arbeiten, das geht nicht.
Es nimmt ja an, das cs-base = ds-base = es-base = ss-base = 0 und
das cs-limit = ds-limit = es-limit = ss-limit = FFFF FFFF gilt.
Wahrscheinlich würde es noch laufen, wenn die base nicht 0 ist, aber alle segment-bases gleich. aber wenn die segment-bases unterschiedlich sind, wird es nicht mehr funktionieren, da eine Struktur die aufm stack liegt, nen 48-bit pointer benötigt
Beispiel:
C-Code
void foo(int* p)
{
*p = 4;
}
int bar()
{
int x;
foo(&x);
return x;
}
asm-code
foo:
mov eax, [esp+4] ; implizit ss
mov dword ptr [eax], 4 ; implizit ds
ret
bar:
sub esp, 4
push esp
call foo
mov eax, [esp + 4] ; implizit ss
add esp, 4
ret
(so ungefähr)
Der Knackpunkt ist, das für esp nen anderer default-selektor nimmt, als eax. Es müssten die selektoren mit übergeben werden.
foo:
mov ecx, [esp+8]
mov eax, [esp+4]
mov gs, cx
mov dword ptr gs:[eax], 4
ret
bar:
sub esp, 4
mov edx, esp
push ss
push edx
call foo
mov eax, [esp + 4]
add esp, 8
ret
edit:
außerdem bräuchte man wahrscheinlich noch ldt's, falls man auch sehr viele prozesse unterstützen möchte und das ist ein erheblicher mehraufwand.
und amd64 unterstützt auch nur noch flat-segmentierung (außer bei fs und gs, wegen thread-local von win)
MfG
DDR-RAM