x64, QWord и глюк (2.2.0)

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

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

Ответить
Vic3Dexe
незнакомец
Сообщения: 4
Зарегистрирован: 20.11.2007 02:24:39
Откуда: Киев

x64, QWord и глюк (2.2.0)

Сообщение Vic3Dexe »

Делаем так:

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

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.
halyavin
новенький
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение halyavin »

A

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

const 
  a=int64(512)*1024*1024*1024;
пробовал?
Vic3Dexe
незнакомец
Сообщения: 4
Зарегистрирован: 20.11.2007 02:24:39
Откуда: Киев

Сообщение Vic3Dexe »

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

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

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

 mov   rdx,qword [rsp+64] ;<= это b 
      mov   rax,0              ;<====== ?????????
      cmp   rdx,rax
      jng   .6


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

или я туплю как обычно ) потому что место нахождения намекает, что это b
Vic3Dexe
незнакомец
Сообщения: 4
Зарегистрирован: 20.11.2007 02:24:39
Откуда: Киев

Сообщение Vic3Dexe »

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

Да нет, это как раз b. См. второй и четвертый код - в обоих случаях участвует [rsp+64] - это локальная переменная из стека.
Ответить