А sub - это что не обнуление ? Вы мне предлагаете делить на 0 ? Делимое пишут в аккумулятор. Делитель в дополнительный регистр edx. Если я в него запишу 0, то и 21-го прерывания не надо или какого-нибудь еще. Капутер просто повиснет. Молодцы ребята, с юмором у вас все в порядке. Для КВН' а вполне годитесь. Вы еще предложите перед делением отформатировать винчестер. Шутки для детского сада. Ответа на вопрос не знаете, вот и шутите.
shoo А что, sub уже для обнуления не годится ? Или вы это только xor' ом делаете ? void CAsm3Dlg::OnButton3() { int a,b,c,d; UpdateData(true); a=m_edit1; d=m_edit4; _asm{ push eax push ebx push ecx push edx sub eax,eax sub ebx,ebx sub ecx,ecx sub edx,edx //mov eax,a mov eax,133 //mov edx,d mov edx,3 div edx mov a,eax pop edx pop ecx pop ebx pop eax } m_edit1=a; UpdateData(false); }
1.сначала суба я не видел 2. Код (Text): sub edx,edx mov eax,133 mov edx,3 div edx здесь что суб, что адд, что нег: все равно едх будет 3 ==== (перед делением в смысле)
Да, вот только другие функции меняющие edx могут не подойти. sub воздействует на флаги. хотя в данном примере sub явно не к месту.
NullSessi0n Спасибо за участие в решении проблемы. Вчера я во всем разобрался. Программа у меня корректно работает с sub'ами. Дело не в них. В общем это видимо называется споткнуться на ровном месте. Но выяснилось следующее. В отличие от 16-разрядного варианта, когда делимое заносилось в младший байт аккумулятора al, а делитель - в младший байт дополнительного регистра данных dl и все прекрасно работало, в 32-разрядном варианте то же самое не получается. Достаточно было мне ничего не меняя в программе поменять строку div edx на строку div ebx как сразу все заработало и без проблем. Я сначала это проделал в консольном варианте, т.к. пытался исключить всякие мешающие факторы типа m_edit и пр. Любопытно, не правда ли ?
нет, ты разобрался не до конца! делитель в dl - 8-разрядный, поэтому делимое автоматически ах, а вот если бы ты делил на dx в 16-разрядном варианте - получил бы ту же ошибку, так как когда делитель 16-разрядный - делимое: dx/ax.
Инструкция div edx всегда вызывает исключение деления. Дело в том, что операнд команды div - 64-битный неявный и располагается в edx:eax. Когда мы делим это 64-битное число на edx, то, если edx=0, то понятно, что происходит, а если edx!=0, то результат (edx*2^32 + eax)/edx оказывается >= 2^32 и не влезает в 32 бита, что тоже вызывает исключение деления на ноль. С div dx то же самое, кстати говоря.
Shoo & diamond Спасибо за пояснение. Это конкретный ответ на мой конкретный вопрос. Где ж вы раньше были ? Но самые лучшие знания - те, которые добыл сам.