Runtime error 216 (asm функция)

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

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

Runtime error 216 (asm функция)

Сообщение chinarulezzz » 19.04.2016 17:18:16

Всем привет. Есть такой код:

Код: Выделить всё
 
function isVME: boolean;
  var
    vm: LongWord;
  begin
    asm
    .L1:
      rdtsc
      movl %eax, %ebx
      rdtsc
      subl %ebx, %eax
      pushl %eax
      cmpl $1, %eax
      jz .L1
      movl %eax, vm
    end;

    if vm < 512 then isVME := false else isVME := true
  end;

var
  vm: boolean;

begin
  vm := isVME;
  writeln(vm); { все ок }
  writeln( isVME ); { а здесь Runtime error 216 }
end.

Баг в компиляторе?

P.S. Заодно не подскажете как обойтись в функции без временной переменной longword? Пусть функция возвращает значение eax. Замучался уже) По примеру документации не работает.
chinarulezzz
незнакомец
 
Сообщения: 2
Зарегистрирован: 19.04.2016 17:11:19

Re: Runtime error 216 (asm функция)

Сообщение Sergei I. Gorelkin » 19.04.2016 22:16:33

1) Можно изменять только регистры eax,edx,ecx. Остальные регистры нужно сохранять и восстанавливать самостоятельно.
2) Инструкция "push eax" без соответствующей инструкции pop - из той же оперы.
3) Чтобы возвращать результат в eax, нужно определить функцию как "assembler; nostackframe" и написать ее целиком на ассемблере:

Код: Выделить всё
function tsc: int64; assembler; nostackframe;
asm
  rdtsc
end;

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

Re: Runtime error 216 (asm функция)

Сообщение chinarulezzz » 20.04.2016 00:02:01

Спасибо. Вы мне очень помогли.
chinarulezzz
незнакомец
 
Сообщения: 2
Зарегистрирован: 19.04.2016 17:11:19


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

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

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

Рейтинг@Mail.ru