В программе WIN32 я хочу использовать регистры сегментов FS и GS для доступа к динамически распределенным блокам памяти c. Примерно так:
invoke SomeAllocateMemory, size, etc, etc ;result is in EAX
test eax, eax ;memory allocated?
jz badHeap ;no: jump, else: EAX -> allocated block
;
shr eax, 4 ;convert linear block address to paragraph (segment) base address
mov FS, eax ;point FS to *segment address* of allocated block
;
ASSUME FS:NOTHING ;required to avoid MASM32 error
;
mov FS:[10*4], eax ;store EAX in the 10th 32-bits slot at allocated memory block, or
mov FS:anOffset, eax ;- in the "anOffset" variable location
Да, я знаю, что стандартный способ сделать это - использовать базовый регистр, такой как EBX, для указания на выделенный блок памяти и затем получить доступ к такому блок с помощью адресации [EBX]. Однако я хочу использовать сложный режим адресации (например, двумерный массив) в переменной, помещенной в блок памяти. Примерно так:
mov EBX, rowIndex
mov ESI, colIndex
mov FS:baseOfArray[EBX*rowSize][ESI], al
Это будет работать?
Да, я знаю, что ОС иногда использует регистр FS. Я думаю, что это можно обойти следующим образом:
push FS ;get initial FS at beginning
pop initialFS ;and store it
;
;my stuff here that uses FS
;
push initialFS ;recover
pop FS ;- original FS
invoke AnyWIN32ApiFunction
;
;recover my FS
Или это не нужно?