Сейчас на форуме: Slinger (+6 невидимых) |
![]() |
eXeL@B —› Основной форум —› Ошибка Delphi или что это? |
Посл.ответ | Сообщение |
|
Создано: 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 ![]() |
|
Создано: 19 ноября 2006 04:16 · Личное сообщение · #2 |
|
Создано: 19 ноября 2006 06:02 · Личное сообщение · #3 IMUL - Integer (знаковое) multiplication Mul - соответственно, беззнаковое. Из хелпа Дельфина: Cardinal 0..4294967295 unsigned 32-bit Т.е., по идее, должно использоваться беззнаковое умножение (которое, к тому же, быстрее знакового). У меня стоит Delphi 6, такая же фигня. Посмотрел код в иде - вроде бы нигде в коде не используется mul. Pluton пишет: Или надо менять сам Delphi Наверно это самый лучший выход ![]() ![]() |
|
Создано: 19 ноября 2006 06:21 · Личное сообщение · #4 HoBleenHoBleen пишет: У меня стоит Delphi 6, такая же фигня. Посмотрел код в иде - вроде бы нигде в коде не используется mul. То есть у тебя при выполнении данного кода также вылазит ошибка "Integer Overflow"? Подтверди. HoBleen пишет: Посмотрел код в иде - вроде бы нигде в коде не используется mul. Можно IDA не использовать, можно смотреть в самом Delphi по CTRL-ALT-C (когда остановишься по брейкпойнту) ![]() |
|
Создано: 19 ноября 2006 06:52 · Личное сообщение · #5 |
|
Создано: 19 ноября 2006 06:55 · Личное сообщение · #6 |
|
Создано: 19 ноября 2006 07:57 · Личное сообщение · #7 |
|
Создано: 19 ноября 2006 10:12 · Личное сообщение · #8 |
|
Создано: 19 ноября 2006 11:47 · Личное сообщение · #9 |
|
Создано: 19 ноября 2006 12:22 · Личное сообщение · #10 |
![]() |
eXeL@B —› Основной форум —› Ошибка Delphi или что это? |