imul / mul?

Тема в разделе "WASM.RESEARCH", создана пользователем nickker, 21 ноя 2005.

  1. nickker

    nickker New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    1
    Уважаемые эксперты, доброго времени суток.



    Помогите пожалуйста разрешить такой вопрос: почему при перемножении в коде двух unsigned int'ов компилятор использует операцию imul, хотя по логике должна применятся операция умножения беззнаковых чисел mul? И как заставить его использовать mul?



    unsigned int a,b,c;



    BC 3.1:

    void main()

    {

    a=2;

    b=3;

    c=a*b;

    }



    Turbo Debugger:

    #INST_SET#10: a=2;

    cs:039D C706480F0200 mov word ptr [_a],0002

    #INST_SET#11: b=3;

    cs:03A3 C706460F0300 mov word ptr [_b],0003

    #INST_SET#12: c=a*b;

    cs:03A9 A1480F mov ax,[_a]

    cs:03AC F72E460F imul word ptr [_b]

    cs:03B0 A3440F mov [_c],ax



    Thanks anyway..
     
  2. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Результаты команд mul и imul различаются только старшим словом при умножении 16*16->32 или 32*32->64, а младшее слово одно и то же. Поэтому при умножении unsigned int c=a*b компилятор имеет полное право использовать любую из этих инструкций.

    При этом, вообще говоря, imul допускает более широкие возможности для задания операндов, поэтому вполне естественно всегда использовать imul.

    (В данном конкретном примере можно использовать и mul, и imul, при этом в ax после выполнения будет одно и то же, а вот dx будет различаться, но на него ANSI C забивает.)