Задать вопрос
@Dorothy

Как изменить код функции на ассемблере?

Здравствуйте. Имеется такая функция:
function sar32(value, shift: longint): longint;
asm
  mov ecx, edx
  sar eax, cl
  end;


подскажите пожалуйста, как изменить эту функцию, чтобы она работала с такими параметрами?
function sar32(value: Int64; shift: longint): longint;
  • Вопрос задан
  • 556 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@zedxxx
В этом случае, переменная value передаётся через стек и её нужно занести в регистры, а shift залетает в регистр eax. Поэтому код будет таким:
function sar64(value: Int64; shift: LongInt): LongInt;
asm
  mov ecx, eax
  mov eax, dword ptr [value]
  mov edx, dword ptr [value+4]
  shrd eax, edx, cl
end;

А вы ничего не напутали с типом возвращаемого значения? Если входной параметр Int64, то по-моему и на выходе нужно использовать этот же тип.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
как изменить эту функцию, чтобы она преобразовывала результат в Integer, а не LongInt

Если integer имеет ту же или меньшую ширину, что и longint (что, например, так для компилятора fpc), то ничего менять не надо.

function sar32(value: Int64; shift: longint): longint;

Для такого прототипа надо поменять примерно так (для borland register calling convention):

function sar32(value: Int64; shift: longint): longint;
asm
  shrd eax, edx, cl
  end;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы