деление

Тема в разделе "WASM.WIN32", создана пользователем sarmat, 30 янв 2006.

  1. sarmat

    sarmat New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    15
    Адрес:
    Russia
    А sub - это что не обнуление ?

    Вы мне предлагаете делить на 0 ?

    Делимое пишут в аккумулятор. Делитель в дополнительный регистр edx. Если я в него запишу 0, то и 21-го прерывания не надо или какого-нибудь еще. Капутер просто повиснет.

    Молодцы ребята, с юмором у вас все в порядке. Для КВН' а вполне годитесь. Вы еще предложите перед делением отформатировать винчестер. Шутки для детского сада. Ответа на вопрос не знаете, вот и шутите.
     
  2. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    ани тебе предлагают перечитать есчё раз тот топик
     
  3. sarmat

    sarmat New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    15
    Адрес:
    Russia
    Если вернешь назад, перечитаю.
     
  4. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    в едх - старшая часть делимого (или 0 если ее не должно быть)
     
  5. sarmat

    sarmat New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    15
    Адрес:
    Russia
    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);



    }
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    1.сначала суба я не видел

    2.
    Код (Text):
    1. sub edx,edx
    2. mov eax,133
    3. mov edx,3
    4. div edx
    5.  
    здесь что суб, что адд, что нег: все равно едх будет 3 ;)

    ====

    (перед делением в смысле)
     
  7. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Да, вот только другие функции меняющие edx могут не подойти. sub воздействует на флаги. хотя в данном примере sub явно не к месту.
     
  8. sarmat

    sarmat New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    15
    Адрес:
    Russia
    NullSessi0n

    Спасибо за участие в решении проблемы. Вчера я во всем разобрался. Программа у меня корректно работает с sub'ами. Дело не в них. В общем это видимо называется споткнуться на ровном месте. Но выяснилось следующее. В отличие от 16-разрядного варианта, когда делимое заносилось в младший байт аккумулятора al, а делитель - в младший байт дополнительного регистра данных dl и все прекрасно работало, в 32-разрядном варианте то же самое не получается. Достаточно было мне ничего не меняя в программе поменять строку div edx на строку div ebx как сразу все заработало и без проблем. Я сначала это проделал в консольном варианте, т.к. пытался исключить всякие мешающие факторы типа m_edit и пр. Любопытно, не правда ли ?
     
  9. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    нет, ты разобрался не до конца!

    делитель в dl - 8-разрядный, поэтому делимое автоматически ах, а вот если бы ты делил на dx в 16-разрядном варианте - получил бы ту же ошибку, так как когда делитель 16-разрядный - делимое: dx/ax.
     
  10. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Инструкция div edx всегда вызывает исключение деления. Дело в том, что операнд команды div - 64-битный неявный и располагается в edx:eax. Когда мы делим это 64-битное число на edx, то, если edx=0, то понятно, что происходит, а если edx!=0, то результат (edx*2^32 + eax)/edx оказывается >= 2^32 и не влезает в 32 бита, что тоже вызывает исключение деления на ноль. С div dx то же самое, кстати говоря.
     
  11. sarmat

    sarmat New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    15
    Адрес:
    Russia
    Shoo & diamond

    Спасибо за пояснение. Это конкретный ответ на мой конкретный вопрос.

    Где ж вы раньше были ? Но самые лучшие знания - те, которые добыл сам.