деление

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

  1. sarmat

    sarmat New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    15
    Адрес:
    Russia
    Не идет деление. Хотя точно такая же функция для умножения и проблем никаких. Закоментировано потому что пытался вводом конкретных чисел проверить. Значит проблема в написани лишь трех строк, выполняющих деление.

    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);



    }
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    DIV делит содержимое пары регистров edx:eax, поэтому возникает исключение #DE.



    А вообще-то смысла в __asm здесь никакого нет, чем обычное деление не устраивает?
     
  3. sarmat

    sarmat New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    15
    Адрес:
    Russia
    Это я знаю. При 16-ти разрядах делимое записывали в al, а не в весь ax. Здесь все примерно так же, только в два раза длиннее можно. Т.е. я должен записать делимое в AX, а не в EAX ? Как это правильно записать ?

    Поясню зачем. Я сделал весь пользовательский интерфейс в приложении VIsual C++. Вывод идет в окошко редактирования, ввод тоже через окно редактирования. Т.е. под наблюдением лишь процесс деления. Пробовал отдельно в консольном приложении и выяснил, что именно процесс деления неверно мною организован.
     
  4. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    void CAsm3Dlg::OnButton3()

    {



    int a,b,c,d;

    UpdateData(true);

    a=m_edit1;

    d=m_edit4;



    _asm{

    push eax

    push ebx

    push ecx

    push edi

    sub eax,eax

    sub ebx,ebx

    sub ecx,ecx

    sub edi,edi

    //mov eax,a

    mov eax,133

    //mov edi,d

    mov edi,3

    div edi Может кно-нибудь по делу подскажет ?

    mov a,eax

    pop edi

    pop ecx

    pop ebx

    pop eax

    }



    m_edit1=a;

    UpdateData(false);



    }
     
  5. sarmat

    sarmat New Member

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

    Если смеетесь, то зря. Мне на самом деле не понятно. Каазалось бы мелочь. Но деление это классика. Мне хотелось бы знать и знать наверняка.
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    sarmat

    Нужно обнулить edx и потом делить. Всё ото проделает и компилятор, если написать просто
    Код (Text):
    1.  
    2. unsigned a, d;
    3. ///
    4. m_edit1 = a / d;
     
  7. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    да нет не смеюсь



    дело в том что при делении регистр edx должен содержать 0!

    после деления там будет остаток!



    xor edx, edx

    div reg or mem



    тебе об этом сказал S_T_A_S_ но ты не понял вот я и поправил твой код чтоб работал )))
     
  8. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    sarmat



    Эй мужик не обижайся! но то что деление это классика пипец как смешно! )))
     
  9. sarmat

    sarmat New Member

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

    Можно классикой считать что-то иное. Об этом спорить не стану. Замена div edx на div ebx сразу устраняет все проблемы. Любопытно!

    И еще интересно какая организация владеет этим форумом (где сервер располагается ? )

    Если это большая тайна, то можете не открывать.