asm x86 in msvc80: __asm idiv
От: Vain Россия google.ru
Дата: 30.09.06 18:54
Оценка:
__forceinline __int16 __fastcall DIViip(__int16 i,__int16 j,__int16& rem) {
  __int16 quot;
  __asm mov   ax,     word ptr [i];
  __asm cwd; // To avoid unhandled exception
  __asm idiv  j;
  __asm mov   ecx,    rem;
  __asm mov   word ptr [ecx],  dx;
  __asm mov   quot, ax;
  return quot;
}

void main() {
  __int16 rem;
  __int16 quot = DIViip(5,3,rem);
}


Никак немогу сообразить зачем перед idiv нужно ставить cwd..
Почему без cwd unhandled exception вылетает?
Процессор както заместо деббагера "отслеживает" непроинициализированность регистра edx?

PS: В книжке Зубкова про это не нашёл..
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: asm x86 in msvc80: __asm idiv
От: Аноним  
Дата: 30.09.06 19:09
Оценка:
Здравствуйте, Vain, Вы писали:

V>Никак немогу сообразить зачем перед idiv нужно ставить cwd..

V>Почему без cwd unhandled exception вылетает?
V>Процессор както заместо деббагера "отслеживает" непроинициализированность регистра edx?

V>PS: В книжке Зубкова про это не нашёл..

Посмотрите Intel IA-32 Command Reference для IDIV. Да, может вылетать по исключению #DE "If a positive result is greater than 7FFFH
or a negative result is less than 8000H" (из мануала).
Re[2]: asm x86 in msvc80: __asm idiv
От: Vain Россия google.ru
Дата: 30.09.06 19:32
Оценка:
Здравствуйте, Аноним, Вы писали:

V>>Никак немогу сообразить зачем перед idiv нужно ставить cwd..

V>>Почему без cwd unhandled exception вылетает?
V>>Процессор както заместо деббагера "отслеживает" непроинициализированность регистра edx?

V>>PS: В книжке Зубкова про это не нашёл..


А>Посмотрите Intel IA-32 Command Reference для IDIV. Да, может вылетать по исключению #DE "If a positive result is greater than 7FFFH

А>or a negative result is less than 8000H" (из мануала).

Да, но у меня вылетает даже если: DIViip(5,3,rem)
Т.е. даже если всё заведомо нормально.. (
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: asm x86 in msvc80: __asm idiv
От: Аноним  
Дата: 30.09.06 19:45
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, Аноним, Вы писали:


V>>>
V>>>__forceinline __int16 __fastcall DIViip(__int16 i,__int16 j,__int16& rem) {
V>>>  __int16 quot;
V>>>  __asm mov   ax,     word ptr [i];
V>>>  __asm cwd; // To avoid unhandled exception
V>>>  __asm idiv  j;
V>>>  __asm mov   ecx,    rem;
V>>>  __asm mov   word ptr [ecx],  dx;
V>>>  __asm mov   quot, ax;
V>>>  return quot;
V>>>}

V>>>void main() {
V>>>  __int16 rem;
V>>>  __int16 quot = DIViip(5,3,rem);
V>>>}
V>>>


V>>>Никак немогу сообразить зачем перед idiv нужно ставить cwd..

V>>>Почему без cwd unhandled exception вылетает?
V>>>Процессор както заместо деббагера "отслеживает" непроинициализированность регистра edx?

V>>>PS: В книжке Зубкова про это не нашёл..

А>>Посмотрите Intel IA-32 Command Reference для IDIV. Да, может вылетать по исключению #DE "If a positive result is greater than 7FFFH
А>>or a negative result is less than 8000H" (из мануала).
V>Да, но у меня вылетает даже если: DIViip(5,3,rem)
V>Т.е. даже если всё заведомо нормально.. (
Деление происходит пары DX:AX на аргумент. В том случае, если вы записываете 5 в AX, содержимое DX неизвестно. Т.е. при этом может возникнуть исключение. CWD же стоит, чтобы расширить число со знаком в AX до числа со знаком в DX:AX.
Re[4]: asm x86 in msvc80: __asm idiv
От: Vain Россия google.ru
Дата: 30.09.06 21:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Деление происходит пары DX:AX на аргумент. В том случае, если вы записываете 5 в AX, содержимое DX неизвестно. Т.е. при этом может возникнуть исключение. CWD же стоит, чтобы расширить число со знаком в AX до числа со знаком в DX:AX.

Хм.
В зубкове про idiv сказано следующее:

Выполняет целочисленной деление со знаком AL, AX или EAX (в зависмости от размера иточника) на источник (регистр или переменная) и помещает результат в AL, AX или EAX, а остаток — в AH, DX или EDX соответственно. ...

Наврано?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: asm x86 in msvc80: __asm idiv
От: Minstrell Россия  
Дата: 01.10.06 07:26
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, Аноним, Вы писали:


А>>Деление происходит пары DX:AX на аргумент. В том случае, если вы записываете 5 в AX, содержимое DX неизвестно. Т.е. при этом может возникнуть исключение. CWD же стоит, чтобы расширить число со знаком в AX до числа со знаком в DX:AX.

V>Хм.
V>В зубкове про idiv сказано следующее:
V>
V>Выполняет целочисленной деление со знаком AL, AX или EAX (в зависмости от размера иточника) на источник (регистр или переменная) и помещает результат в AL, AX или EAX, а остаток — в AH, DX или EDX соответственно. ...
V>

V>Наврано?
Недосказано. В общем CWD там нужна обязательно. Для положительных чисел попробуйте (конечно, это не универсально) заменить CWD на XOR DX,DX — должно работать без исключений. Для отрицательных — MOV DX,0FFFFh. Но собственно это и делает CWD. В Зубкове это пропущено... Скачайте родной мануал и используйте его.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.