Очередной Asm Арррргх

Общие вопросы программирования, алгоритмы и т.п.

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

Очередной Asm Арррргх

Сообщение Cheb » 28.03.2017 20:43:23

Кто-нибудь объясните мне, слабоумному, почему в win32 это работает, а в win64 - работало, а потом ВДРУГ стало давать AV ?

Код: Выделить всё
...
    Mother^.ExceptionState.ThreadId:= GetCurrentThreadId();
    Mother^.ExceptionState.ThreadTitle:= 'main thread';
    {$ifdef windows}
     //Mother^.ExceptionState.StackSegment:= <current ss>;
     // This is only needed for the Windows-only SEH hack.
     {$ifdef cpu64}
      asm
        mov rsi, qword[Mother]
        mov ax, ss
        mov word[rsi + TMother.ExceptionState.StackSegment], ax
      end ['rsi', 'rax'];
     {$else}
      asm
        mov esi, dword[Mother]
        mov ax, ss
        mov word[esi + TMother.ExceptionState.StackSegment], ax
      end ['esi', 'eax'];
     {$endif}
   {$endif}


Изображение

Добавлено спустя 3 минуты 30 секунд:
З.Ы. Если закомментировать - движок взлетает, НО не работает ловля исключений т.к. там параноидальная проверка вменяемости на родной сегмент стека.

Добавлено спустя 1 минуту 21 секунду:
З.З.Ы. Оптимизацию сбрасывал до -O1, компилятор пробовал 3.0.0 вместо 2.6.4 - что совой об пень, что пнём об сову :evil:

Добавлено спустя 3 минуты 19 секунд:
З.З.З.Ы. ppcrossx64 воняет, что chentrah.lpr(111,3) Note: Object file "cge.o" contains 32-bit absolute relocation to symbol ".bss.n_u_cge_mother". - какого... :evil:

Добавлено спустя 7 минут 10 секунд:
З.З.З.З.Ы Обошёл хаком:
Код: Выделить всё
var myss: word;
...
     {$ifdef cpu64}
      asm
        mov ax, ss
        mov word[myss], ax
      end ['rax'];
      Mother^.ExceptionState.StackSegment:= myss;
     {$else}   

но всё равно интересует: КАКОГО?!
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34

Re: Очередной Asm Арррргх

Сообщение Sergei I. Gorelkin » 28.03.2017 22:49:32

Потому что в системе команд x86_64 ровно две инструкции, допускающие непосредственные 64-битные операнды: mov eax,[mem64] и mov reg64,imm64. Все остальные остались 32-битными, поэтому, если писать в стиле i386, то результат будет работоспособен только при загрузке по адресам <4 Гб. На что прозрачно намекает линкер.
64-битный код принято писать с адресацией переменных относительно rip: mov rsi, [mother+rip]
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1367
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Очередной Asm Арррргх

Сообщение Cheb » 29.03.2017 00:25:16

На что прозрачно намекает линкер.

Я дятел :oops:
Опять полез в воду не зная броду.

Так, вроде, работает и ныть перестало:
Код: Выделить всё
     {$ifdef cpu64}
      asm
        mov rax, qword[Mother]
        lea rsi, [rax + TMother.ExceptionState.StackSegment]
        mov ax, ss
        mov word[rsi], ax
      end ['rax', 'rsi']; 
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 577
Зарегистрирован: 06.06.2005 15:54:34


Вернуться в Общее

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

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

Рейтинг@Mail.ru