x64, QWord и глюк (2.2.0)

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

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

x64, QWord и глюк (2.2.0)

Сообщение Vic3Dexe » 20.11.2007 03:39:38

Делаем так:
Код: Выделить всё
const
  a = 512*1024*1024*1024;

...
 
procedure foo;
var
  b:QWord;
begin
  if b>a then DoSmth;
end;

Что получается на выходе:
Код: Выделить всё
      mov   rdx,qword [rsp+64] ;<= это b
      mov   rax,0              ;<====== ?????????
      cmp   rdx,rax
      jng   .6

Меняем объявление константы на:
Код: Выделить всё
const
  a:QWord = 512*1024*1024*1024;

Что получаем:
Код: Выделить всё
      mov   rax,qword [rsp+64]  ;<= это снова b
      cmp   rax,qword [TC_TEST_A]
      jna   .6

TC_TEST_A   DQ   549755813888 ;<=== вот это супер...

Т.е., имея 64-битный компилятор, мы не можем работать с 64-битными константами без включения их в экзешник как переменных?

Также видно, что меняется условный джамп со знакового на беззнаковый, хотя, по идее, он и в первом случае должен быть беззнаковый (b беззнаковая), хотя это спорно, конечно...

Или я чего-то не понял, или одно из двух...

Компилер версии 2.2.0, экзешник называется ppcrossx64.exe (скачал бинарник).

зы На синтаксис асма не обращайте внимания, чуток правленый до формата fasm.
Vic3Dexe
незнакомец
 
Сообщения: 4
Зарегистрирован: 20.11.2007 03:24:39
Откуда: Киев

Сообщение halyavin » 20.11.2007 17:26:46

A
Код: Выделить всё
const
  a=int64(512)*1024*1024*1024;
пробовал?
halyavin
новенький
 
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение Vic3Dexe » 20.11.2007 20:13:32

Попробовал. Аналогично варианту 1, т.е. ноль.
Vic3Dexe
незнакомец
 
Сообщения: 4
Зарегистрирован: 20.11.2007 03:24:39
Откуда: Киев

Сообщение Рождённый_в_СССР » 21.11.2007 04:55:04

Код: Выделить всё
mov   rdx,qword [rsp+64] ;<= это b
      mov   rax,0              ;<====== ?????????
      cmp   rdx,rax
      jng   .6


есть подозрение, что rdx всё таки не b... я не знаю куда он там прыгает потом, но мне кажется что rdx - a, а b там обнуляется (в инициализации), так как ты ставишь объявление b и следом сравниваешь это b с непонятно каким значением внутри процедуры - попробуй сделать её либо глобальной, либо чего то туда поместить. А то туда ноль по умолчанию забивается...

или я туплю как обычно ) потому что место нахождения намекает, что это b
Аватара пользователя
Рождённый_в_СССР
новенький
 
Сообщения: 65
Зарегистрирован: 08.08.2007 01:03:26
Откуда: Саратов

Сообщение Vic3Dexe » 21.11.2007 08:48:27

Рождённый_в_СССР писал(а):есть подозрение, что rdx всё таки не b...

Да нет, это как раз b. См. второй и четвертый код - в обоих случаях участвует [rsp+64] - это локальная переменная из стека.
Vic3Dexe
незнакомец
 
Сообщения: 4
Зарегистрирован: 20.11.2007 03:24:39
Откуда: Киев


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

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

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

Рейтинг@Mail.ru