Ассемблерная вставка

Вопросы программирования и использования среды Lazarus.

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

Ответить
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Ассемблерная вставка

Сообщение Сквозняк »

При компиляции на платформе Linux x86_64 лазарус ругался на push edi и pop edi. В ассемблере пока :mrgreen: плаваю, поэтому интересует вопрос, работоспособным получился патч или нет.

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

procedure FillSmallInt(p : PSmallInt; count : Integer; v : SmallInt); register;
// EAX contains p
// EDX contains count
// ECX contains v
var                //патч
zz : PSmallInt;    //патч
asm
 //  push edi       //было
   push zz          //патч
  // mov edi, p   //было
   mov zz, p       //патч
   mov ax, cx     // expand v to 32 bits
   shl eax, 16
   mov ax, cx
   mov ecx, edx   // the "odd" case is handled by issueing a lone stosw
   shr ecx, 1
   test dl, 1
   jz @even_nb
   stosw
   or ecx, ecx
   je @fill_done
@even_nb:
   rep stosd
@fill_done:
 //  pop edi       //было
   pop zz          //патч
end;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Этот код и до патча был неработоспособен, не столько из-за push edi (его достаточно заменить на push rdi), сколько из-за того, что в x86_64-linux аргументы будут находится в rdi, rsi, rdx, а в x86_64-win64 - в rcx,rdx,r8.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

А её можно без ассемблера переписать, пусть и с потерей скорости?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Если я ничего не упускаю из вида, вместо нее можно использовать процедуру FillWord, ничего не переписывая.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Учитывая, что и с глючащей ассемблерной вставкой бенчмарки GLScene как-то работали, то хуже быть не должно.
Ответить