Сейчас на форуме: Slinger (+6 невидимых)

 eXeL@B —› Основной форум —› Ошибка Delphi или что это?
Посл.ответ Сообщение

Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 19 ноября 2006 03:13
· Личное сообщение · #1

Есть процедура:

-----
procedure TForm1.Button1Click(Sender: TObject);
var
Wor1, Wor2: cardinal;
Size1, Size2: cardinal;
begin
Wor1:= 0;
Wor2:= 65535;
Size1:= (Wor1 * Wor2);
Size2:= (Wor2 * Wor2);
if Size2 < Size1 then Exit;
end;
-----

В асме это выглядит так:

-------------
xor edx, edx
mov eax, $0000ffff

imul edx, eax
jnb +$5
call intover

mov ecx, eax
imul ecx, eax
jnb +$5
call Intover - вот здесь получает управление
----------

call IntOver это проверки на переполнение (Overflow checking). Так вот, на Size2:= (Wor2 * Wor2); вылетает с ошибкой "Integer overflow", если же отключить проверку на переполнение в опциях проекта, то естественно никакой ошибки не возникает.

Так вот в чем проблема? Может Delphi неправильный код генерирует? Ведь imul это операция умножения знаковых чисел, а у меня все обьявлено как Cardinal (то есть знаковое), в таком случае должна быть инструкция mul. Или я где-то накосячил и не вижу ошибки в исходнике?

Юзаю Delphi 7.2 SE



Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 19 ноября 2006 04:16
· Личное сообщение · #2

Теперь я точно уверен в ошибке, на других версиях Delphi генерируется инструкция MUL , а не IMUL, люди скинули скриншоты.

Отсюда вопрос, отчего это может зависеть? Может настройки какие в проекте? Или надо менять сам Delphi(что очень не хотелось бы)?




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 19 ноября 2006 06:02
· Личное сообщение · #3

IMUL - Integer (знаковое) multiplication
Mul - соответственно, беззнаковое.

Из хелпа Дельфина:
Cardinal 0..4294967295 unsigned 32-bit

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

У меня стоит Delphi 6, такая же фигня.
Посмотрел код в иде - вроде бы нигде в коде не используется mul.


Pluton пишет:
Или надо менять сам Delphi

Наверно это самый лучший выход



Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 19 ноября 2006 06:21
· Личное сообщение · #4

HoBleenHoBleen пишет:
У меня стоит Delphi 6, такая же фигня.
Посмотрел код в иде - вроде бы нигде в коде не используется mul.


То есть у тебя при выполнении данного кода также вылазит ошибка "Integer Overflow"?

Подтверди.


HoBleen пишет:
Посмотрел код в иде - вроде бы нигде в коде не используется mul.


Можно IDA не использовать, можно смотреть в самом Delphi по CTRL-ALT-C (когда остановишься по брейкпойнту)




Ранг: 299.6 (наставник)
Активность: 0.30
Статус: Участник
Armadillo Killer

Создано: 19 ноября 2006 06:52
· Личное сообщение · #5

Pluton На 7 Дельфе выглядит так

OllyDBG
XOR EDX,EDX
MOV EAX,0FFFF
IMUL EDX,EAX
MOV ECX,EAX
IMUL ECX,EAX
MOV EAX,ECX
CMP EDX,EAX
RETN

IDA
xor edx, edx
mov eax, 0FFFFh
imul edx, eax
mov ecx, eax
imul ecx, eax
mov eax, ecx
cmp edx, eax
retn



Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 19 ноября 2006 06:55
· Личное сообщение · #6

Все кто юзают up to Delphi 7 смотреть сюда - qc.borland.com/wc/qcmain.aspx?d=2571

Официальный фикс этой ошибки.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 19 ноября 2006 07:57
· Личное сообщение · #7

XOR EDX,EDX
MOV EAX,0FFFF
IMUL EDX,EAX
MOV ECX,EAX
IMUL ECX,EAX
MOV EAX,ECX
CMP EDX,EAX
RETN

Я не ставил проверку на переполнение, но флаг FO (переполнение) возводится.



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 19 ноября 2006 10:12
· Личное сообщение · #8

оффтоп
double пользуйте
/оффтоп

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 54.0 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 19 ноября 2006 11:47
· Личное сообщение · #9

AlexZ пишет:
double пользуйте

вместо cardinal? имхо, бред.
единственный путь - написать свое умножение, как на борланде и советуют.
второй вариант - править компилятор; не знаю, не пробовал.



Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 19 ноября 2006 12:22
· Личное сообщение · #10

n1kton1kto пишет:
вместо cardinal? имхо, бред.


Мне посоветовали вместо cardinal юзать int64 , что я и сделал.


 eXeL@B —› Основной форум —› Ошибка Delphi или что это?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати