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

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

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

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

Сообщение Cheb » 29.07.2015 17:49:09

Сабж. Есть указатель на запись. Надо из блока 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;
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

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

Сообщение Лекс Айрин » 29.07.2015 17:57:43

Cheb, на полноценном асме точно есть. Это адресация относительно начала записи. Но, естественно, надо знать это смещение. Не элегантный способ имхо проще.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Sergei I. Gorelkin » 29.07.2015 20:31:10

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

Но можно и вот так:
Код: Выделить всё
function get_ss: word; assembler; nostackframe;
asm
   mov ax, ss
end;

...
pes^.stacksegment := get_ss;
...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1398
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение Cheb » 30.07.2015 18:48:24

Спасибо! :)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru