Могу ли я использовать регистры сегментов FS и GS для собственного использования? - PullRequest
0 голосов
/ 19 апреля 2020

В программе 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

Или это не нужно?

...