Есть ли способ обращения к полям указателя на запись из ASM?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Есть ли способ обращения к полям указателя на запись из ASM?

Сообщение Cheb »

Сабж. Есть указатель на запись. Надо из блока ASM влезть в одно из его полей.
Применяю хак: объявляю дополнительную переменную, в которую записываю адрес.
Неэлегантно. Бесит. :evil:

Код: Выделить всё

  procedure _AllocateThreadExceptionState(thread_title: PUnicodeChar); cdecl;
  var
    pes: PMotherSehState;
    ssaddr: ptruint;
  begin
   //no try block. If *this* simplest thing crashes it means things are already FUBAR.
    pes:= GetExceptionState();
    FillChar(pes^, sizeof(pes^), 0);
    pes^.ThreadId:= GetCurrentThreadId();
    pes^.IsModuleThread:= true;
    if Assigned(thread_title) then pes^.ThreadTitle:= PUnicodeCharToUnicodeString(thread_title);

    ssaddr:= ptruint(@pes^.StackSegment);
    {$ifdef cpu64}
      asm
        push ax
        push rsi
        mov rsi, qword[ssaddr]
        mov ax, ss
        mov word[rsi], ax
        pop rsi
        pop ax
      end;
    {$else}
      asm
        push ax
        push esi
        mov esi, dword[ssaddr]
        mov ax, ss
        mov word[esi], ax
        pop esi
        pop ax
      end;
    {$endif}
  end;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Cheb, на полноценном асме точно есть. Это адресация относительно начала записи. Но, естественно, надо знать это смещение. Не элегантный способ имхо проще.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Компилятор вполне понимает "ТипЗаписи.ИмяПоля" в качестве смещения операндов ассемблера.

Но можно и вот так:

Код: Выделить всё

function get_ss: word; assembler; nostackframe;
asm
   mov ax, ss
end;

...
pes^.stacksegment := get_ss;
...
Ответить